본문 바로가기

Coding Test/BOJ

(27)
[백준/Python] 16234 인구 이동 문제 링크 16234번: 인구 이동첫째 줄에 N, L, R이 주어진다. (1 ≤ N ≤ 50, 1 ≤ L ≤ R ≤ 100) 둘째 줄부터 N개의 줄에 각 나라의 인구수가 주어진다. r행 c열에 주어지는 정수는 A[r][c]의 값이다. (0 ≤ A[r][c] ≤ 100) 인구 이동이 발생하는 일수가 2,000번 보다 작거나 같은 입력만 주어진다.www.acmicpc.net 문제 풀이현재 국가 위치에서 상하좌우의 국가의 인구수 차이를 계산하고, 하나라도 그 차이가 l이상 r이하일 때, 두 국가는 문이 열려 있으므로 인구 이동을 하게 된다.인접한 국가 사이 중 문이 열려 있는 국가를 대상으로 반복 탐색한 후 해당 국가 전체에 대해 인구 이동을 시작한다.(1,1) 위치부터 (n,n) 위치까지의 국가에 대해서 인..
[백준/Python] 2631 줄 세우기 문제 링크 2631번: 줄세우기 KOI 어린이집에는 N명의 아이들이 있다. 오늘은 소풍을 가는 날이다. 선생님은 1번부터 N번까지 번호가 적혀있는 번호표를 아이들의 가슴에 붙여주었다. 선생님은 아이들을 효과적으로 보호하기 www.acmicpc.net 문제 풀이 이 문제는 '가장 긴 증가하는 부분 수열' 문제로 생각할 수 있다. 옮겨지는 아이들의 수가 최소가 되려면 현재 번호대로 줄 서 있는 아이들 수가 최대가 될 때, 그렇지 않은 나머지 아이들이 움직이면 된다. 따라서, 전체 아이들 수에서 번호가 증가하는(차례로 있는) 아이들 수를 제외하면 된다. 전체 코드 import sys input = sys.stdin.readline n = int(input()) children = [int(input()) fo..
[백준/Python] 14719 빗물 문제 링크 14719번: 빗물 첫 번째 줄에는 2차원 세계의 세로 길이 H과 2차원 세계의 가로 길이 W가 주어진다. (1 ≤ H, W ≤ 500) 두 번째 줄에는 블록이 쌓인 높이를 의미하는 0이상 H이하의 정수가 2차원 세계의 맨 왼쪽 위치 www.acmicpc.net 문제 풀이 양 끝을 제외하고 현재 위치에서 왼쪽, 오른쪽 부분에 자신보다 높이가 큰 블록이 있는지 확인하면 된다. 블록이 3 1 0 4 과 같을 때, 1 블록에서 왼쪽에는 3인 블록이 오른쪽에는 4인 블록이 있다. 그중 더 작은 블록만큼 물이 찰 수 있으므로 2만큼 차게 된다. 0 블록에서도 마찬가지이므로 3만큼 차게 된다. 만약, 한쪽이라도 자신의 위치보다 작은 블록이 있다면 물이 찰 수 없다. 전체 코드 import sys inpu..
[백준/Pyhon] 14002 가장 긴 증가하는 부분 수열 4 문제 링크 14002번: 가장 긴 증가하는 부분 수열 4 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이 www.acmicpc.net 문제 풀이 최대 길이를 구하려면 현재 위치의 값에서 앞에 작은 값들이 얼마나 있는지를 계산하면 된다. 수열 10, 20, 10, 30, 20, 50이 있다고 가정한다. 첫 번째 위치인 10은 자신 하나므로 최대 길이가 1이 되고, 두 번째 위치인 20은 자신과 그 앞의 숫자로 최대 길이가 2가 된다. 세 번째 위치인 10은 앞의 두 숫자가 모두 작지 않으므로 최대 길이가 ..
[백준/Python] 14891 톱니바퀴 문제 링크 14891번: 톱니바퀴 첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터 www.acmicpc.net 문제 풀이 톱니바퀴는 시계방향 또는 반시계 방향으로 움직이므로, 각 톱니바퀴를 큐에 담아 하나의 리스트에 담는다. 인접한 톱니바퀴를 모두 확인하면서 해당 톱니바퀴를 어느 방향으로 회전해야 하는지 확인해야 한다. 따라서 현재 시작 위치에서 왼쪽, 오른쪽을 각각 하나씩 탐색하면 된다. 전체 코드 import sys from collections import deque input = sys.stdin.readline gear = [deque(map(in..
[백준/Python] 14502 연구소 문제 링크 14502번: 연구소 인체에 치명적인 바이러스를 연구하던 연구소에서 바이러스가 유출되었다. 다행히 바이러스는 아직 퍼지지 않았고, 바이러스의 확산을 막기 위해서 연구소에 벽을 세우려고 한다. 연구소는 크 www.acmicpc.net 문제 풀이 벽을 3개 세울 수 있으므로 먼저 그 경우를 구해야 한다. 이후 각 경우 별로 벽을 세운 이후에 바이러스가 최대한 퍼지게 한다. 바이러스가 모두 퍼졌을 때의 빈 공간의 개수를 구하고, 최대가 될 때를 구하면 된다. 먼저, 바이러스 위치와 현재 빈 공간을 각각 리스트(virus, wall)에 담는다. 빈 공간에 3개의 경우(combinations(wall, 3))를 구하고, 벽을 설치(labc[j[0]][j[1]])한다. 바이러스가 최대로 퍼지게 하고(sp..
[백준/Python] 19539 사과나무 문제 링크 19539번: 사과나무 첫 번째 줄에 모든 나무가 갊자가 바라는 높이가 되도록 물뿌리개를 통해 만들 수 있으면 “YES”를, 아니면 “NO”를 따옴표를 제외하고 출력한다. www.acmicpc.net 문제 풀이 나무가 2만큼 성장하는 물뿌리개를 사용한 횟수와 1만큼 성장하는 물뿌리개를 사용한 횟수가 같아야 한다. 즉, 바라는 높이의 총 합이 3(2+1)으로 나누어져야 한다. 또한, 각 나무 높이에서 2만큼 성장하는 물뿌리개를 최대 얼만큼 사용할 수 있는지 구해야 한다. 만약 나무 높이가 1 3 1 3 1로 주어졌을 때, 각각 0 1 0 1 0 만큼 사용할 수 있다. 하지만 총 사용해야 하는 물뿌리개 횟수는 9 / 3 = 3으로 이 값보다 작아 해당 높이를 만들 수 없게 된다. 전체 코드 imp..
[백준/Python] 2294 동전 2 문제 링크 2294번: 동전 2 첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다 작거나 같은 자연수이다. 가치가 같은 동전이 여러 번 주어 www.acmicpc.net 문제 풀이 동전이 1만 있다면 다음과 같이 작성할 수 있다. n 0 1 2 3 4 5 ... 14 15 dp[n] 0 1 2 3 4 5 ... 14 15 동전이 1, 5가 있다면 5이상부터는 값이 달라진다. n 0 1 ... 5 6 7 ... 14 15 dp[n] 0 1 ... 1 2 3 ... 6 3 n이 5일 때, 1을 5번 사용하는 것보다 5를 1번 사용하는 것이 최소로 사용하기 때문이다. 각 동전의 값부터 시작하..
[백준/Python] 15686 치킨 배달 문제 링크 15686번: 치킨 배달 크기가 N×N인 도시가 있다. 도시는 1×1크기의 칸으로 나누어져 있다. 도시의 각 칸은 빈 칸, 치킨집, 집 중 하나이다. 도시의 칸은 (r, c)와 같은 형태로 나타내고, r행 c열 또는 위에서부터 r번째 칸 www.acmicpc.net 문제 풀이 k(>m)개 만큼의 치킨집이 있을 때, m개의 치킨을 선택하는 경우의 수는 kCm으로 구할 수 있고, 파이썬에서는 combinations를 사용해서 경우를 구할 수 있다. 집에서 가장 가까운 치킨집의 거리를 더하고, 각 격우 중 제일 작은 값일 때가 최솟값이 된다. 전체 코드 import sys from itertools import combinations n, m = map(int, sys.stdin.readline()..
[백준/Python] 2230 수 고르기 문제 링크 2230번: 수 고르기 N개의 정수로 이루어진 수열 A[1], A[2], …, A[N]이 있다. 이 수열에서 두 수를 골랐을 때(같은 수일 수도 있다), 그 차이가 M 이상이면서 제일 작은 경우를 구하는 프로그램을 작성하시오. 예를 들어 www.acmicpc.net 문제 풀이 처음에는 완전 탐색으로 풀었지만 역시나 시간 초과였다. 알고리즘에 투 포인터가 있어서 찾아보니 투 포인터라는 알고리즘이 있어 어떤 알고리즘인지 설명을 본 후 다시 코드를 작성하였다. 처음값(start, i)은 0부터 n-1까지이고, end는 1부터 n-1까지 범위의 수이다. arr[end]-arr[i] 값이 m보다 작으면 end 값을 1 늘리고, m보다 크거나 같으면 res 값과 비교하여 더 작은 값을 저장할 수 있도록 ..
[백준/Python] 2251 물통 문제 링크 2251번: 물통 각각 부피가 A, B, C(1≤A, B, C≤200) 리터인 세 개의 물통이 있다. 처음에는 앞의 두 물통은 비어 있고, 세 번째 물통은 가득(C 리터) 차 있다. 이제 어떤 물통에 들어있는 물을 다른 물통으로 쏟아 부 www.acmicpc.net 문제 풀이 물을 옮기는 경우는 A에서 B, C로, B에서 A, C로, C에서 A, B로 총 6가지가 존재한다. A에서 B로 물을 옮긴다고 한다면, 현재 A에 들어있는 물의 양과 B의 컵의 양에서 들어있는 물의 양을 뺀 만큼의 양 중에서 더 작은 값만큼 옮겨지게 된다. 물을 옮긴 후에 현재 각 컵에 들어있는 물의 양이 전에도 나왔던 값인지를 비교한 후, 나오지 않았다면 큐에 추가한다. 위 과정을 큐가 비어있을 때까지 반복한다. 전체 ..
[백준/Python] 2225 합분해 문제 링크 2225번: 합분해 첫째 줄에 답을 1,000,000,000으로 나눈 나머지를 출력한다. www.acmicpc.net 문제 풀이 0~N의 수를 k만큼 사용해서 N을 만드는 경우의 수를 구하는 문제이다. 주어진 예제의 N=6, k=4인 경우를 살펴보면 다음과 같이 표를 작성할 수 있다. k \ N 0 1 2 3 4 5 6 1 1 1 1 1 1 1 1 2 1 2 3 4 5 6 7 3 1 3 6 10 15 21 28 4 1 4 10 20 35 56 84 이를 점화식으로 표현하면 다음과 같다. dp[k][N] = dp[k-1][N] + dp[k-1][N-1] + ... + dp[k-1][0] 전체 코드 import sys n, k = map(int, sys.stdin.readline().split()..