코테 노트/백준

백준 1039 교환 Python 3

화요밍 2022. 2. 9. 20:20
728x90
반응형

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

 

1039번: 교환

첫째 줄에 정수 N과 K가 주어진다. N은 1,000,000보다 작거나 같은 자연수이고, K는 10보다 작거나 같은 자연수이다.

www.acmicpc.net

 

 

GitHub - hwayeon351/BEAKJOON-Algorithms: 백준 알고리즘 소스 코드 모음

백준 알고리즘 소스 코드 모음. Contribute to hwayeon351/BEAKJOON-Algorithms development by creating an account on GitHub.

github.com

import sys
from collections import deque
def make_num():
    q = deque([[str(N), K]])
    visit = [[0]*1000001 for _ in range(K)]
    answer = -1
    while q:
        str_n, cnt = q.popleft()
        if cnt == 0:
            if answer < int(str_n): answer = int(str_n)
            continue
        for i in range(len(str_n)-1):
            for j in range(i+1, len(str_n)):
                if i == 0 and str_n[j] == '0': continue
                new_n = str_n[:i] + str_n[j] + str_n[i+1:j] + str_n[i] + str_n[j+1:]
                if not visit[cnt-1][int(new_n)]:
                    q.append([new_n, cnt-1])
                    visit[cnt-1][int(new_n)] = 1
    return answer

input = sys.stdin.readline
N, K = map(int, input().split())
print(make_num())

풀이 과정

풀이 시간 40분

import sys
from collections import deque
def make_num():
	#[문자열로 바꾼 N, 남은 횟수]
    q = deque([[str(N), K]])
    
    #visit[k][n] = 1 -> k번 숫자를 바꾸어 n이 만들어진 경우를 방문 처리
    visit = [[0]*1000001 for _ in range(K)]
    
    answer = -1
    
    while q:
        str_n, cnt = q.popleft()
        
        #K번 숫자를 바꾼 경우,
        if cnt == 0:
        	현재 숫자 n이 answer보다 큰 경우, answer을 갱신한다
            if answer < int(str_n): answer = int(str_n)
            continue
            
        #숫자 바꾸기 i < j
        for i in range(len(str_n)-1):
            for j in range(i+1, len(str_n)):
            	#i가 0번째 자릿수이면서 j번째 숫자가 0인 경우는 바꾸지 않는다
                if i == 0 and str_n[j] == '0': continue
                
                #i번째 숫자와 j번째 숫자를 바꾼 숫자 new_n
                new_n = str_n[:i] + str_n[j] + str_n[i+1:j] + str_n[i] + str_n[j+1:]
                if not visit[cnt-1][int(new_n)]:
                    q.append([new_n, cnt-1])
                    visit[cnt-1][int(new_n)] = 1
                    
    return answer

input = sys.stdin.readline
N, K = map(int, input().split())
print(make_num())

#시간복잡도 = O(V+E), 시간복잡도 = O(n)

 

728x90
반응형

'코테 노트 > 백준' 카테고리의 다른 글

백준 2644 촌수계산 Python 3  (0) 2022.02.10
백준 1525 퍼즐 Python 3  (0) 2022.02.10
백준 16397 탈출 Python 3  (0) 2022.02.09
백준 2206 벽 부수고 이동하기 Python 3  (0) 2022.02.08
백준 3055 탈출 Python 3  (0) 2022.02.08