프로그래밍/Python

📔파워 유저를 위한 파이썬 Express 07. Programming 문제풀이

카멜필름 2023. 5. 27. 22:48

01.

사용자로부터 정수 리스트를 받아서 정수 리스트에 있는 중복되 요소들을 제거하고 리스트를 정렬시키는 프로그램 작성하기

user = list(map(int, input("주어진 리스트: ").split()))

여기서 input() 함수로부터 사용자의 입력을 받고, split() 메서드를 사용하여 입력된 문자열을 공백을 기준으로 분리합니다. 그리고 map() 함수를 사용하여 분리된 각 요소를 int() 함수를 적용하여 정수로 변환합니다. 마지막으로 list() 함수를 사용하여 변환된 정수들로 이루어진 리스트를 생성합니다.

 

예를 들어, 사용자로부터 입력받은 "1 2 3 4 5"라는 문자열을 처리할 경우, split() 메서드에 의해 문자열이 공백을 기준으로 분리되어 ["1", "2", "3", "4", "5"] 리스트가 생성됩니다. 그리고 map(int, ...)을 통해 각 요소들이 정수로 변환되어 [1, 2, 3, 4, 5]라는 정수들로 이루어진 리스트 user가 생성됩니다.

 

이렇게 수정된 코드를 사용하면, 사용자로부터 여러 개의 숫자를 입력받아 리스트로 저장할 수 있습니다.

 

💡map()함수 역할

map() 함수는 파이썬 내장 함수로, 주어진 함수를 순회 가능한(iterable) 객체의 모든 요소에 적용하여 새로운 이터레이터(iterator)를 반환합니다. map() 함수는 일반적으로 함수를 여러 개의 데이터에 적용하고 싶을 때 사용됩니다.

map() 함수는 다음과 같은 구문으로 사용됩니다:

map(function, iterable)

여기서 function은 적용하고자 하는 함수를 나타내며, iterable은 함수를 적용할 순회 가능한 객체(리스트, 튜플, 문자열 등)입니다. map() 함수는 iterable의 각 요소에 function을 적용하고, 결과를 반환하는 이터레이터를 생성합니다.

예를 들어, 다음은 map() 함수를 사용하여 리스트의 각 요소에 제곱 연산을 적용하는 예시입니다:

numbers = [1, 2, 3, 4, 5]
squared = map(lambda x: x**2, numbers)
print(list(squared))  # 출력: [1, 4, 9, 16, 25]

위 예시에서 map(lambda x: x**2, numbers)는 numbers 리스트의 각 요소에 대해 x**2 연산을 적용하여 새로운 이터레이터를 생성합니다. 이후 list() 함수를 사용하여 이터레이터를 리스트로 변환하여 [1, 4, 9, 16, 25]라는 결과를 얻습니다.

map() 함수는 매우 유용하며, 함수를 적용해야 하는 여러 개의 데이터를 한 번에 처리할 수 있도록 도와줍니다.

 

  • sort : 정렬, 기본값은 오름차순 정렬, reverse옵션 True는 내림차순 정렬
  •  
>>> a = [1, 10, 5, 7, 6]
>>> a.sort()
>>> a
[1, 5, 6, 7, 10]
>>> a = [1, 10, 5, 7, 6]
>>> a.sort(reverse=True)
>>> a
[10, 7, 6, 5, 1]

05.

'int' object is not callable

예약어를 변수명으로 사용할 때 발생하는 오류

 

del sum

06.

💡enumerate()란?

enumerate()는 파이썬의 내장 함수로, iterable한 데이터(리스트, 튜플, 문자열 등)를 인자로 받아서, 각 요소와 그에 해당하는 인덱스를 포함하는 enumerate 객체를 반환합니다. 이 객체는 주로 for 문에서 사용되며, 요소와 그에 해당하는 인덱스를 동시에 가져오는데 유용합니다.

기본적인 사용 방법은 다음과 같습니다:

for i, value in enumerate(my_list):
    print(f"Index: {i}, Value: {value}")

여기서 my_list는 enumerate 함수에 전달된 리스트이며, i는 각 요소의 인덱스를, value는 각 요소의 값을 나타냅니다.

예를 들어, 다음과 같은 리스트가 있다고 가정해 봅시다:

fruits = ["apple", "banana", "cherry"]

enumerate 함수를 사용하면 다음과 같이 출력할 수 있습니다:

for i, fruit in enumerate(fruits):
    print(f"Index: {i}, Fruit: {fruit}")

위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다:

Index: 0, Fruit: apple
Index: 1, Fruit: banana
Index: 2, Fruit: cherry

즉, enumerate 함수를 사용하면 각 요소와 그 요소의 인덱스를 동시에 쉽게 얻을 수 있습니다.

 

enumerate() 함수 구조

enumerate(iterable, start=0)

여기서,

  • iterable은 순회할 수 있는 자료구조(리스트, 튜플, 문자열 등)를 말합니다.
  • start는 인덱스의 시작 숫자를 지정하며, 기본값은 0입니다.

enumerate() 함수는 인덱스와 해당 인덱스의 요소를 함께 반환합니다. 이를 통해 for 루프에서 현재 요소의 인덱스를 쉽게 알 수 있습니다. 예를 들어:

fruits = ['apple', 'banana', 'mango']
for i, fruit in enumerate(fruits):
    print(f"The fruit at index {i} is {fruit}.")

위 코드를 실행하면, 각 과일과 그에 해당하는 인덱스가 함께 출력됩니다.


11.

정답코드

import random

problems={"파이썬": "최근에 가장 떠오르는 프로그래밍 언어","변수":"데이터를 저장하는 메모리 공간", "함수":"작업을 수행하는 문장들의 집합에 이름을 붙인것",
          "리스트": "서로 관련이 없는 항목들의 모임",}

items = list(problems.items())
random.shuffle(items)

for key,value in items:
  user=input(f"다음은 어떤 단어에 대한 설명일까요?\n\"{value}\"\n(1)파이썬 (2)변수 (3)함수 (4)리스트")
  if user==key:
    print("정답입니다.!")
  else:
    print("오답입니다.!")

⚡응용: 문제를 랜덤하게 나오게 하기

문제가 랜덤으로 나오게 하려면 random 모듈의 shuffle 함수를 사용하면 됩니다. 이 함수는 주어진 리스트를 랜덤하게 섞어줍니다. 문제를 랜덤하게 섞기 위해 problems.items()를 리스트로 변환하고 shuffle 함수를 적용할 수 있습니다.

아래는 코드에 대한 예시입니다:

 

import random

problems={"파이썬": "최근에 가장 떠오르는 프로그래밍 언어","변수":"데이터를 저장하는 메모리 공간", "함수":"작업을 수행하는 문장들의 집합에 이름을 붙인것",
          "리스트": "서로 관련이 없는 항목들의 모임",}

items = list(problems.items())
random.shuffle(items)

for key,value in items:
  user=input(f"다음은 어떤 단어에 대한 설명일까요?\n\"{value}\"\n(1)파이썬 (2)변수 (3)함수 (4)리스트")
  if user==key:
    print("정답입니다.!")
  else:
    print("오답입니다.!")

위 코드는 problems 딕셔너리의 키-값 쌍을 리스트로 만든 다음 랜덤하게 섞어줍니다. 그런 다음 이 리스트를 순회하면서 사용자에게 각 문제를 제시합니다. 이렇게 하면 문제가 랜덤하게 제시됩니다.

 


12.

TypeError: 'in <string>' requires string as left operand, not list

 

이 오류 메시지는 일반적으로 문자열에 리스트를 사용하여 연산을 수행하려고 시도할 때 발생합니다. in 키워드는 문자열 내에서 문자열을 검색할 때 사용됩니다. 그러나 왼쪽 피연산자가 리스트일 경우 이 오류가 발생합니다.

예를 들면, 아래의 코드는 오류를 발생시킵니다:

 

list_a = ['a', 'b', 'c']
if list_a in 'abc':
    print("Found!")

위 코드는 'a' in 'abc'와 같은 문자열 내 문자열 검색을 시도하려는 것이 아니라, 리스트 ['a', 'b', 'c']가 문자열 'abc' 내에 있는지를 검사하려 하므로 오류가 발생합니다.

리스트 내의 각 요소가 문자열 내에 있는지 검사하려면 for 루프를 사용하여 각 요소에 대해 검사를 수행해야 합니다:

list_a = ['a', 'b', 'c']
for char in list_a:
    if char in 'abc':
        print(f"Found {char}!")

 

TypeError: list indices must be integers or slices, not str

 

"TypeError: list indices must be integers or slices, not str" 오류는 일반적으로 리스트의 인덱스로 문자열을 사용하려 할 때 발생합니다. 리스트의 인덱스는 정수나 슬라이스(slices) 형태로 사용해야 합니다.

예를 들어, 다음 코드는 이 오류를 발생시킵니다.

my_list = ["apple", "banana", "cherry"]
print(my_list["banana"])  # 오류 발생! 인덱스는 정수여야 합니다.

위 코드에서, "banana"라는 문자열을 인덱스로 사용하려 했기 때문에 오류가 발생했습니다. 리스트의 인덱스는 정수여야 하므로, 위 코드를 고치려면 다음과 같이 작성해야 합니다.

 

my_list = ["apple", "banana", "cherry"]
print(my_list[1])  # 출력: "banana"

 

파이썬에서 for 루프를 사용하여 리스트를 순회할 때, 루프 변수는 리스트의 각 요소를 직접 참조합니다. 예를 들어, for i in some_list: 구문에서 i는 some_list의 각 요소를 참조하게 됩니다. 이렇게 하면 i를 인덱스로 사용하여 some_list[i]로 접근할 필요가 없습니다.

 

만약 i를 인덱스로 사용하려면 range(len(some_list))를 사용하여 리스트의 인덱스를 순회해야 합니다. 예를 들어, for i in range(len(some_list)):에서 i는 some_list의 인덱스를 참조하며, 이 경우 some_list[i]는 리스트의 i번째 요소를 참조하게 됩니다.

 

따라서, 코드에서 for i in sentence:와 for j in forbid:에서 i와 j는 각각 sentence와 forbid 리스트의 각 요소를 직접 참조하므로, sentence[i] 또는 forbid[j]라고 작성하면 오류가 발생합니다. 이를 바로잡으려면 if i == j: 처럼 i와 j를 직접 비교해야 합니다.

 

 


14.

💡zfill()함수

zfill() 메서드는 문자열의 왼쪽에 지정된 길이만큼 0을 추가하여 문자열의 자릿수를 맞춰주는 역할을 합니다.

예를 들어, 다음과 같은 코드를 실행해보겠습니다:

number = "7"
padded_number = number.zfill(3)
print(padded_number)

위 코드에서 number 변수에는 "7"이라는 문자열이 저장되어 있습니다. zfill(3)은 number 문자열의 왼쪽에 0을 추가하여 전체 길이가 3이 되도록 만들어줍니다. 따라서 출력 결과는 "007"이 됩니다.

zfill() 메서드는 문자열이 지정된 길이보다 짧을 경우에만 0을 추가합니다. 문자열의 길이가 이미 지정된 길이보다 길다면 원본 문자열을 그대로 반환합니다.

zfill() 메서드는 주로 숫자 형식의 문자열을 정해진 자릿수로 표현하거나, 파일 이름 등을 특정 자릿수로 맞추는 데 사용될 수 있습니다.

 

정답코드

date=input("날짜를 입력하세요 (MM/DD/YYYY): ")
month, day, year=date.split("/")
formatted_date=year+month.zfill(2)+day.zfill(2)
print(formatted_date)

위의 코드는 입력된 날짜를 "/"를 기준으로 분리한 후, year, month, day 변수에 할당합니다. 그리고 formatted_date 변수에 year + month.zfill(2) + day.zfill(2)를 이용하여 "YYYYMMDD" 형식으로 변환합니다. zfill(2) 함수는 문자열의 왼쪽에 0을 추가하여 자릿수를 맞춰줍니다. 이렇게 하면 1월부터 9월까지의 월과 1일부터 9일까지의 일도 두 자리로 표현됩니다.

예를 들어, "05/21/2020"을 입력하면 "20200521"이 출력됩니다.

 


16.

 

🤨처음 코드

import random

s="abcdefghijklmnopqrstuvwxy01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()"
special_characters = '!@#$%^&*()'
number=''.join([char for char in s if char.isdigit()])
passlen=8
large=random.sample(s.upper(), 1)
small=random.sample(s.lower(), 1)
num=random.sample(number,1)
special=random.sample(special_characters,1)
password=large+small+num+special+random.sample(s, passlen-4)
print(password)
password=random.shuffle(password)
print(password)

이렇게 작성하면 None이 나옴

그 이유는

random.shuffle() 함수는 원본 리스트를 무작위로 섞는 역할을 합니다. random.shuffle() 함수는 원본 리스트를 직접 변경하고, 반환 값은 None입니다. 따라서 password 리스트를 섞은 후에 print(password)를 호출하면 None이 출력됩니다.

원하는 결과를 얻기 위해서는 random.shuffle() 함수를 사용한 후에 password 리스트를 출력하는 것이 아니라, 그냥 password 리스트를 출력해야 합니다. 아래는 수정된 코드입니다:

 

🙂수정된 코드

import random

s = "abcdefghijklmnopqrstuvwxy01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()"
special_characters = '!@#$%^&*()'
number = ''.join([char for char in s if char.isdigit()])
passlen = 8

large = random.sample(s.upper(), 1)
small = random.sample(s.lower(), 1)
num = random.sample(number, 1)
special = random.sample(special_characters, 1)
password = large + small + num + special + random.sample(s, passlen - 4)
random.shuffle(password)

print(password)

위 코드에서 random.shuffle(password)를 사용하여 password 리스트를 섞고, 그 이후에 print(password)를 호출하여 섞인 password 리스트를 출력합니다. 이렇게 수정하면 None이 출력되지 않고, 섞인 password 리스트가 출력됩니다.

 

 

 

 

 

 

728x90
LIST