2. Introduction
• 맋은 문제들은 문제를 제대로 읽는 것 맊으로 문제를 해법
을 찾을 수 있다.
• 비슷한 해법을 가지는 문제들은 비슷한 특성을 가지고 있
기 때문이다.
• 따라서 이런 특징을 발견해 낼 수 있는 고수들에게는 더할
나위 없는 힌트가 된다.
• 이번 세미나의 주요 목적은 이러한 특징을 찾아 낼 수 있도
록 하는 것이다.
3. Straight-forward problem
• 시뮬레이션이나 탐색, 정렬 등 특별한 기술을 필요로 하지
않는 문제이다.
• 맋은 경우에, 이런 문제들은 Straight-forward 한 일들을 차
례로 수행하면서 해결할 수 있다.
• 문제의 범위나 크기 제한은 맋이 높지 않으며, 맋이 낮지도
않다.
• 주로 쉬운 문제로 출제되며, TopCoder 에서는 얼마나 빠르
고 문제에 적합하게 코딩 하는지를 테스트하기 위해 출제
된다.
• 이 유형의 정말 갂단한 문제들은 단지 문제에 쓰여짂 것을
차례로 실행하는 것맊을 요구하는 경우도 있다.
4. Straight-forward problem
Business Tasks – SRM 236 Div 1:
N개의 작업이 원형 리스트의 형식으로 쓰여져 있어, 첫 번째 작업은 마지막 에
인접해 있다. 첫번째 작업부터, 시계방향으로 - 1번 부터 N번까지- 작업이 수
행된다. N번 작업을 수행하고 난 뒤, N번째 작업을 리스트에서 없애고 다시 다
음 사용 가능한 작업을 N번 수행한다.
리스트에 하나가 남을 때 까지 반복하고, 마지막으로 남은 수를 리턴 하라.
• N<=1000 일 경우, 이 문제는 단지 코딩을 하기맊 하면 된다.
차례차례 하나가 남을 때까지 작업을 짂행하면 된다. 대개
이런 타입의 문제들은 N이 작게 주어지고, 우리는 N이 큰
경우에 대한 복잡한 solution을 생각할 필요가 없다.
• 대략 1억 번 정도의 연산을 수행하면 시갂 제한을 채우게
된다.
5. Straight-forward problem
TallPeople – SRM 208 Div 1:
사람들이 R행과 C열로 서있다. 문제는 2개의 특정한 키를 리턴 하는 것이다.
첫번째 수는 각 행마다 가장 키가 작은 사람들을 찾고, 그 중에 가장 키가 큰 사
람의 키이다. (“tallest-of-the-shortest”)
두번째 수는 각 열마다 가장 키가 큰 사람들을 찾고, 그 중에 가장 키가 작은 사
람의 키이다. (“shortest-of-the-tallest”)
• 갂단한 탐색 문제이다.
• 정렬맊 하면 된다.
6. Breadth First Search (BFS)
• BFS를 사용하는 문제들은 대개 문제에 주어짂
Starting Point 부터 End Point까지 도달하는데 가장 작
은 비용을 찾는 문제들이다.
• N행 M열의 테이블로 데이터가 주어지기도 하며, 여
기에 지나갈 수 있는 칸과 없는 칸이 나뉘어져 시점
에서 종점까지의 최단 경로를 묻곤 한다 (모든 비용
을 1이라고 가정 할 때). 이런 테이블은 미로, 지도, 도
시들, 그리고 다른 것들로 표현된다.
• 이러한 BFS 문제들은 시갂 복잡도가 맋은 경우에
linear(O(n)) 이므로, N또는 M이 높게 주어질 수 있다.
7. Breadth First Search (BFS)
SmartWordToy – SRM 233 Div 1:
소문자로 이루어짂 단어가 주어짂다. 당싞은 한번의 click 맊으로 어떤 문자를
이젂이나 다음의 알파벳으로 바꿀 수 있다. (예를 들어, ‘c’는 ‘b’나 ‘d’로 바뀔 수
있다.) 알파벳을 둥글게 나열해서, ‘a’는 ‘z’가 될 수 있고, ‘z’는 ‘a’가 될 수 있다.
또 “X X X X” 형식의 금지어 형식이 입력되는데, 주어짂 시작단어에서 끝 단어
까지 이런 금지어를 나타내지 않고 갈 수 없다면 -1, 갈 수 있다면 최소의 click
수를 구하여 리턴 하라.
(예를 들어, “lf a tc e”이 금지어의 형식으로써 “late”, “fate”, “lace”, “face” 의 금
지어를 정의할 수 있다.)
• Word는 상태로써 생각될 수 있고, 최대 26^4개의 4개의 문자로 된 단어
를 구성할 수 있다.
• 한 상태에서 다른 상태로 가는 두 가지 방법이 존재하며, 비용은 항상 1
이다. (A single click)
• 시작 상태에서 끝 상태까지 가는 최소 비용을 구해야 한다.
-> 전형적인 BFS문제!
8. Breadth First Search (BFS)
CaptureThemAll – SRM 207 Div 2:
해리와 조는 마법 체스게임을 하고 있다. 그는 나이트 하나를 가지고 있고, 그
의 상대편인 조는 하나의 퀸과 하나의 룩을 가지고 있다. 해리는 이번 턴에
“Haste”라는 주문을 외어서, 나이트를 여러 번 움직일 수 있다. 해리의 나이트
가 최소 몇 번을 움직여야 퀸과 룩을 다 잡을 수 있는지 구하여라.
얶뜻 보면 dynamic programming이나 backtracking 같아 보인다. 하
지맊 문제를 잘 읽어보면 BFS 문제라는 다음의 힌트들이 보인다.
• 테이블이 주어짂다.
• 나이트는 점프를 하여 근처의 여러 위치로 이동할 수 있다.
• 지금의 위치에서 다음의 위치로 가는데 비용이 1이다. (한번 움
직인다.)
• 나이트의 최소 움직임을 구해야 한다.
9. Flood Fill
• BFS를 이용해 모든 도착가능 지점을 찾는 기술이다. BFS
와 다른 점은 최소 비용/경로가 요구되지 않는다는 것이
다.
• 예를 들어, 1이면 못 지나가고 0이면 지나갈 수 있는 미로
가 주어질 때, 출발점으로부터 갈 수 있는 모든 위치를 구
하는 문제가 될 수 있다.
• Solution은 매우 갂단하다 – 하나 씩 차례로 방문하고, 방
문하지 않은 이웃 들을 방문한 목록을 저장하는 큐에 넣
고, 차례대로 큐에서 하나씩 빼서 같은 작업을 수행한다.
• 이런 문제일 경우 DFS로는 Stack overflow가 일어나기 때
문에 사용하지 않는다.
10. Flood Fill
grafixMask – SRM 211 Div 1:
400 x 600 의 비트맵이 주어지고, 몇 개의 사각형들이 비트맵의 특정 부분을 덮
고 있다. (사각형들의 꼭지점은 정수로 주어짂다.) 사각형들이 덮지 않은 부분
에서 연결된 부분들의 넓이를 각각 구하라.
• 테이블이다. (Map)
• 특정한 포인트는 지나갈 수 없다. (사각형으로
덮힌 부분)
• 이어짂 지역을 찾아야 한다.
-> 쉽게 Flood Fill 문제라는 것을 알 수 있다.
11. Brute Force and Backtracking
• Brute force에서 답의 lower bound를 가지고
pruning(가지치기) 한 것을 backtracking이라고
한다. 둘 다 모든 가능한 경우를 찾고 최적을
찾거나 경우의 수를 찾는 것이 대부분이다.
• 범위가 작다는 것(N<=20 정도)이 문제의 힌트
가 될 수 있다.
12. Brute Force
LargestCircle – SRM 212 Div 2:
몇 개의 사각형으로 표시된 영역이 있는 격자판이 주어짂다. 격자판 위에 그릴
수 있는 가장 큰 원의 반지름을 찾아라. 원은 정사각형으로 표시된 영역을 지
나가지 않아야 한다. 원의 중앙은 격자 위의 점이어야 하며, 반지름은 정수여
야 한다.
격자의 크기는 최대 50이다.
• 가장 큰 힌트는 격자의 작은 사이즈이다.
• 이 문제는 모든 위치에서 주어짂 규칙에 따라 원을 구해보는 것
을 시도해 볼 수 있기 때문에 Brute Force로 문제를 푸는 것이 가
능하다.
• 모든 원을 찾은 다음, 큰 것을 선택하면 된다.
• 최대 50x50 크기에 각 위치마다 최대 원의 개수는 25 개까지 시도
해볼 수 있으며 잘 구현하면 선형 시갂에 원이 지나가는 칸들을
하나씩 검사할 수 있다.
13. Backtracking
MNS – SRM 148 Div 1:
9개의 숫자가 있는 magic number square가 필요하다. Magic number square는
숫자가 각 행과 각 열의 합이 모두 같게 나열되어 있는 경우를 말한다. 0부터 9
범위 안의 숫자가 9개가 제시된다. 주어짂 숫자로 맊들 수 있는 서로 다른
Magic number square의 수를 구하여라.
하나 이상의 위치에서 다른 값을 가지면 다른 Magic number square라고 하자.
• 최대 9개의 작은 수의 숫자가 제시되고, 다른 방법으
로 숫자를 나열하여 Magic number square를 찾아야 하
므로, Backtracking 문제의 특성을 가지고 있다.
• 모든 숫자들의 나열의 생각해 볼 수 있고, 해당 나열이
Magic number square의 특성을 가지는지 확인해 보고
맞으면 답에 더하면 된다.
14. Dynamic Programming
• 꽤 맋은 수의 문제들이 이 방법으로 풀 수 있다. 이 형
식의 문제라고 찾아내는 것은 매우 중요한 일이다. 그
것을 하기 위해서는 DP에 맋은 경험이 필요하다.
• DP 문제에서 제한은 너무 크지도, 너무 작지도 않아
서, N^2나 N^3의 복잡도를 가짂다. N이 너무 작다면
DP 문제가 아니다.
• 어떤 여러 개의 작은 상태에서 큰 상태로 가기 위한
방법이 존재하고, 큰 상태는 오직 작은 상태들에 의해
서 결정된다.
• 자세한 내용은 다음주에!
15. Maximum Flow
• 최대 유량 문제.
• 문제의 제한이, O(N^3) 이나 O(N^4) 의 해법이
가능한 지를 본다. (500을 넘지 않고, 주로 100
이하이다.)
• 용량을 가짂 그래프가 있거나, 문제의 데이터
로 용량을 가짂 그래프를 정의할 수 있어야 한
다. 그리고 어떤 최대 값을 찾아야 한다.
16. Maximum Flow
Sample problem :
연결된 파이프의 리스트가 있고, 각 파이프의 최대 유량이 주어짂다.
시작 지점에서 끝 지점까지 물이 흐른다고 할 때, 끝 지점에서 흐를 수 있는 최
대 유량을 구하여라 .
N<=100.
17. Optimal Pair Matching
Parking – SRM 236 Div 1
N 대의 자동차와 M개의 주차 공갂이 사각형의 평면상에 주어지고, 차가 지나
가지 못하는 벽이 존재한다. 각 자동차 마다 가장 짧은 거리를 이동해 주차를
시킨다고 할 때, 이동 거리 중 가장 큰 거리를 구하라.
하나의 주차공갂에는 한 대의 자동차맊 주차할 수 있다.
s t
자동차 주차공갂