4 min read

2021 제 2회 세종정보올림피아드 예선 후기

2021 제 2회 세종정보올림피아드 예선 후기

하라는 한국정보올림피아드는 안하고!


아무튼 세종정보올림피아드가 끝났으니 예선 후기글을 써보려 합니다.

후기


이게 예선이 맞나? 정말 가슴이 웅장해진다.....
세종과학예술영재고는 전설이다....
내가 알던 그 세과영이 맞나?
맞는거같다....


일단 제 닉은 HS7251이었고, OI순위기준 4등 먹었습니다.
분명 HS3830이 펜타곤형이겠지 흑흑흑흑흑

:blobsad:


A. 삼각형 만들기

a, b, c 중 가장 큰 변을 a로 두고 a>b+c인지 체크하면 된다.

B. 합격자의 수는?

for문 돌리자....

C. 세종이를 찾아라

arr[i] == 'S' && arr[i+1] == 'J'

D. 시간 계산

시간을 분단위로 환산하고
처리해준뒤에 잘 나눠주면 된다.

E. 수의 개수

10으로 나눈 나머지가 3인지 체크하고
10으로 나눠서 자릿수를 하나씩 없앤다
그다음 map<int,int> 에 박아서 숫자 개수를 세주었다.

F. D-Day 계산

달이 같으면 날짜만 빼서 계산해주면 되고
달이 다르면
(해당 달 날짜 - 시작날짜) + 사이의 달 날짜들 + 끝나는날짜

G. 연락망

dfs를 돌려주면서
vis배열 초기화 없이 체크하고
방문한적이 없다면 1을 반환.
1의 갯수세기 문제가 된다

H. 도시락가게

하아니 이걸 왜 못풀죠(1)
도시락만들때 걸리는 최대시간을 123456789123LL으로 잡고
최소시간을 1으로 잡아준 다음
이분탐색해주면 된다...
도시락개수는 그냥 mid / arr[i]

I. 사탕 가져오기

그냥 DFS돌렸습니다
-1 케이스만 잘 구분해주세요

J. 숫자 회전

for(int i=0; i<n; i++){ printf("%c", s[(n*1000 + i - r) % n]); }

한줄컷!
r은 회전수고
%n을 통해서 범위밖에 안넘어가게 해준다음
음수인덱스 안되게
%n했을때 0이되는 큰수 n*1000을 더해줌

K. LED 파도타기

아까 E번이랑 비슷한 문제
나누는 / 나눈 나머지를 구하는 수 K가 10이 아니라 입력받는 수 N+1이라는것만
이해하면 쉽다.

void f(int t, int n){
  if(t==0) return;
  f(t/n,n);
  printf("%c", t%n==0?'0':'A'+ t%n -1 );
  return;
}

L. 동전 나열하기

DP 구현문제
dp[i][j] => j번째 동전을 뒤집었을때 i는 0,1 => 0은 앞, 1은 뒤일때의 경우의수

dp[0][i] = dp[0][i-1] + dp[1][i-1]; dp[1][i] = dp[0][i-1];

M. 보석 집게

하아니 이걸 왜 못풀죠(2)
일단 최댓값 / 최솟값 세그트리를 통해 한 구간 s,e 에서의 (최대-최소) 크기를 구함
이 크기를 구하는데 logN,
투 포인터 알고리즘 박으면 2N
시간복잡도는 O(NlogN) 되시겠다.

while(s<=e && e<=n){
  int mindata = querymin(1,1,n,s,e);
  int maxdata = querymax(1,1,n,s,e);
  //printf("{%d %d %d}\n", s,e, maxdata-mindata);
  if(maxdata-mindata <= k){
    maxv = max(maxv, (e-s+1));
    e++;
  }
  else s++;
}

N. 세종이의 보물찾기

S->T로 bfs후 거리저장,
T->G로 bfs후 거리저장
두개 더해주면 답이다.

O. 세종이의 보물찾기2

일단 입력이 참 깔끔하게도 이진트리형식으로 주어지기때문에
그대로 배열에 박아도 트리가 됨.
배열에 넣어주고 bfs한번 돌려주면 된다.


시대회인데 만점자가 11명쯤 나오는거 보면
어지간히 쉬운 셋이었음
"사전지식"을 요구하는 M번 문제 빼고는
그냥 다 무난무난하니 풀만했다.

OI순위탭을 세과영이 다먹었다던데
제발 시대회 상장 하나만 남겨주세요.....