문제정수를 십진수로 표현할 때, 각 자리수가 왼쪽에서 오른쪽으로 감소하는 줄어드는 수 중 n번째로 작은 줄어드는 수를 구하는 문제이다.예를 들어 54321나 654는 줄어드는 수이며, 544나 324은 줄어드는 수가 아니다. 풀이BFS로 n번째 작은 수까지의 모든 경우의 수를 찾아 정답을 도출 할 수 있다.BFS를 사용하는 이유는 작은 수부터 순차적으로 줄어드는 수를 생성하므로, 추가적인 정렬 없이도 오름차순으로 n번째 줄어드는 수를 찾을 수 있기 때문이다.먼저 한 자리수 (0~9)를 큐에 넣는다.큐에서 줄어드는 수를 꺼내어 해당 숫자가 n번째 줄어드는 수라면 탐색을 멈추고 결과를 반환한다.아니라면, 1의 자리보다 작은 숫자를 뒤에 추가해 새로운 줄어드는 수를 생성한다.만약 n번째 줄어드는 수가 없다면 ..
문제게임 보드 위의 숫자에 따라 동전을 이동시킬 때, 동전을 움직이는 횟수가 최대가 되도록 하는 문제이다.보드 위의 숫자는 1부터 9까지 있으며, 해당 칸에서 다음 칸으로 이동할 때 표기된 숫자만큼 한 번에 이동해야 한다.동전은 상하좌우로 이동할 수 있고, H(구멍) 칸이나 보드 바깥으로 이동되면 게임이 종료된다.풀이이 문제에서는 깊이 우선 탐색(DFS)과 메모이제이션, 백트래킹을 사용해 풀 수 있다.재귀적으로 DFS를 사용해서 동전이 이동할 수 있는 모든 경로를 탐색한다.메모이제이션 DFS 탐색을 하면서 특정 칸에 대한 경로 탐색이 끝나면, 그 칸에서 최대 이동 횟수를 계산한 상태이다.따라서 중복 탐색을 방지하기 위해, 계산된 값을 메모이제이션을 통해 저장한다.탐색 도중 이미 계산된 값( dp[x][y..
문제주어진 격자 데이터의 전후를 비교하여 주입된 백신이 CPCU-1202 백신인지 판단하는 문제이다.CPCU-1202 백신을 놓으면, 백신이 주입된 조직에서 항체를 생성하고 같은 영역의 조직에 항체가 퍼진다.항체는 조직을 변형시켜 동일한 색상이거나 다른 색상이 될 수 있다. 풀이전체 조직의 영역들 중 색상이 바뀐 영역이 1개이하여야 한다.따라서 조직을 탐색하면서 동일한 영역이 변경된 것인지를 판단하고, 색상이 변경된 영역의 개수를 세어야 한다.BFS나 DFS를 통해 동일한 색상으로 이루어진 인접 영역을 탐색하며 해당 영역이 일관된 색상으로 변경되었는지 확인한다.탐색 중 영역이 다르다면 CPCU-1202 백신이 아님으로 NO를 출력하고,색상이 변경된 영역의 개수가 2개이상이어도 NO를 출력하며,그 외의 경..
문제통로에 음식물 쓰레기가 떨어져 있을 때, 인접한 쓰레기들끼리 하나의 덩어리로 보고 그중 가장 큰 덩어리의 크기를 구하는 문제이다. 인접한 음식물 쓰레기는 상하좌우로 붙어있는 경우를 말한다.풀이이 문제는 인접한 영역을 탐색하는 그래프 탐색 문제이다.BFS나 DFS를 활용해 연결 여부를 탐색하며 덩어리의 크기를 계산하면 된다.먼저 음식물 쓰레기의 영역을 입력받는다.이때, 쓰레기가 없는 상태는 1, 쓰레기가 있는 상태는 0으로 표시한다. (visited를 사용하지 않고 쓰레기가 있는 곳의 방문 여부를 쉽게 체크할 수 있다.)인접 칸을 탐색했을 때, 다음칸으로 이동 가능하면 쓰레기 영역 크기를 늘리고 방문 표시를 해준다.max를 사용해 가장 큰 쓰레기 크기를 갱신한다.Python 코드import sysfro..
문제트리는 사이클이 없는 무방향 그래프이며, 두 노드 사이의 경로가 항상 하나만 존재한다.두 노드를 선택하여 양쪽으로 쫙 당길 때, 가장 길게 늘어나는 경우를 트리의 지름이라고 한다.입력으로는 루트가 있는 가중치가 있는 간선들로 이루어진 트리가 주어지며, 트리의 지름을 구하는 프로그램을 작성해야 합니다.풀이트리의 지름을 찾기 위해 DFS를 활용한다.트리의 임의의 노드 $x$를 기준으로 잡는다.노드 $x$로부터 노드 간 거리를 DFS를 통해 구하고, 거리가 가장 먼 노드 $y$를 찾는다.노드 $y$를 기준으로 노드 간 거리를 다시 구한다.거리가 가장 먼 노드 $z$를 찾는다. 노드 $y$와 노드$z$ 사이의 거리가 트리의 지름이다. (가장 큰 값을 출력하면 된다.)◆ 트리의 지름 증명트리의 지름 양쪽 끝 ..
문제 n개의 보석의 무게(m)와 가격(v) 정보가 주어지고, m개의 가방이 최대 담을 수 있는 무게(c) 정보가 주어졌을 때, 가질 수 있는 보석의 최대 가격을 구하는 문제이다. 이때 한 개의 가방에는 한 개의 보석만 넣을 수 있다. 풀이 우선순위 큐를 사용하여 문제를 풀 수 있다. 보석과 가방의 무게를 비교하고 담을 수 있는 보석이라면 가장 큰 가격의 보석을 담도록 하는 것이다. 먼저 보석의 정보를 얻을 때, 같은 무게를 가진 보석이 다수 존재할 수 있음으로 딕셔너리 자료구조에 담는다. 딕셔너리로 관리하는 것이 메모리가 조금 늘지만 더 빠른 속도를 보여준다. 한 개의 가방에는 한 개의 보석만 들어가기 때문에 보석의 최대 무개(1000000)와 비교해서 넘어가는 것은 최대 무게로 대체한다. 보석의 무게가..
문제11개의 각 포지션마다 가치가 가장 높은 선수를 뽑아 팀을 구성했을 때, k 년 뒤에 뽑힌 선수들의 가치의 합을 구하는 문제이다.포지션에 해당하는 선수가 없다면 공석으로 두며,8월에 뽑힌 선수들에 한해서 가치가 1씩 감소하고, 가치는 0보다 작아지진 않는다.11월에 다시 가치가 높은 선수들을 뽑은 뒤, 12월에 선수들의 가치의 합을 측정한다.풀이heap을 사용하여 각 포지션마다 가장 큰 가치를 쉽게 뽑아낼 수 있다.heapq는 가장 작은 숫자를 0번째 인덱스에 저장하는 특징을 갖고 있다. 따라서 가치를 음수로 넣어 가장 큰 수를 쉽게 얻을 수 있다.포지션에 따른 선수 정보를 입력한다.빈 포지션이 있을 수 있음으로 0으로 초기화를 한다.heapq를 사용하여 선수의 가치를 음수로 저장한다.8월에는 가치가..