UCPC 초등학교의 체육 시간이 다가왔습니다. 체육 선생님이 학교에 나오지 못해 체육 시간을 대신 맡게 된 수학 선생님 키파는, 이제는 해져서 축구공처럼 보이지도 않는 공을 던져 주고 축구든 피구든 하라고 한 뒤, 공을 갖고 재밌게 노는 아이들을 운동장 구석에서 지켜보며 자신이 초등학생이던 시절의 체육 시간을 떠올렸습니다.
초등학생의 키파는 몸이 약했습니다. 축구도 몇십 초 이상 뛰는 게 힘들어서, 피구도 공이 몸에 맞으면 다음 날 몸이 너무 아파서, 언제나 운동장 구석에 앉아 재밌게 노는 친구들을 바라만 보았습니다. 그러다 심심해지면 운동장 위에 낙서를 했습니다. 지금 아이들을 바라보고 있자니 문득 그때의 자신이 떠올랐습니다. 이제 생각해 보면 그런 생각의 시간이 있었기에 수학이 재밌어진 것이 아닐까 싶기도 합니다. 어느새 키파는 자신도 모르게 초등학생 때처럼 운동장 위에 나뭇가지로 원을 그리고 있었습니다.
초등학교 운동장에 앉아 있었을 때에는 커다란 원을 그리고 싶었습니다. 어린 키파의 눈에도 원은, 구불구불하지만 질서 있는 듯, 동그랗다는 느낌이 참 마음에 들었나 봅니다. 운동장이 모두 내 것이 된 것처럼 그저 이곳을 뛰어다니고만 싶어졌습니다. 뛰어다니며 원을 그리고 싶었습니다. 하지만 체육 선생님이 아니라 수학 선생님이 된 키파는, 뛰어다니기에는 여전히 몸이 그리 좋지 않았습니다. 운동장이 칠판이라고 생각하며 운동장 비슷한 직사각형을 그리고, 그 안에 꽉 찬 원을 그릴 수밖에 없었습니다.
여러분이 대신 키파의 꿈을 이루어 줍시다. 직사각형 모양의 운동장이 주어지면 운동장 안에서 그릴 수 있는 가장 커다란 원을 그려 줍시다. 그러고 나서 키파에게 원의 반지름의 길이가 얼마인지 알려 줍시다.
첫 줄에 운동장의 한 변의 길이 H가 미터(m) 단위로 주어집니다. (5 ≤ H ≤ 1 000)
둘째 줄에 운동장의 다른 한 변의 길이 W가 미터(m) 단위로 주어집니다. (5 ≤ W ≤ 1 000)
첫 줄에 운동장 안에 그릴 수 있는 가장 큰 원의 반지름의 길이를 센티미터(cm) 단위로 출력합니다. 입력 조건 하에서 이 값은 정수임을 보일 수 있으므로, 정수 형태로 출력합니다.
810
400
513
250
1번부터 N번까지 N개 정점과 M개 간선으로 이루어진 가중치 있는 무방향 단순 그래프 G에 대해 숲 점수를 다음과 같이 정의한다:
당신은 양의 정수 k에 대해 숲 점수가 정확히 k이고 정점이 2024개 이하인 그래프 G를 생성하라는 임무를 받았다.
이 문제가 너무 쉬웠던 당신에게는 다음과 같은 추가적인 조건을 만족하는 G를 찾는 것이 더 흥미롭게 느껴졌다.
k가 주어질 때, 조건을 만족시키는 G를 구하여 출력해 보자.
첫 줄에 정수 k가 주어진다. (2 ≤ k ≤ 12)
첫 줄에 그래프 G의 정점의 개수 N을 출력한다. (2 ≤ N ≤ 2024)
둘째 줄부터 (2N - 2)개의 줄에 걸쳐 i번째 줄에 세 정수 ai, bi, ci를 공백을 사이에 두고 출력한다. (1 ≤ ai, bi ≤ N; ai ≠ bi; 1 ≤ ci ≤ 109) 이는 ai번 정점과 bi번 정점을 잇는 가중치 ci인 간선이 존재함을 나타낸다.
G는 다음 조건들을 충족해야 한다.
3
5 1 2 8 2 3 1 3 4 2 4 5 5 1 3 6 3 5 4 5 2 7 2 4 3
아래는 k = 3인 경우 올바른 답의 예시이다.
위 그래프는 아래 그림에서 확인할 수 있듯 겹치지 않는 두 개의 트리로 구성된다.
숲 점수를 계산해 보면 아래와 같이 3이 된다. 빨간색 간선은 F1, 파란색 간선은 F2, 초록색 간선은 F3에 소속된 간선을 나타낸다.
미어캣 N마리로 구성된 미어캣 가족이 집단생활을 하고 있다. 낮에는 미어캣들이 천적에 대응하기 위해 굴에서 나와 1차원 좌표에서 보초를 선다. 각 미어캣은 보초를 설 때 자신의 위치와 바라보는 방향이 왼쪽 혹은 오른쪽 중 하나로 정해져 있으며, 보초를 서는 동안에는 자신이 바라보는 방향을 바꿀 수 없다.
미어캣 가족 내의 모든 미어캣의 키는 서로 다르며 자신보다 키가 큰 미어캣이 자신이 바라보는 방향에 서 있는 경우 망을 볼 수 없다. 이를 불쌍하게 여긴 당신은 미어캣 가족이 눈치채지 못하게 아래의 행동을 자유롭게 수행할 수 있다.
위의 행동을 적절히 수행했을 때 망을 볼 수 있는 미어캣은 최대 몇 마리인지 구해보자.
첫 줄에 미어캣의 수 N이 주어진다. (3 ≤ N ≤ 5 000)
둘째 줄부터 N개의 줄에 걸쳐 미어캣에 대한 정보가 주어진다. 모든 1 ≤ i ≤ N에 대해, (i + 1)번째 줄에 왼쪽에서 i번째에 위치한 미어캣의 키를 나타내는 정수 Ai, 바라보고 있는 방향을 나타내는 문자 Di가 공백을 사이에 두고 주어진다. (1 ≤ Ai ≤ N) Di는 왼쪽이면 L, 오른쪽이면 R로 주어진다.
모든 Ai는 서로 다르다.
첫 줄에 망을 볼 수 있는 미어캣은 최대 몇 마리인지 출력한다.
55 L2 R3 R4 R1 L
4
77 R1 L6 R3 L5 L4 R2 R
4
찬솔이는 N개의 노드에 정수가 적혀있는 이진 검색 트리를 만들었다. 이진 검색 트리는 모든 노드 i에 대해서, i의 왼쪽 자손 노드에 적힌 수는 모두 i에 적힌 수보다 작고, i의 오른쪽 자손 노드에 적힌 수는 모두 i에 적힌 수보다 큰 이진 트리이다.
찬솔이는 모든 i에 대해서 이진 검색 트리의 i번 노드의 깊이 Hi와 이진 검색 트리의 i번 노드에 적힌 정수 Ai를 기록해두었다. 이때, Ai는 모두 다르고 루트 노드의 깊이는 1이다. (1 ≤ i ≤ N)
찬솔이는 ICPC World Finals에 다녀오는 동안 이진 검색 트리를 잃어버렸다. 찬솔이를 위해 이전에 기록해둔 정보를 이용하여 이진 검색 트리를 복원해주자.
첫 줄에 노드의 개수 N이 주어진다. (1 ≤ N ≤ 200 000)
둘째 줄부터 N개의 줄에 걸쳐 트리의 노드 정보가 주어진다. 모든 1 ≤ i ≤ N에 대해, (i + 1)번째 줄에는 i번 노드에 적힌 정수 Ai와 i번 노드의 깊이 Hi가 공백으로 구분되어 주어진다. ( - 2·109 ≤ Ai ≤ 2·109; 1 ≤ Hi ≤ N) Ai는 모두 다르다.
만약 주어진 기록으로 이진 검색 트리를 복원할 수 없다면 - 1을 출력한다.
복원할 수 있다면 트리의 구조를 N개의 줄에 걸쳐 출력한다.
i번째 줄에는 i번 노드의 왼쪽 자식과 오른쪽 자식의 노드 번호를 출력한다. 자식이 없으면 자식의 노드 번호로 - 1을 출력한다.
만약 복원할 수 있는 트리가 여러 개라면 아무거나 복원해도 된다.
31 22 13 2
-1 -1 1 3 -1 -1
31 12 23 2
-1
32 25 34 2
-1
3100 2200 1300 2
-1 -1 1 3 -1 -1
"지금 자면 꿈을 꾸지만, 지금 공부하면 꿈을 이룬다."라는 말이 있습니다. 하지만 실버의 생각은 조금 다릅니다. 실버는 잠을 잘 자서 공부의 효율을 더 높이는 것이 중요하다고 생각합니다. 해야 할 과제가 많았던 실버는 잠을 적당히 자서 최대한 많은 과제를 해내려고 합니다.
실버에게는 N개의 과제가 있으며, i번째 과제의 기한은 Ti입니다. 실버는 시각 0부터 시작하여 원하는 시각에 원하는 과제 하나를 선택하여 진행할 수 있습니다. 과제는 한 번에 하나만 진행할 수 있으며, 과제를 진행하는 도중에 다른 과제를 시작할 수는 없습니다. 실버가 과제 하나를 완료하는 데에는 A만큼의 시간이 걸립니다.
실버는 0 이상 (A - 1) 이하의 정수 X를 고른 다음, BX만큼 잠을 잘 수 있습니다. 이때 잠을 잔 이후에는 과제 하나를 완료하는 데에 (A - X)만큼의 시간이 걸립니다. 잠은 최대 한 번 잘 수 있으며, 과제를 진행하는 도중에 잠을 잘 수는 없습니다. 또한 시각 0부터 잠을 잘 수도 있습니다.
실버는 잠을 적당히 자서 기한 내에 완료하는 과제의 수를 최대화하려 합니다. i번째 과제를 정확히 시각 Ti에 완료한 경우에도 기한 내에 완료한 것으로 생각합니다.
기한 내에 완료할 수 있는 과제의 최대 개수를 구해 봅시다!
첫 줄에 과제의 수 N, 과제 하나를 완료하는데 걸리는 초기 시간 A, 과제 완료 시간 단축의 기준이 되는 정수 B가 주어집니다. (1 ≤ N, A, B ≤ 100)
둘째 줄에 각 과제의 기한 Ti가 주어집니다. (1 ≤ Ti ≤ 10 000)
입력으로 들어오는 모든 수는 정수입니다.
첫 줄에 기한 내에 완료할 수 있는 과제의 최대 개수를 출력합니다.
3 40 270 90 80
3
3 40 1070 90 80
2
4 30 370 75 95 105
4
8 2 52 8 9 10 11 12 13 14
8
밍구는 차세대 채팅 앱 ChatChatA을 개발했다!
ChatChatA를 배포하고 나니, 치명적인 버그 리포트가 밍구에게 날아왔다! 메시지를 입력하는 과정에서, 메시지의 마지막 글자가 특정 글자일 때, 특정 글자를 입력하면 메시지가 "두 배" 된다는 것이다!
정확히 풀어 설명하면 "두 배" 된다는 것은 다음과 같다.
이면, c를 입력했을 때 M은 M + c가 아닌 M + M + c가 된다!
이면, c를 입력했을 때 M은 M + c가 된다. ChatChatA의 사용자인 구밍이는 문자열 T를 입력하기 위한 최소의 입력 수가 궁금해졌다.
현재 메시지 M은 빈 문자열로 시작하고, 매 입력은 다음 두 행동 중 하나이다.
현재 메시지 M이 T가 되기 위한 최소의 입력 수를 구밍이 대신 구해주자!
첫 줄에 D의 크기 N이 주어진다. (1 ≤ N ≤ 676 = 262)
둘째 줄에 길이 N의 영어 소문자 문자열 S, 셋째 줄에 길이 N의 영어 소문자 문자열 C가 주어진다.
S의 i번째 글자를 Si, C의 i번째 글자를 Ci라고 하면, D = {(Si, Ci): 1 ≤ i ≤ N}이다.
|D| = N이다. 즉, 같은 (Si, Ci) 쌍은 주어지지 않는다.
넷째 줄에 입력할 영어 소문자로 이루어진 문자열 T가 주어진다. (1 ≤ |T| ≤ 500 000)
첫 줄에 현재 메시지를 T로 만드는 데 필요한 최소의 입력 수를 출력한다.
만약 현재 메시지를 T로 만들지 못한다면 - 1을 출력한다.
1tachatchata
5
2cthachatchata
-1
2afbdaafaaafaafaaafd
8
현우는 틀에 석고를 붓고 굳혀서 다양한 모양을 만들어 보는 취미가 있다. 현우가 이번에 준비한 틀은 세로 길이가 R, 가로 길이가 C, 높이가 1인 직육면체 모양이다.
만들어진 모양이 단순하면 석고 모형을 만드는 재미가 떨어진다. 그래서 현우는 지름과 높이가 1인 원기둥을 R × C개 가져왔다. 현우는 원기둥을 모두 틀 안에 배치한 다음 빈 공간에 석고를 붓기로 했다.
원기둥을 틀에 배치할 때에는, 틀을 R × C개의 단위 정육면체로 나눈 뒤 각 단위 정육면체 안에 꼭 맞게 넣어야 한다. 원기둥을 배치할 수 있는 방향은 세 가지가 있는데, 회전축이 가로를 향하거나, 세로를 향하거나, 바닥에 수직이도록 놓을 수 있다.
현우가 원기둥을 모두 배치하고 나면 틀에 석고를 부어 굳힌 뒤 모든 원기둥을 제거할 것이다. 그러면 여러 개의 분리된 석고 조각이 만들어진다. 예를 들어, 세로 길이가 1이고 가로 길이가 2인 직육면체 틀에 두 원기둥을 회전축이 바닥에 수직이도록 배치한다면 총 6개의 석고 조각이 만들어진다.
한편, 위 예시에서 원기둥 하나의 회전축이 세로를 향하도록 배치를 바꾼다면 총 5개의 석고 조각이 만들어진다.
현우가 틀에 원기둥을 배치하는 방법이 주어졌을 때, 총 몇 개의 석고 조각이 만들어질지 구해 보자.
첫째 줄에 틀의 세로 길이와 가로 길이를 나타내는 정수 R와 C가 공백을 사이에 두고 주어진다. (1 ≤ R, C ≤ 200)
다음 R개의 줄에 걸쳐 현우가 틀에 원기둥을 배치하는 방법이 주어진다. 각 줄에는 길이 C의 문자열이 주어지며, 문자열을 구성하는 문자의 의미는 아래와 같다.
첫 줄에 석고를 굳힌 뒤 원기둥을 모두 제거하면 만들어지는 석고 조각의 개수를 출력한다.
1 2OO
6
1 2OI
5
1 2OH
4
2 2IHHI
2
요즘 세상에는 일상생활 속 미션을 수행하면서 포인트를 얻고 소정의 상품도 얻어갈 수 있는 앱테크 서비스가 많다. 만보기 미션은 여러 앱테크 서비스에서 널리 사용하고 있는데, 매일 Dm 걷기에 성공하면 약간의 포인트를 얻을 수 있다.
매일 Dm씩 걷는 게 생각보다 번거로운 일이기 때문에, 미션을 직접 수행하기 귀찮아하는 사람들을 위해 한별이는 만보기 미션을 대행해주는 사업을 하는 스타트업 스타트한별을 창업하였다. 스타트한별에서는 우선 스타트한별 사옥을 지나는 동서쪽으로 길게 이어진 도로 위에 1m 간격으로 보관함을 설치하고 정수 번호를 매겼다. 스타트한별 사옥에서 동쪽으로 Am 떨어진 보관함의 번호는 A, 서쪽으로 Am 떨어진 보관함의 번호는 - A, 사옥에 있는 보관함의 번호는 0이다.
당신은 스타트한별 사옥에서 출발하여 모든 고객의 미션을 수행한 다음 회사로 복귀해야 한다. 당신이 업무를 시작하기 전에 이미 모든 고객이 Xi번 보관함에 휴대폰을 놓아두었다. 당신은 Xi번 보관함까지 가서 휴대폰을 직접 집어야 하고, 집은 이후 Dm 이상 움직인 다음 Xi번 보관함에 휴대폰을 반납해야 한다. 당신은 충분히 큰 가방을 갖고 업무를 수행하기 때문에 여러 휴대폰을 동시에 넣어서 움직일 수 있다. 당신의 이동기록은 근무 기록으로 반영되기 때문에 반드시 도로 위에서만 움직여야 한다.
모든 고객의 미션을 수행하고 복귀하기 위해 움직여야 할 최소 거리를 구하는 프로그램을 작성하여라.
첫 줄에 고객의 수 N과 미션을 수행하기 위해 걸어야 할 최소 이동 거리 D가 공백을 사이에 두고 주어진다. (1 ≤ N ≤ 1 000 000; 1 ≤ D ≤ 109)
둘째 줄에 각 고객이 휴대폰을 놓은 보관함의 번호를 나타내는 N개의 정수 Xi가 공백을 사이에 두고 주어진다. ( - 109 ≤ Xi ≤ 109)
휴대폰의 위치가 서로 겹치거나 스타트한별 사옥과 같은 곳에 있을 수 있다.
모든 입력 값은 정수이다.
첫 줄에 고객 N명의 미션을 모두 수행하고 복귀하기 위해 필요한 최소 이동 거리를 출력한다.
정답이 정수가 아닌 경우, 정답보다 작거나 같은 가장 큰 정수를 출력한다.
3 5-8 1 5
36
아래 방법을 사용하는 게 최적이다.
동서로 무한히 길게 뻗은 UCPC 도로에 1의 간격으로 무한히 많은 화분을 놓아 민들레 화단을 만들었다. 모든 화분에는 정수 번호가 매겨져 있는데, 0번 화분을 기준으로 동쪽으로 k만큼 떨어진 화분의 번호는 k번, 서쪽으로 k만큼 떨어진 화분의 번호는 - k번이다. 각 화분에는 최대 한 송이의 민들레만 자랄 수 있다.
민들레는 바람이 불면 그 방향으로 1만큼 떨어진 화분에 홀씨를 날린다. 심거나 바람에 날려 화분에 떨어진 민들레 씨는 그 화분에 다른 민들레가 없으면 빠르게 자라나 다음 날이면 홀씨를 날릴 수 있게 된다. 각 민들레마다 홀씨는 충분히 많아 다 떨어지는 일은 없다.
시우는 로봇을 이용해 N일에 걸쳐 민들레 화단을 관찰하려 한다. 로봇은 화단을 관찰하는 동안 매일 하루에 하나씩 명령을 입력받아 수행한다. 로봇이 수행할 수 있는 명령의 종류는 다음과 같다.
화단 관찰을 시작하기 전에는 0번 화분에만 민들레 한 송이가 심겨 있다. 시우가 N일 동안 로봇에게 요청한 명령의 목록이 주어졌을 때, 명령를 수행하는 프로그램을 작성하시오.
첫 줄에 명령의 수 N이 주어진다. (1 ≤ N ≤ 200 000)
둘째 줄부터 N개의 줄에 걸쳐 한 줄에 하나씩 명령이 주어진다. 그중 i번째 명령은 로봇이 i일에 처리해야 하는 명령을 의미한다. (1 ≤ i ≤ N)
명령 중 Q는 하나 이상 있다.
명령으로 Q가 주어진 날마다, 그날 민들레가 있는 화분의 개수를 한 줄에 하나씩 시간순으로 출력한다.
13LC 4LQC 2QRC 7RQRRQ
5 6 11 13
N개의 동전이 일렬로 놓여 있다. 각 동전은 앞면이나 뒷면이 보이도록 놓여 있다.
당신은 다음의 조작을 원하는 만큼 반복할 수 있다.
앞면이 보이는 동전을 뒤집으면 뒷면이, 뒷면이 보이는 동전을 뒤집으면 앞면이 보이게 된다.
각 동전의 상태가 주어질 때 모든 동전을 앞면이 보이도록 놓을 수 있는지 판단하고, 가능하다면 그렇게 하기 위해 필요한 조작의 최소 횟수를 구하시오.
첫 줄에 테스트 케이스의 개수 T가 주어진다. (1 ≤ T ≤ 10 000)
테스트 케이스의 첫 줄에는 동전의 개수 N이 주어진다. (1 ≤ N ≤ 1 000 000)
테스트 케이스의 둘째 줄에는 각 동전의 상태를 나타내는 길이 N의 문자열 S가 주어진다. 모든 1 ≤ i ≤ N에 대해, S의 i번째 문자는 i번째 동전이 앞면인 경우 H, 뒷면인 경우 T이다.
모든 테스트 케이스에 대한 N의 총합은 1 000 000을 넘지 않는다.
각 테스트 케이스에 대해, 주어진 상태에서 모든 동전을 앞면이 보이도록 하기 위해 필요한 조작의 최소 횟수를 한 줄에 출력한다. 불가능하다면 - 1을 대신 출력한다.
25HTHHT2HT
3 -1
승연이는 나무를 심으려 한다. 이를 위해 무한 격자 위에서 몇 개의 칸을 골라 나무 씨앗을 뿌릴 것이다. 나무 씨앗에는 신비한 힘이 있어, 주변 나무 씨앗의 영향을 받아 사과나무 혹은 복숭아나무 중 하나로 자라난다.
씨앗이 자라 어떤 나무가 되는지는 다음 규칙을 따른다. 변을 맞댄 두 칸에 모두 씨앗이 있다면 그 두 씨앗을 서로 인접하다고 한다. 인접한 씨앗의 수가 짝수인 씨앗은 사과나무가 된다. 반면 인접한 씨앗의 수가 홀수인 씨앗은 복숭아나무가 된다.
승연이가 위와 같이 5개의 씨앗을 심었다고 하자. 서로 인접한 씨앗은 파란색 화살표와 같이 나타난다. 가운데 씨앗은 3개의 씨앗과 인접해 있으므로 복숭아나무가 된다.
결과적으로 위와 같이 3개의 사과나무와 2개의 복숭아나무가 열리게 된다.
씨앗을 심을 때는 씨앗들이 격자에서 모두 연결되어 있어야 한다. 즉 임의의 두 씨앗에 대해, 서로 인접한 씨앗만 거쳐서 두 씨앗 사이를 이동할 수 있어야 한다. 예를 들어 아래와 같은 배치는 불가능하다.
승현이는 사과나무 A개, 복숭아나무 B개를 심으려 한다. 이것이 가능한지 여부와, 가능하다면 나무 배치를 출력하라.
첫 줄에 음이 아닌 정수 A, B가 공백을 사이에 두고 주어진다. (A ≥ 0; B ≥ 0; 1 ≤ A + B ≤ 200)
첫 줄에, 배치가 가능하다면 YES를, 아니면 NO를 출력한다.
배치가 가능할 경우, 둘째 줄에 행과 열의 수 R와 C를 공백을 사이에 두고 출력한다. (1 ≤ R, C ≤ 200)
셋째 줄부터 R개의 줄에 걸쳐, 각 줄에 C개의 문자를 공백 없이 출력한다. 각 문자는 O 혹은 . 중 하나이며, 씨앗이 있는 자리에 O, 없는 자리에 .를 출력한다.
3 2
YES 3 3 .OO OOO ...
1 0
YES 1 1 O
7 0
YES 3 3 .OO OOO OO.
8 0
YES 4 4 .... .OOO .O.O .OOO
9 0
NO
0 7
NO