1039.교환

2024. 5. 19. 15:22Programmers

728x90

테스트 코드는 모두 통과했으나 , 반례를 못찾아서 풀지 못한 문제다..

# 무조건 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