문제 번호도 4자리 숫자이고 문제 제목도 4자리 숫자이니 뭔가 헷갈린다.
문제설명

제한사항 및 입출력


제한시간은 1초로 약 1억번의 연산 안에 정답을 도출하면 된다. 테스트 케이스의 개수가 20개까지 주어지고 각 테스트케이스마다 500만번의 연산을 넘기지 않으면 된다.
풀이
시간 복잡도가 굉장히 널널하기 때문에 각 4자리 숫자를 분리 후 최대, 최소로 재조립하여 빼주는걸 6174가 나올 때 까지 반복하는 방향으로 생각하였다.
내 코드
def find_minmax(num):
min_num_list = ['0', '0', '0', '0']
max_num_list = ['0', '0', '0', '0']
for i in range(4):
try:
min_num_list[i] = str(num)[i]
max_num_list[i] = str(num)[i]
except:
continue
min_num_list.sort()
max_num_list.sort(reverse= True)
for i in range(4):
min_num_list[i] = min_num_list[i]
max_num_list[i] = max_num_list[i]
min_num = int(''.join(min_num_list))
max_num = int(''.join(max_num_list))
return max_num - min_num
t = int(input())
for _ in range(t):
num = int(input())
cnt = 0
while num != 6174:
num = find_minmax(num)
cnt += 1
print(cnt)

고찰
처음엔 입력으로 무조건 4자리 숫자가 들어오는 것으로 생각하여 함수 내 인덱스 처리를 안일하게 했다가 틀렸다...
except로 4자리 숫자가 아닌 경우엔 건너뛰어주도록하여 해결했다.
* %00d 라는 자리수 포맷팅 기능을 다른 사람의 풀이에서 확인할 수 있었다!
적용해서 개선한 코드
t = int(input())
for _ in range(t):
num = int(input())
cnt = 0
while num != 6174:
s = "%04d" % num
num = int("".join(sorted(s, reverse=True))) - int("".join(sorted(s)))
cnt += 1
print(cnt)
'Computer Science > Problem Solving' 카테고리의 다른 글
| 백준 23326 - 홍익 투어리스트 (0) | 2025.08.19 |
|---|---|
| 백준 13265 - 색칠하기 (0) | 2025.08.18 |
| 백준 15973 - 두 박스 (0) | 2025.08.18 |
| 백준 19622 - 회의실 배정 3 (0) | 2025.08.17 |
| 프로그래머스 - 피로도 (0) | 2025.08.17 |