-
1039.교환Programmers 2024. 5. 19. 15:22728x90
테스트 코드는 모두 통과했으나 , 반례를 못찾아서 풀지 못한 문제다..
# 무조건 k번 수행해야 함 # input : n, k / output : k번 바꾸어 나올 수 있는 최댓값 n, k = input().split() number = list(n) k = int(k) # 자릿수가 1자리이거나, 뒷자리에 0만 포함되어 있을 시 if len(number) == 1 or set(number) == {number[0], '0'}: result = -1 print(result) else: idx = 0 # 1~i 내림차순 진행 # i~k 내림차순으로 정렬되어 있을 경우, 남은 횟수(k-i)만큼 가장 작은 두 수끼리 교환 while (idx < len(number)-1) and (k > 0): max_idx = idx max_num = number[idx] for j in range(idx+1, len(number)): # 최댓값 찾기 if number[j] >= max_num: max_num = number[j] max_idx = j if max_idx == idx: if idx < len(number) - 1: idx += 1 else: # 최댓값과 자리 바꾸기 number[idx], number[max_idx] = number[max_idx] , number[idx] k -= 1 idx += 1 if k > 0 and k%2 == 1: number[-1], number[-2] = number[-2], number[-1] result = int(''.join(number)) print(result)
무조건 내림차순으로 정렬해야 하는것이 아니라, k번 내로 어떤 경로로든 자리 간 변경을 하면서 k번 변경했을 시 나올 수 있는 최댓값을 구해야 하는 문제이므로 이 접근법은 잘못되었다.
# 교환 from collections import deque N, K = map(int, input().split()) M = len(str(N)) def bfs(N, K): visited = set() visited.add((N, 0)) q = deque() q.append((N, 0)) answer = 0 while q: n, k = q.popleft() if k == K: answer = max(answer, n) continue n = list(str(n)) for i in range(M-1): for j in range(i+1, M): if i == 0 and n[j] == '0': continue n[i], n[j] = n[j], n[i] nn = int(''.join(n)) if (nn, k+1) not in visited: q.append((nn, k+1)) visited.add((nn, k+1)) n[i], n[j] = n[j], n[i] return answer if answer else -1 print(bfs(N, K))
k번 변경했을 때의 모든 경우의 수를 BFS 방법으로 접근하여, k == K 일 때 최댓값을 갖는 Answer를 출력하는 코드이다.
728x90'Programmers' 카테고리의 다른 글
14503. 로봇 청소기 (0) 2024.04.21 9205.맥주 마시면서 걸어가기 (0) 2024.04.20 2468. 안전영역 (0) 2024.04.18 [2644]촌수 계산 (0) 2024.04.10 [SQL] 노선별 평균 역 사이 거리 조회하기 (0) 2024.03.10