2009/12 4

2009 정보올림피아드 지역본선 문제 Review (5)

시험 당일에 5개의 문제 중 5번을 가장 쉽게 푼 것 같다. 중앙문자열 문자열에서 교체 연산은 문자열의 한 문자를 다른 문자로 바꾸는 연산이다. 예를 들어, 문자열 “computer”에서 4번째 문자 p를 m으로 교체하면 “commuter”가 된다. 같은 길이의 두 문자열 P와 Q의 거리 d(P,Q)는 P를 Q로 바꾸기 위한 교체 연산의 최소 개수로 정의된다. 예를 들어 P = “computers”, Q = “consumers”라 하면, P에서 3번째 문자 m을 n으로, 4번째 문자 p를 s로, 6번째 문자 t를 m으로 바꾸면 Q가 된다. 따라서 P와 Q 사이의 거리는 3이다. A, B, C를 같은 길이의 문자열이라 하자. 이 때 어떤 문자열 W의 반경 r(W)는 문자열 W와 문자열 A, B, C와의 거..

2009 정보올림피아드 지역본선 문제 Review (4)

복불복 1박2일 제작진은 다음과 같은 새로운 복불복 게임을 제안하였다. 먼저 게임을 하는 한 사람에게 K개의 조약돌을 주고, 숫자가 적혀있는 회전판을 N번 돌리게 한다. 게임을 하는 사람은 회전판을 돌려서 나오는 숫자만큼의 조약돌을 제작진에게 되돌려 주어야 한다. 회전판을 N번 돌리는 동안 제작진에게 줄 수 있는 조약돌이 있으면 게임을 하는 사람이 이기게 되고, 제작진에게 주어야 하는 조약돌이 모자라게 되면 게임에서 지게 된다. 회전판에는 T개의 숫자가 그려지고, 그려지는 숫자는 0 이상 T-1 이하의 정수 중 하나이다. 회전판에 사용되는 정수는 중복 사용이 가능하고, 0부터 T-1 사이의 정수 모두가 다 회전판에 나타나야 하는 것은 아니다. N과 K, 그리고 T와 회전판에 그려진 모든 숫자가 주어질 때..

2009 정보올림피아드 지역본선 문제 Review (3)-3

이 포스트에서는 지난번에 올린 소스 코드가 어떤 식으로 구성되었는지 설명해 보겠다. (참 빨리 올린다...=_=;) 사실 문제를 풀 만한 사람이라면 설명할 필요조차 없는 문제와 코드였다. 문제의 단서는 여기에 있다. 주어진 논을 N × N 행렬로 볼 때 형이 특정 열에서 할당받는 구역의 개수는 바로 왼쪽 열에서 받은 구역의 개수보다 크거나 같아야 한다.문제에서는 이것이 제약조건처럼 나왔다. 하지만 만약 이 조건이 없다면 최적의 조건을 찾기 위해서는, 프로그램은 위-아래로 나누는 모든 경우를 읽어야 한다. 만약 그렇다면 1열을 1개, 2개, …, n개까지 나누는 각각에 대해 2열을 1개, 2개, …, n개까지 나누고, 그런 작업을 n열에 이르기까지 했어야 한다. 각 열마다 동생에게 할당되는 칸(위에서부터 ..

2009 정보올림피아드 지역본선 문제 Review (3)-2

지난번에 문제를 3번까지 올리다 만 사실조차 까먹고 말았다가 이제 깨달았다. 알고 보니 내 컴퓨터에도 문제를 풀어 놓은 소스가 없었다. (난 뭐-_-지 ㅜㅠ) 시험기간 중간에 낀 주말이지만, 무시하고 지나가기에는 너무 큰 문제라서 손을 대기로 했다. 그리고 코딩 따위를 금방 끝냈다. #include #include #include char table[20][20]; char solution[20], solving[20]; int total = 0; int size; int diff_now, diff_best; void tablein(); void divide(char col); void checknow(); void makesol(); int uppersum(); void finish(); int mai..