19
2016 예선문제 풀이

shake! 2016 예선 문제 풀이

Embed Size (px)

Citation preview

Page 1: shake! 2016 예선 문제 풀이

2016예선문제풀이

Page 2: shake! 2016 예선 문제 풀이

A. 새벽을 달려서

• char는 최대 8bit 정수까지 나타낼 수 있는 자료형이다.

• char형에 문자를 저장하더라도, ASCII코드와 같은 정수로 저장된다.

• 문자로 입력을 받고, 정수로 출력만 하면 된다.

출제자: 김현정

Page 3: shake! 2016 예선 문제 풀이

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

Page 4: shake! 2016 예선 문제 풀이

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: 가능한 멱수의 개수

출제자: 김현정

Page 5: shake! 2016 예선 문제 풀이

C. 크리스마스 전구

• 문제 요약

• N개의 전구와 그 전구 중 일부를 켜고 끄는 M개의 스위치가 있다.

• 스위치 하나를 누를 경우 그 스위치에 연결된 전구들의 상태가 바뀐다.

• 스위치들 중 일부는 과부하 스위치로,과부하 스위치 2개 이상이 같은 전구에 전류를 공급하게 될 경우 전구가 폭발한다.

• 스위치들 이용해 전구를 키고 끈 상태 조합을 Q개 만들려고 한다.

• 각각의 경우에 대해 최소로 필요한 스위치의 개수는?만약 불가능한 경우에는 -1을 출력한다.

• (1 ≤ N, M ≤ 20, 1 ≤ Q ≤ 10000)

출제자: 이주명

Page 6: shake! 2016 예선 문제 풀이

C. 크리스마스 전구

• 각각의 스위치가 켤 수 있는 전구를 bitmasking을 통해 바꿔준다.

• M개의 스위치가 있으므로, 만들 수 있는 조합의 수는 2M(≤1048576)이다.

• 문제1) 각 경우에 켜지는 전구

• 켜져 있는 스위치가 켤 수 있는 전구를 XOR 연산한다.

• 문제2) 2개 이상의 과부하 스위치

• 공업용 스위치를 위한 추가 state를 만든다.

• 해당 state는 OR연산을 취하며, AND연산을 취했을 때 0이 아니라면 두 개가 동시에 연결된 경우이다.

출제자: 이주명

Page 7: shake! 2016 예선 문제 풀이

C. 크리스마스 전구

• 전체 전구로 만들 수 있는 조합의 수도 2N(≤1048576)으로,

모든 경우를 저장하더라도 메모리 제한에 걸리지 않는다.

• 가능한 모든 답을 구해두고, 이후 들어오는 쿼리에 맞게 저장해둔 결과를 출력한

다.

• 시간복잡도: O(N × M + M × 2M + q)

출제자: 이주명

Page 8: shake! 2016 예선 문제 풀이

D. BOJ 거리

• ‘B’는 ‘J’ 다음에만 올 수 있다.

• ‘O’는 ‘B’ 다음에만 올 수 있다.

• ‘J’는 ‘O’ 다음에만 올 수 있다.

출제자: 최백준

Page 9: shake! 2016 예선 문제 풀이

D. BOJ 거리

• D[1001]

• D[i]: i번째 보도블럭까지 올 때 필요한 최소 에너지

• D[i] = min(∀(D[j] + (I – j)2))

• j: i 전에 밟을 수 있는 모든 보도블럭

• 시간복잡도: O(N2)

출제자: 최백준

Page 10: shake! 2016 예선 문제 풀이

E. 어떤 색일까?

• 조건문 노가다는 좋지 않습니다.

• 배열을 사용해 좀 더 편하게 구현해봅시다.

출제자: 김현정

Page 11: shake! 2016 예선 문제 풀이

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

Page 12: shake! 2016 예선 문제 풀이

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

Page 13: shake! 2016 예선 문제 풀이

F. Red and Blue

• 이 문제를 쉽게 풀 수 있는 이유

• N ≤ 10 모든 조합이 10! 밖에 되지 않는다.

• 세 점이 한 직선상에 있지 않다선 위에 다른 점이 있는 경우가 없다

1. 빨간점 N개와 파란점 N개의 N!가지 조합을 모두 조사하자.

2. 선분끼리 교차하는 조합은 모두 버리고

3. N개의 선분의 길이 중 최대값 들 중 최소값을 구한다!

출제자: 장홍준

Page 14: shake! 2016 예선 문제 풀이

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인 경우는 나오지 않는다

Page 15: shake! 2016 예선 문제 풀이

F. Red and Blue

• 그 말은… 짜잔!!

출제자: 장홍준

A

B C

D

𝐶𝐶𝑊 𝐴, 𝐵, 𝐶 × 𝐴𝐵𝐶 𝐴, 𝐵, 𝐷 < 0&& 𝐶𝐶𝑊 𝐶,𝐷, 𝐴 × 𝐶𝐶𝑊 𝐶, 𝐷, 𝐵 < 0 이면

직선 A-B와 C-D는 교차한다.

선분의 교차 검증은 참 쉽죠?

모든 조합을 검사하고, 교차가 발생한 조합을 제외한 후 모든 직선의 길이를비교하면 된다!

Page 16: shake! 2016 예선 문제 풀이

G. 중앙값 큐

• Priority Queue를 사용한다

• log2 𝑛 만에 집합에서 최소값과 최대값을 쉽게 구할 수 있다!

• 하지만 중앙값은?

• Priority Queue는 하나의 기준으로만 정렬되기 때문에 직접 구할 수 없다

출제자: 김동이

Page 17: shake! 2016 예선 문제 풀이

G. 중앙값 큐

• 숫자들이 정렬되어있다고 가정하면 중앙값은 다음의 규칙을 가진다.

• 중앙값은 작은 쪽 반 그룹에 대해서는 최대값이 된다.

• 또한 큰 쪽 반 그룹에 대해서는 최소값이 된다.

• 중앙값이 아닌 숫자들의 정렬 상태는 그다지 중요하지 않다.

출제자: 김동이

… m …

Page 18: shake! 2016 예선 문제 풀이

G. 중앙값 큐

• N개의 데이터를 정확히 절반으로 나누어 두 힙에 넣자.

• 이 때 Max Heap의 최대값이 Min Heap의 최소값 이하가 되도록 하자

• 이상태가 유지 되면 항상 Max Heap의 최대값이 전체의 중앙값이 된다.

출제자: 김동이

Max Heap Min Heap

Page 19: shake! 2016 예선 문제 풀이

G. 중앙값 큐

• SIZE:

• 단순히 두 힙의 사이즈를 더하면 된다

• POP:

• Max Heap에서 데이터를 하나 제거한다. Max Heap이 Min Heap보다원소의 수가 적다면, Min Heap의 데이터를 하나 빼서 Max Heap에 넣어주자

• PUSH:

• Max Heap의 최대값, Min Heap의 최소값, X 세 수를 적당히 정렬하여두 힙에 분배해준다.

출제자: 김동이