백준 32984번: 겨울이 좋아 [Python]
백준 2842번: 집배원 한상덕 [C++]
백준 14595번: 동방 프로젝트 (Large) [Python]
백준 12099번: 점심메뉴 [Python]
랜덤 마라톤 · 코스 72

A. 공약수
유클리드 호제법으로 공약수를 구한 뒤 약수를 출력하면 됩니다.
1 | |
B. 디지털시계
문제에서 요구하는 것을 잘 구현하면 됩니다.
1 | |
C. 줄자접기
줄자의 길이를 $l$이라 하고 수직선 위의 두 점 $0$과 $l - 1$을 잇는 선분으로 생각해 봅시다.
점 $m$을 기준으로 반으로 접으면 줄자의 길이는 $\max(m, l - m)$이 됩니다.
접는 점을 원점인 $0$으로 재조정하면 $m$보다 왼쪽에 있는 점 $x$는 $m - x$, 오른쪽에 있는 점 $y$는 $y - m$으로 바꿀 수 있습니다.
1 | |
D. 아이템 배치하기
강화력이 큰 것부터 내림차순으로 배치하는것이 이득입니다.
현재까지 강화된 아이템의 최대 인덱스를 관리하는 방법으로 $\mathcal{O}(N)$에 해결할 수 있습니다.
강화력이 $0$이면 break하도록 하면 현재까지 봤던 아이템들은 모두 강화된 상태이므로 강화된 아이템의 최대 인덱스가 $N$이 넘어가면 $N$개가 모두 강화됨을 알 수 있습니다.
1 | |
E. 이미지 축소
연속으로 열이 같은 모든 경우의 최대 공약수, 행이 같은 모든 경우의 최대 공약수를 각각 구하면 가장 큰 $i, j$를 구할 수 있습니다.
1 | |
F. 가희와 무궁화호
그냥 열심히 구현하면 됩니다…
다음 날로 넘어가는 부분을 구현할 때 주의합시다.
1 | |
G. 용액 합성하기
두 포인터로 $\mathcal{O}(N)$에 해결할 수 있습니다.
$l = 0$, $r = N - 1$로 초기화합시다.
$A_l + A_r < 0$인 경우 합을 늘려야 하므로 $l$을 증가시킵니다.
$A_l + A_r > 0$인 경우 합을 줄여야 하므로 $r$을 감소시킵니다.
1 | |
번외로, 이분 탐색으로도 해결할 수 있습니다.
1 | |
H. 배열 돌리기 2
$(i, j)$에 있는 수를 $(i, j + c)$로 옮기고 나머지를 왼쪽으로 한칸씩 당기는 방법을 생각해 봅시다.
$(i, j)$와 $(i, j + 1)$를 교환하고, $(i, j + 1)$와 $(i, j + 2)$를 교환하고… 를 반복하면 됩니다.
따라서 반시계방향으로 회전하는 것은 시계방향으로 교환하는 행위와 같습니다.
회전해야 할 길이로 $R$을 나눈 나머지만큼 회전하면 시간 복잡도 $\mathcal{O}(N^3)$ 정도에 해결할 수 있습니다.
1 | |
랜덤 마라톤 · 코스 71

A. 아이그루스와 화장실
안뇽이는 $K$가 홀수이면 $K$층, 짝수이면 $K - 1$층으로 가면 됩니다.
인덕이는 $K$가 짝수이면 $K$층, $K = 1$이면 $2$층, 아니면 $K - 1$층으로 가면 됩니다.
1 | |
B. 중복된 숫자
$1$부터 $N - 1$까지의 합에 $A$의 원소를 모두 빼면 중복되는 수와 부호가 반대인 수가 됨을 알 수 있습니다.
파이썬에서 정수들을 한 줄에 한번에 입력받으면 메모리 초과를 받으므로 sys.stdin.read를 이용해서 정수를 하나씩 읽어 메모리를 절약했습니다.
1 | |
C. The primes contain arbitrarily long arithmetic progressions
초항이 $2$고 공차가 $0$인 등차수열을 출력하면 됩니다.
1 | |
D. 어두운 굴다리
가로등의 높이는 최소 $\max(x_1, N - x_M)$이어야 합니다.
임의의 두 가로등 사이에 비춰지지 않는 곳이 존재하면 안 되므로 $i = 1$부터 $N - 1$까지 $i$번째 가로등과 $i + 1$번째 가로등 사이가 모두 비춰질 때 까지 가로등을 높여줍시다.
가로등의 높이가 $N$이 되면 모두 비출 수 있으므로 가로등의 높이는 최대 $N$번 증가하고 따라서 시간 복잡도 $\mathcal{O}(N)$에 해결할 수 있습니다.
1 | |
E. 서바이벌
선분들이 단순다각형을 이루려면 $s_{i + 1}$번 학생이 $s_i$번 학생에게 총을 쏘면 안 되므로 $s_i$와 $s_{i + 1}$ 사이의 거리보다 $s_{i + 1}$과 $s_{i + 2}$ 사이의 거리가 더 짧거나 같아야 합니다.
그렇다면 $s_1$와 $s_2$ 사이의 거리보다 $s_M$과 $s_1$ 사이의 거리가 더 짧거나 같아야 합니다. 만약 더 짧다면 $s_1$번 학생이 $s_2$번 학생에게 총을 쏘았다는 것에 모순되므로 모든 선분의 길이는 같아야 합니다.
그러나 거리가 같은 경우 번호가 큰 학생에게 총을 쏘아야 하므로 번호가 단조 증가/감소해야 합니다. 이때 규칙에 따라 $s_i$가 최대인 학생에게 총을 쏘는 학생이 정확하게 두 명 존재해야 하고, $s_i$가 최대인 학생은 그 두 학생 중 하나에게 총을 쏘아야 하므로 선분이 겹치게 되고 이는 각 총알의 경로가 양 끝점 이외의 다른 점에서 다른 경로와 만나지 않는다는 것과 모순입니다.
따라서 단순다각형을 이루도록 하는 입력은 존재하지 않습니다.
1 | |
F. 도어맨
남자와 여자의 수 차이가 줄어든다면 두 번째 사람을 먼저 입장시키는 것이 이득이고, 그렇지 않으면 어떤 사람을 먼저 입장시키든 상관 없습니다.
1 | |
G. 레벨 햄버거
레벨-$N$ 버거에 들어있는 패티의 개수를 $P_N$이라 하면 $P_N = 2P_{N - 1} + 1$입니다.
레벨-$N$ 버거의 레이어의 수를 $L_N$이라 하면 $L_N = 2L_{N - 1} + 3$입니다.
동적 계획법을 이용해서 $P_N$과 $L_N$을 전처리해 두고 재귀적으로 레이어 개수 $X$이하인 부분의 패티의 개수를 구해주면 됩니다.
1 | |
H. 그리드 게임
지문에 오류가 있습니다. 자세한 내용은 게시판 글을 참조해 주세요.
너비 우선 탐색으로 탐색한 곳의 개수를 세면 됩니다.
1 | |