본문 바로가기
백준 문제풀이

[백준] 2231번 분해합 - Python(1편)

by arctis7p 2024. 12. 18.

문제 링크: 2231번: 분해합

아래는 문제 사진입니다.

더보기
백준 2231번 분해합 사진입니다.

 

이 문제를 일반적으로 풀어보고, 리스트 컴프리헨션으로 더 파이썬스럽게 수정하고, 마지막으로 제너레이터 표현식을 사용하여 더 간결한 코드로 만들어보겠습니다.

 

1. 일반코드

N = int(input()) 

for i in range(1, N+1): 
    digits = []	 
    num = i	 
    while num > 0: 
        digits.append(num % 10) 
        num //= 10 
    digits.reverse()   

    if i + sum(digits) == N:	 
        print(i) 
        break 
else:	 
    print(0)

1. i는 숫자이기 때문에 for문에서 구역 설정을 (1, N+1)로 했습니다.

2. i가 루프의 변수라서 변경하면 이상한 값이 나올 수 있기에 num = i로 만들었습니다.

3. digits 라는 리스트에 각 자릿수로 num을 저장합니다. 이 과정에서 num은 나눗셈 대입 연산자를 사용하여 한 자리씩 숫자가 줄어듭니다.

4. digits 리스트에 각 자릿수가 작은 순으로 정렬되어 있으므로 reverse로 재배열합니다.

5. if 문으로 맞는지 확인하고 맞으면 출력하고 break 합니다. 아닐 경우 for-else문을 사용해서 else 블록을 실행시킵니다.


 

2. 리스트 컴프리헨션을 사용한 코드

N = int(input()) 

for i in range(1, N+1): 
    digits = [int(d) for d in str(i)]
    if i + sum(digits) == N:
        print(i) 
        break 

else: 
    print(0)

1. digits라는 리스트에 i를 자릿수별로 넣습니다. 이 과정에서 i를 문자열로 바꾸는데 문자열을 iterable한 객체이기 때문입니다. 마지막에는 다시 int로 변경합니다.


 

3. 제너레이터 표현식을 사용한 코드

N = int(input())
for i in range(1, N+1):
    digits_sum = sum(int(digits) for digits in str(i))
    if digits_sum + i == N:
        print(i)
        break
else:
    print(0)

1. 리스트를 만들지 않고 바로 각 자릿수를 더합니다.