Upload
hyunjeong-kim
View
3.829
Download
6
Embed Size (px)
Citation preview
2016예선문제풀이
A. 새벽을 달려서
• char는 최대 8bit 정수까지 나타낼 수 있는 자료형이다.
• char형에 문자를 저장하더라도, ASCII코드와 같은 정수로 저장된다.
• 문자로 입력을 받고, 정수로 출력만 하면 된다.
출제자: 김현정
B. 2 Times Bestseller
• 20 ≤ bi,j ≤ 29 20 ≤ ai,j ≤ 29
• 문제1) 입력 멱수판 결정
• r < i인 모든 ar,c 가 결정되어 있으면, 가능한 ai,j값은 유일하다.
• ai,j = bi-1,j / (ai-1,j * ai-1,j-1 * ai-1,j+1 * ai-2,j)
• 1열의 멱수 배치에 따라 멱수판을 만들 수 있는지 정해진다.
• 1열의 멱수 배치에 따라 전체 입력이 정해진다.
• 1열을 배치하는 경우의 수: 10 × 10 × 10 × 10 × 10
출제자: 김현정
… ai-2,j …
ai-1,j-1 ai-1,j ai+1,j-1
… ai,j
B. 2 Times Bestseller
• 문제2) 규칙을 만족하는 제일 첫 번째 멱수판
• X = 00000, 00001, 00002 … 10000, 10001 … 99998, 99999
• n[0][0] = ten thousands, n[0][1] = thousands, n[0][2] = hundreds, n[0][1] = tens, n[0][0] = units• n[i][j]: a[i][j]의 지수
• 가능한 첫 X로 만들어진 멱수판이 답이 된다.
• 시간복잡도: O(Nmin(r,c))
• N: 가능한 멱수의 개수
출제자: 김현정
C. 크리스마스 전구
• 문제 요약
• N개의 전구와 그 전구 중 일부를 켜고 끄는 M개의 스위치가 있다.
• 스위치 하나를 누를 경우 그 스위치에 연결된 전구들의 상태가 바뀐다.
• 스위치들 중 일부는 과부하 스위치로,과부하 스위치 2개 이상이 같은 전구에 전류를 공급하게 될 경우 전구가 폭발한다.
• 스위치들 이용해 전구를 키고 끈 상태 조합을 Q개 만들려고 한다.
• 각각의 경우에 대해 최소로 필요한 스위치의 개수는?만약 불가능한 경우에는 -1을 출력한다.
• (1 ≤ N, M ≤ 20, 1 ≤ Q ≤ 10000)
출제자: 이주명
C. 크리스마스 전구
• 각각의 스위치가 켤 수 있는 전구를 bitmasking을 통해 바꿔준다.
• M개의 스위치가 있으므로, 만들 수 있는 조합의 수는 2M(≤1048576)이다.
• 문제1) 각 경우에 켜지는 전구
• 켜져 있는 스위치가 켤 수 있는 전구를 XOR 연산한다.
• 문제2) 2개 이상의 과부하 스위치
• 공업용 스위치를 위한 추가 state를 만든다.
• 해당 state는 OR연산을 취하며, AND연산을 취했을 때 0이 아니라면 두 개가 동시에 연결된 경우이다.
출제자: 이주명
C. 크리스마스 전구
• 전체 전구로 만들 수 있는 조합의 수도 2N(≤1048576)으로,
모든 경우를 저장하더라도 메모리 제한에 걸리지 않는다.
• 가능한 모든 답을 구해두고, 이후 들어오는 쿼리에 맞게 저장해둔 결과를 출력한
다.
• 시간복잡도: O(N × M + M × 2M + q)
출제자: 이주명
D. BOJ 거리
• ‘B’는 ‘J’ 다음에만 올 수 있다.
• ‘O’는 ‘B’ 다음에만 올 수 있다.
• ‘J’는 ‘O’ 다음에만 올 수 있다.
출제자: 최백준
D. BOJ 거리
• D[1001]
• D[i]: i번째 보도블럭까지 올 때 필요한 최소 에너지
• D[i] = min(∀(D[j] + (I – j)2))
• j: i 전에 밟을 수 있는 모든 보도블럭
• 시간복잡도: O(N2)
출제자: 최백준
E. 어떤 색일까?
• 조건문 노가다는 좋지 않습니다.
• 배열을 사용해 좀 더 편하게 구현해봅시다.
출제자: 김현정
E. 어떤 색일까?
• R = 1(2), G = 10(2), B = 100(2) 일 때, 다른 색은 이 색들의 조합이다.
• color[1] = ‘R’, color[2] = ‘G’, color[4] = ‘B’
• color[5] = ‘M’, color[3] = ‘Y’, color[6] = ‘C’, color[7] = ‘W’
출제자: 김현정
R001
G010
B100
M101
Y011
C110
W111
E. 어떤 색일까?
• 색의 번호는 OR연산을 이용하면 쉽게 구할 수 있다.
• bit[‘R’] = 1, bit[‘G’] = 2, bit[‘B’] = 4
• num[i][j] = (bit[Ai,j] | bit[Ai-1,j] | bit[Ai,j-1] | bit[Ai+1,j] | bit[Ai,j+1])
• answer[i][j] = color[num[i][j]]
출제자: 김현정
Ai-1,j
Ai,j-1 Ai,j Ai,j+1
Ai+1,j
F. Red and Blue
• 이 문제를 쉽게 풀 수 있는 이유
• N ≤ 10 모든 조합이 10! 밖에 되지 않는다.
• 세 점이 한 직선상에 있지 않다선 위에 다른 점이 있는 경우가 없다
1. 빨간점 N개와 파란점 N개의 N!가지 조합을 모두 조사하자.
2. 선분끼리 교차하는 조합은 모두 버리고
3. N개의 선분의 길이 중 최대값 들 중 최소값을 구한다!
출제자: 장홍준
F. Red and Blue
• 두 선분의 교차 여부는 CCW를 이용해서 확인할 수 있다
출제자: 장홍준
CCW(Counter/Clock Wise)란?백터의 외적을 응용해 한 직선과 한 점의 위치 관계를 알 수 있다.
A
B C
D
𝐶𝐶𝑊 𝐴, 𝐵, 𝐶 = 𝑥𝑎 ∙ 𝑦𝑏 + 𝑥𝑏 ∙ 𝑦𝑐 + 𝑥𝑐 ∙ 𝑦𝑎 - 𝑥𝑎 ∙ 𝑦𝑏 + 𝑥𝑏 ∙ 𝑦𝑐 + 𝑥𝑐 ∙ 𝑦𝑎
𝐶𝐶𝑊 𝐴, 𝐵, 𝐶 값이 …- 0이다 : 직선 A->B에 대해 점 C가 일직선상에있다.- 0보다 작다 : 점 C가 A->B직선에 대해 왼쪽(반시계)방향에 있다- 0보다 크다 : 점 C가 A->B직선에 대해 오른쪽(시계)방향에 있다
문제 조건상 CCW(A,B,C)가 0인 경우는 나오지 않는다
F. Red and Blue
• 그 말은… 짜잔!!
출제자: 장홍준
A
B C
D
𝐶𝐶𝑊 𝐴, 𝐵, 𝐶 × 𝐴𝐵𝐶 𝐴, 𝐵, 𝐷 < 0&& 𝐶𝐶𝑊 𝐶,𝐷, 𝐴 × 𝐶𝐶𝑊 𝐶, 𝐷, 𝐵 < 0 이면
직선 A-B와 C-D는 교차한다.
선분의 교차 검증은 참 쉽죠?
모든 조합을 검사하고, 교차가 발생한 조합을 제외한 후 모든 직선의 길이를비교하면 된다!
G. 중앙값 큐
• Priority Queue를 사용한다
• log2 𝑛 만에 집합에서 최소값과 최대값을 쉽게 구할 수 있다!
• 하지만 중앙값은?
• Priority Queue는 하나의 기준으로만 정렬되기 때문에 직접 구할 수 없다
출제자: 김동이
G. 중앙값 큐
• 숫자들이 정렬되어있다고 가정하면 중앙값은 다음의 규칙을 가진다.
• 중앙값은 작은 쪽 반 그룹에 대해서는 최대값이 된다.
• 또한 큰 쪽 반 그룹에 대해서는 최소값이 된다.
• 중앙값이 아닌 숫자들의 정렬 상태는 그다지 중요하지 않다.
출제자: 김동이
… m …
G. 중앙값 큐
• N개의 데이터를 정확히 절반으로 나누어 두 힙에 넣자.
• 이 때 Max Heap의 최대값이 Min Heap의 최소값 이하가 되도록 하자
• 이상태가 유지 되면 항상 Max Heap의 최대값이 전체의 중앙값이 된다.
출제자: 김동이
Max Heap Min Heap
G. 중앙값 큐
• SIZE:
• 단순히 두 힙의 사이즈를 더하면 된다
• POP:
• Max Heap에서 데이터를 하나 제거한다. Max Heap이 Min Heap보다원소의 수가 적다면, Min Heap의 데이터를 하나 빼서 Max Heap에 넣어주자
• PUSH:
• Max Heap의 최대값, Min Heap의 최소값, X 세 수를 적당히 정렬하여두 힙에 분배해준다.
출제자: 김동이