hyei-devlog

[Python/파이썬] 백준 1284 집 주소 본문

Online Judge/Baekjoon

[Python/파이썬] 백준 1284 집 주소

winter126 2025. 1. 27. 02:50

📍 문제

https://www.acmicpc.net/problem/1284

 

 

📍 전체 코드

while(1):
    user_input = int(input())
    if user_input == 0: 
        break

    result = 0
    num_list = list(map(int, str(user_input)))
    for n in num_list:
        if n == 0:
            result += 4
        elif n == 1:
            result += 2
        else:
            result += 3
    result += (len(num_list) - 1) + 2
    print(result)

 

 

📍 문제 풀이

문제에서 요구한 조건 3가지
 
1. 0은 4cm, 1은 2cm, 0과 1을 제외한 나머지 숫자는 3cm의 자리를 차지한다.
2. 각 숫자 사이에는 1cm의 여백이 들어간다. 
3. 호수판과 숫자 사이에는 1cm의 여백이 들어간다. 
 
1번 조건

for n in num_list:
    if n == 0:
        result += 4
    elif n == 1:
        result += 2
    else:
        result += 3

 
2번 조건: 리스트 전체 길이에서 - 1한 만큼의 여백이 들어간다.
3번 조건: 양끝에 여백이 들어가므로, 항상 2cm의 여백이 들어간다.

result += (len(num_list) - 1) + 2

 
 

📍 문제 해결을 위한 고민

입력받은 정수를 한자리씩 리스트로 만드는 방법에 대해 고민했다.
 

num_list = list(map(int, input()))

 
이렇게 입력 받으려고 했는데, 0을 입력 받기 전까지 계속해서 입력을 받아야 하는 조건을 수행하기 위해,

user_input = int(input())
if user_input == 0:
    break
num_list = list(map(int, str(user_input)))

 
이렇게 수정했다.
위와 같이 코드를 작성하면 입력값을 한 문자씩 나누고 각 문자를 정수로 변환하여 리스트(num_list)로 저장할 수 있다.
 
 

✔️ 이 부분에 대해 자세히 알아보자!

num_list = list(map(int, str(user_input)))

 
1. 입력받은 user_input은 정수이다. 이 값을 str() 함수로 감싸면 정수가 문자열로 변환된다.
2. map() 함수는 첫 번째 인자로 주어진 함수를 두 번째 인자로 주어진 iterable(반복 가능한 객체)에 적용하는 함수이다.
str(user_input)은 반복 가능한 객체이므로, 이곳에 map()을 적용할 수 있다.
즉, "120"이라는 문자열에 int를 map()으로 적용하면, 각 문자에 대해 int() 함수가 적용되어 각각의 문자 '1', '2', '0'을 정수 1, 2, 0으로 변환하게 된다.
3. map() 함수는 결과를 이터러블 객체로 반환한다. list() 함수를 사용하여 결과를 리스트 형태로 변환했다.
 
 

‼️ 이렇게 적으면 오류가 난다 1

num_list = list(map(int, user_input))

 
map() 함수는 이터러블 객체(반복 가능한 객체)를 대상으로 작동하는데, 정수는 반복 가능한 객체가 아니므로 map() 함수는 TypeError를 발생시킨다. 

 
‼️ 이렇게 적으면 오류가 난다 2

list(user_input)

 
list() 함수는 이터러블 객체(반복 가능한 객체)를 입력받아 각 요소를 분리해서 리스트로 만든다. 그러나 정수는 반복 가능한 객체가 아니기 때문에 list()로 바로 변환할 수 없으며, TypeError가 발생한다.
 
 

⭐️ 중요 포인트 & 개념 정리

list(): 이터러블 객체를 입력받아 각 요소를 분리하여 리스트로 변환한다. 정수는 반복 불가능하므로 list()로 바로 변환할 수 없다.
map(): 이터러블 객체에 주어진 함수를 적용하여 그 결과를 반환한다.


 
1. 이터러블 객체란?
이터러블 객체는 __iter__() 메서드를 구현한 객체이다. __iter__() 메서드는 반복 가능한 항목을 하나씩 반환할 수 있게 하는 역할을 한다.
이 메서드가 구현되어 있는 객체는 for 문 등에서 반복할 수 있다.
 
즉, 이터러블 객체는 반복문(for)에서 사용할 수 있는 객체이다.
 
2. 이터러블 객체의 예시
파이썬에서 이터러블 객체는 다음과 같은 자료형을 포함한다.

  • 리스트 (list)
  • 튜플 (tuple)
  • 셋 (set)
  • 딕셔너리 (dictionary)
  • 문자열 (string)
  • 파일 객체 (file objects)
  • range 객체 (range)

이 외에도, __iter__() 또는 __getitem__()을 구현한 클래스들도 이터러블 객체가 될 수 있다.
 
3. 이터러블 객체와 이터레이터 객체의 차이

  • 이터러블 객체(Iterable): 이 객체 자체는 반복할 수 있는 자료형으로, 내부에 __iter__() 메서드를 포함하고 있다. 예를 들어, 리스트나 문자열 등이 이터러블 객체이다.
  • 이터레이터 객체(Iterator): 이 객체는 이터러블 객체에서 반복 가능한 항목을 하나씩 반환하는 객체이다. __iter__() 메서드와 __next__() 메서드를 구현한 객체이다. __next__()를 호출하면 하나씩 요소를 반환한다.

4. 이터러블 객체의 특징

  • 반복문(for loop)에서 하나씩 꺼낼 수 있다.
  • iter()를 사용하여 이터레이터로 변환할 수 있다.
  • next()를 사용하여 이터레이터에서 요소를 하나씩 꺼낼 수 있다.

5. iter()와 next() 함수

  • iter(): 이 함수는 이터러블 객체를 이터레이터 객체로 변환한다다. 즉, iter()를 호출하면, 해당 객체는 이터레이터 객체로 바뀌고, 그 이후에 next()를 사용하여 항목을 하나씩 꺼낼 수 있다.
  • next(): 이 함수는 이터레이터 객체에서 다음 요소를 반환한다. 만약 요소가 없다면 StopIteration 예외를 발생시킨다.
# 리스트는 이터러블 객체
numbers = [1, 2, 3]

# 이터러블 객체를 이터레이터 객체로 변환
iterator = iter(numbers)

# 이터레이터에서 하나씩 꺼내기
print(next(iterator))  # 1
print(next(iterator))  # 2
print(next(iterator))  # 3

# 다음 항목이 없으면 StopIteration 예외가 발생
# print(next(iterator))  # StopIteration
 

6. 이터러블 객체의 활용
이터러블 객체는 반복문(for)을 통해 손쉽게 처리할 수 있다.
파이썬에서 이터러블 객체를 반복할 때, 내부적으로 iter()와 next()가 자동으로 호출된다.

numbers = [1, 2, 3]

# 이터러블 객체를 for문으로 처리
for num in numbers:
    print(num)