https://github.com/Dev-Guccin
Guccin
https://github.com/Dev-Guccin
전체 방문자
오늘
어제
  • 분류 전체보기 (172)
    • 알고리즘 (140)
    • 삽질방지 (13)
    • SystemHacking (1)
    • 일상 (4)
    • 개발 (8)
    • 스프링 부트 REST API 개발일지 (5)
    • JPA (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 최단경로
  • 다이나믹프로그래밍
  • 스택
  • 재귀함수
  • DFS
  • 이분탐색
  • LIS
  • 최대공약수
  • 프로그래머스
  • DP
  • 큐
  • 유니온 파인드
  • 다익스트라
  • 유클리드호제법
  • MST
  • 백트래킹
  • 그래프
  • 백준
  • 12015
  • 파이썬
  • counter
  • BFS
  • python3
  • Python
  • 재귀
  • heapq
  • 최소힙
  • 이분 탐색
  • 다이나믹 프로그래밍
  • 그리디

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
https://github.com/Dev-Guccin

Guccin

[python3] 백준 1039 (교환, BFS)
알고리즘

[python3] 백준 1039 (교환, BFS)

2022. 5. 22. 21:45

 

N값으로 값이 주어지는 경우 i 번째와 j 번째를 바꾸어 새로운 수를 만든다. 이때 K번 연산을 하여 나올 수 있는 최댓값을 구하면 된다.
N값은 1,000,000으로 값이 커보이지만 문자열 연산을 하기 때문에 긴 값은 아니다.
K값 또한 10으로 시간 복잡도상으로 큰 값이 아니다.
만약 2133이 존재할때
i=0, j=2로 하는 경우 3123이 된다.
i=0,j=3로 하는 경우 3132이 된다.
그렇다면 2133을 1번 변환하여 만들수 있는 최댓값은 3132이다. 
그러나 2133을 2번 변환하여 만들수 있는 값이 3321인데 3132로는 3321을 만들수 없다.
즉 K-1번의 결과값이 K번의 결과 값과는 상관이 없다.

 

따라서 모든 경우의 수를 탐색해야 K번 연산 했을때의 최댓값을 구할 수 있다.

그렇다면 완전탐색을 해야하는데 BFS를 사용하여 해당 값의 최댓값을 구할 수 있다. 그러나 중복이 존재할 수 있기 때문에 중복을 제거하기 위해 set을 사용해서 중복을 제거하면서 BFS를 K번만큼 진행하면 문제를 해결할 수 있다.

"""
데이터가 작고 K가 10 이하이므로
완탐으로 풀린다. 따라서 BFS로 매번 모든 경우를 찾고 해당 값 중에 가장 큰것을 선택하여 갱신
매번 최대를 구하는게 아니라 K번실행하는 경우의 최댓값을 구해야한다.
"""
from collections import deque

N, K = map(int, input().split())


def BFS(k, start):

    q = deque([start])
    count = 0

    while q:
        if count == k:  # K번 진행한 경우 해당 값들중에 최댓값을 반환한다.
            return max(q)
        setq = set()
        for _ in range(len(q)):
            target = q.popleft()
            target = list(str(target))
            for i in range(len(str(start))):
                for j in range(i+1, len(str(start))):
                    tmp = list(target)
                    tmp[i] = target[j]
                    tmp[j] = target[i]  # i,j값을 교환한다.
                    if tmp[0] == '0':  # 앞자리가 0인경우 값을 저장하지 않는다
                        continue
                    setq.add(int("".join(tmp)))  # set에 다음에 나올 수 있는 값을 저장한다.
        q += (list(setq))
        count += 1


tmp = BFS(K, N)
if tmp == None:
    print(-1)
else:
    print(tmp)
 

 

 
저작자표시 (새창열림)

'알고리즘' 카테고리의 다른 글

[python3] 백준 1099 (알 수 없는 문장, DP)  (0) 2022.06.15
[python3] 백준 7579 (앱 , DP)  (0) 2022.05.27
[python3] 백준 11000 (강의실 배정, 최소힙, 그리디)  (0) 2022.05.08
[python3] 백준 1991 (트리 순회, 트리, 재귀)  (0) 2022.03.26
[python3] 1167 풀이 (트리의 지름, 트리, DFS)  (0) 2022.03.25
    '알고리즘' 카테고리의 다른 글
    • [python3] 백준 1099 (알 수 없는 문장, DP)
    • [python3] 백준 7579 (앱 , DP)
    • [python3] 백준 11000 (강의실 배정, 최소힙, 그리디)
    • [python3] 백준 1991 (트리 순회, 트리, 재귀)
    https://github.com/Dev-Guccin
    https://github.com/Dev-Guccin
    https://github.com/Dev-Guccin

    티스토리툴바