본문 바로가기

Coding Test

(27)
[백준/Python] 13023 ABCDE 문제 링크 13023번: ABCDE 문제의 조건에 맞는 A, B, C, D, E가 존재하면 1을 없으면 0을 출력한다. www.acmicpc.net 문제 풀이 5명이 한 번에 연결되어 있다면 1을 출력, 아니면 0을 출력한다. 리스트 안의 값을 처음부터 반복문을 돌리면서 탐색한다. 만약 깊이 우선 탐색을 진행하다가 더 이상 진행할 수 없을 때는 다시 돌아와야 하므로, 기존 방문했던 값을 다시 False로 바꿔야 한다. 전체 코드 import sys sys.setrecursionlimit(10 ** 7) def dfs(s, v, c): global res v[s] = True if c == 5: res = 1 return for i in arr[s]: if not v[i]: dfs(i, v, c+1) v[..
[백준/Python] 1021 회전하는 큐 문제 링크 1021번: 회전하는 큐 첫째 줄에 큐의 크기 N과 뽑아내려고 하는 수의 개수 M이 주어진다. N은 50보다 작거나 같은 자연수이고, M은 N보다 작거나 같은 자연수이다. 둘째 줄에는 지민이가 뽑아내려고 하는 수의 위치가 www.acmicpc.net 문제 풀이 큐의 맨 앞의 숫자가 현재 뽑고자 하는 숫자가 일치할 때까지 큐를 왼쪽, 오른쪽으로 돌려야(rotate) 한다. 만약 큐의 맨 앞의 숫자가 일치한다면 큐를 제거하고(popleft), 그렇지 않다면 어느 방향으로 돌릴 것인지를 정해야 한다. 이때, 뽑고자 하는 숫자의 위치가 중간 위치랑 같거나 작다면 왼쪽으로 로테이션하고, 그보다 크다면 오른쪽으로 로테이션을 해야 값이 최소가 된다. 전체 코드 import sys from collectio..
[백준/Python] 16564 히오스 프로게이머 문제 링크 16564번: 히오스 프로게이머 첫째 줄에는 캐릭터의 개수 N, 올릴 수 있는 레벨 총합 K가 주어진다. (1 ≤ N ≤1,000,000, 1 ≤ K ≤ 1,000,000,000) 다음 N개의 줄에는 현재 각 캐릭터의 레벨이 X1, X2, X3, ... , Xn 으로 주어진다. (1 ≤ Xi ≤ www.acmicpc.net 문제 풀이 일반적인 이분 탐색 문제이다. 여기서 주의해야 할 점은 end 값 설정이다. 만약 캐릭터 레벨의 총합(sum(arr))보다 k가 무수히 크다면 end 값은 단순히 총합이 아닌 총합과 k를 더한 값이 되어야 한다. 전체 코드 import sys n, k = map(int, sys.stdin.readline().split()) arr = [int(sys.stdin.r..
[백준/Python] 2589 보물섬 문제 링크 2589번: 보물섬 첫째 줄에는 보물 지도의 세로의 크기와 가로의 크기가 빈칸을 사이에 두고 주어진다. 이어 L과 W로 표시된 보물 지도가 아래의 예와 같이 주어지며, 각 문자 사이에는 빈 칸이 없다. 보물 지도의 www.acmicpc.net 문제 풀이 이 문제는 각 육지에서 다른 육지로의 거리 중 최대 거리를 구하는 문제이다. 먼저, 육지(L)인 경우, 너비 우선 탐색을 진행할 수 있도록 한다(for문). 너비 우선 탐색을 진행한 후에는 결과값(res)을 기존의 값과 비교하여 더 큰 값을 저장하도록 한다. 너비 우선 탐색을 진행할 때에는 현재 육지에서 다른 육지와의 거리를 구할 수 있도록 카운트값(c)를 같이 큐에 넣어 진행한다. 큐가 빌 때까지 진행하는데, 마지막에 들어간 값이 가장 거리가..
[백준/Python] 13164 행복 유치원 문제 링크 13164번: 행복 유치원 입력의 첫 줄에는 유치원에 있는 원생의 수를 나타내는 자연수 N(1 ≤ N ≤ 300,000)과 나누려고 하는 조의 개수를 나타내는 자연수 K(1 ≤ K ≤ N)가 공백으로 구분되어 주어진다. 다음 줄에는 원생들 www.acmicpc.net 문제 풀이 각 조에서 가장 키가 작은 원생과 가장 키가 큰 원생의 차이만큼의 비용이 들게 되므로 이 차이를 최소화 해야 한다. 원생은 키 순으로 줄을 서 있으므로, 먼저 인접한 원생의 키 차이(arr[i+1]-arr[i])를 구한다. 이때 가장 차이가 많이 나는 원생은 같은 조가 되면 안되므로 다른 조로 분리를 해야 한다. 위의 과정을 k개의 조가 생성될 때까지 반복하고 각 조의 비용을 더한 값(sum(l[:n-k]))이 최솟값이..
[백준/Python] 12865 평범한 배낭 문제 링크 12865번: 평범한 배낭 첫 줄에 물품의 수 N(1 ≤ N ≤ 100)과 준서가 버틸 수 있는 무게 K(1 ≤ K ≤ 100,000)가 주어진다. 두 번째 줄부터 N개의 줄에 거쳐 각 물건의 무게 W(1 ≤ W ≤ 100,000)와 해당 물건의 가치 V(0 ≤ V ≤ 1,000) www.acmicpc.net 문제 풀이 해당 문제는 다이나믹 프로그래밍 중에서도 배낭 문제에 속한다. 이는 n번째의 물건을 각각 담을지 담지 않을지에 따라 최댓값이 결정된다. 먼저, 1~k까지의 무게를 담을 수 있는 가방이 있다고 가정한다. 첫 번째 물건만 고려하면, 무게가 6이므로, 6이전의 무게일 때는 물건을 담을 수 없으므로 각 가방의 최대 가치는 0이 된다. 6부터는 담을 수 있으므로 최대 가치는 13이 된다..
[백준/Python] 2564 경비원 문제 링크 2564번: 경비원 첫째 줄에 블록의 가로의 길이와 세로의 길이가 차례로 주어진다. 둘째 줄에 상점의 개수가 주어진다. 블록의 가로의 길이와 세로의 길이, 상점의 개수는 모두 100이하의 자연수이다. 이어 한 줄 www.acmicpc.net 문제 풀이 동근이와 상점의 위치에 따라 각 경우를 나누어야 한다. 먼저, 동근이와 상점이 북쪽, 남쪽으로 서로 마주보고 있을 때를 보면, 항상 세로 길이(y) 만큼은 움직이게 된다. 이때, 왼쪽으로 가는 경로(l+dl)와 오른쪽으로 가는 경로(x*2-l-dl)를 비교하여 더 작은 수만큼 이동하는 것이 최솟값이 된다.동근이와 상점이 서쪽, 동쪽으로 서로 마주보고 있을 때를 보면, 항상 가로 길이(x) 만큼은 움직이게 된다. 이때, 위로 가는 경로(l+dl)와..
[백준/Python] 2343 기타 레슨 문제 링크 2343번: 기타 레슨 강토는 자신의 기타 강의 동영상을 블루레이로 만들어 판매하려고 한다. 블루레이에는 총 N개의 강의가 들어가는데, 블루레이를 녹화할 때, 강의의 순서가 바뀌면 안 된다. 순서가 뒤바뀌는 경 www.acmicpc.net 문제 풀이 블루레이는 수가 m개이면서 용량이 최소여야 한다. 이 때, 모든 강의 영상이 최소 하나씩은 담기게 되므로, 블루레이의 크기는 가장 용량이 큰 강의 영상보다 같거나 커야 한다. 또한, 전체 강의 영상의 용량을 합한 것보다 클 수는 없다. 따라서 이분 탐색의 시작점을 가장 용량이 큰 강의 영상(max(l))로 지정하고, 끝점을 전체 강의 영상의 용량(sum(l))로 지정해야 한다. 기준점(mid)이 정해지면, 해당 크기의 블루레이에 얼만큼의 강의 영상..
[백준/Python] 2170 선 긋기 문제 링크 2170번: 선 긋기 첫째 줄에 선을 그은 횟수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 다음 N개의 줄에는 선을 그을 때 선택한 두 점의 위치 x, y (-1,000,000,000 ≤ x < y ≤ 1,000,000,000)가 주어진다. www.acmicpc.net 문제 풀이 먼저, 입력 받은 리스트를 시작점(x[0])에 대해서 오름차순 정렬하고, 끝점(x[1])에 대해서 오름차순 정렬을 한다. 처음의 시작점과 끝점은 각각 리스트의 첫 번째가 되는데, 이 때, 총 길이의 값을 끝점에서 시작점을 뺀 값으로 저장한다. 이후 인접한 두 선분은 총 6가지의 케이스가 나오게 되는데, 각 2가지의 케이스씩 묶어서 생각할 수 있다. 첫 번째는 선분 l1의 끝점이 선분 l2의 시작점보다 큰 경우..
[백준/Python] 10026 적록색약 문제 링크 10026번: 적록색약 적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다. 크기가 N×N인 그리드의 각 칸에 R(빨강), G(초록) www.acmicpc.net 문제 풀이 위 문제는 dfs, bfs 두 가지 방법으로 모두 풀이가 가능하다. 적록색약이 아닌 사람은 R, G, B 모두 다르게 인식하지만, 적록색약인 사람은 R, G를 구분하지 못하므로, 입력 받은 리스트에서 G인 부분을 R로 바꾸어 새로운 리스트를 생성하였다. 방문 처리 리스트(visited)를 통해서 시작 위치를 방문하지 않았으면 함수(dfs, bfs)를 실행한다. 이때, 해당 함수는 시작 위치와 동일한 위치에 대해서만 방문 처리를 하게 된..
[백준/Python] 12904 A와 B 문제 링크 12904번: A와 B 수빈이는 A와 B로만 이루어진 영어 단어가 존재한다는 사실에 놀랐다. 대표적인 예로 AB (Abdominal의 약자), BAA (양의 울음 소리), AA (용암의 종류), ABBA (스웨덴 팝 그룹)이 있다. 이런 사실에 놀란 수 www.acmicpc.net 문제 풀이 처음에는 큐를 생성하고 s를 넣은 상태에서 A, B를 더해서 다시 큐에 넣어서 t와 비교하는 방식으로 접근하였다. 하지만, 메모리 초과가 발생해서 게시판의 질문들을 통해서 힌트를 조금 얻었다. 먼저, s를 t로 만들게 되면, 그 경우의 수가 많아지게 된다는 것이다. 이때, t의 길이가 될 때까지 진행해야 하므로 당연히 s와 t의 길이 차가 많이 날수록 그만큼 큐에 들어있는 문자열 또한 많아지게 된다. 반대..
[백준/Python] 2565 전깃줄 문제 링크 2565번: 전깃줄 첫째 줄에는 두 전봇대 사이의 전깃줄의 개수가 주어진다. 전깃줄의 개수는 100 이하의 자연수이다. 둘째 줄부터 한 줄에 하나씩 전깃줄이 A전봇대와 연결되는 위치의 번호와 B전봇대와 연결되는 www.acmicpc.net 문제 풀이 정렬로 접근하다가 전에 이코테 강의에 있던 문제와 비슷하다고 생각되어 그 방식으로 접근해 보았다. 이 문제는 "가장 긴 증가하는 부분 수열" 문제로 생각할 수 있는데, a에 있는 전깃줄이 차례로 정렬되어 있을 때, b에 있는 전깃줄의 숫자가 차례로 정렬되어 있도록 하면 된다. 먼저 입력 받은 리스트를 a(x[0])를 기준으로 오름차순 정렬 후에, 같은 값이 있다면 b(x[1])를 기준으로 정렬한다. 이후 b에 있는 i번째의 전깃줄의 숫자(ab[i]..