Top Banner
2016 예선문제 풀이
19

shake! 2016 예선 문제 풀이

Jan 07, 2017

Download

Software

HYUNJEONG KIM
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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 세 수를 적당히 정렬하여두 힙에 분배해준다.

출제자: 김동이