한국정보올림피아드(KOI) 공부 시작하기

2020. 5. 1. 15:41PS/도전

서론


안녕하세요! 비키라입니다.

저는 2020/03/29부터 KOI 전국본선 고등부 1,2번 문제들을 본격적으로 풀었습니다. (도전 내용)

 

도전을 시작할 때 채점이 가능한 1,2번 문제들을 전부 풀자는 목표를 세웠고,  먼저 백준 온라인저지에

있는 모든 KOI 고등 1,2번 문제를 문제집에 정리하였습니다.

2019년 최신 문제부터 1997년 문제까지 차례대로 나열되어 있으며 편한 순서대로 풀면 됩니다.

 

오래된 문제들은 대부분 인터넷에서 풀이를 찾을 수 없었는데 이 경우 오랜 시간 풀이를 찾아 헤멨고, 그러다가 KOI 공식 풀이를 찾아, 이를 참고하여 공부했습니다.

 

한국정보올림피아드 전국본선 문제들을 공부하시는 분들을 위해 고등부 1,2번 문제의 풀이를 정리합니다.

 

구성은 아래와 같습니다.

1. 날짜

2. 문제

3. 핵심 아이디어와 풀이 링크

 

 

KOI 고등부 1,2번 정리


(※ 2020년 5월 31일 기준 백준 온라인 저지에서 채점 가능한 문제들입니다.)

- 제 블로그에 풀이가 없는 문제의 경우 다른 분의 블로그 풀이 링크를 걸었습니다

경고


어떤 문제이든 문제에 대한 충분한 고민을 하는 것이 먼저입니다.

맹목적으로 풀이를 먼저 읽고 공부하는 것은 문제 해결력에 거의 도움되지 않을 뿐더러, 스스로 생각하는 힘에 부정적 영향을 끼칠 가능성이 큽니다. 

이 글을 보시는 여러분이 KOI 문제에서 최대한 많은 것을 얻어가길 기원합니다.

사용법

1. 문제 이름을 누르면 문제 사이트로 연결됩니다.  문제를 읽고 충분히 이해합니다.

2. 풀 수 있을 때까지 풉니다. 너무 오랜 시간 동안 안 풀리면 이 글로 돌아와 풀이를 참고합니다.

3. 풀이의 핵심만 읽고 스스로 구현을 시도합니다.

4. 구현도 어렵다면 풀이의 소스코드를 모티브로 스스로 구현해봅니다..

5. 다른 사람의 소스코드를 참고하여 AC를 받았다면 반드시 풀이를 덮고 처음부터 끝까지 다시 구현해봅니다.

 

CTRL + F 누르고 원하는 연도/문제이름을 입력하시면 쉽게 찾을 수 있습니다.

 

2019년 1차대회

1번: 쇼핑몰

더보기

전형적인 우선순위 큐 활용 문제입니다.

잼코딩

 

 

2번: 점프

더보기

구간을 똑똑하게 쪼개어 DP를 해줍니다.

JusticeHui님 : https://justicehui.github.io/koi/2019/06/30/KOI19_1_H2/

 

2018년

1번: 화살표 그리기

더보기

정렬 후 1~n까지 훑어보면 됩니다.

IOI KOREA : https://www.youtube.com/watch?v=WhH4d7KpCVA&t=37s

 

 

 

2번: XCorr

더보기

누적합 배열과 lower_bound를 이용해 해결할 수 있습니다.

IOI KOREA : https://www.youtube.com/watch?v=hQs9jVQUYBY

 

2017년

1번: 물통 

더보기

BFS 문제인데, 한 물통은 무조건 꽉 차 있거나 비어 있을 수 밖에 없다는 것에서 착안한 풀이입니다.

IOI KOREA : https://www.youtube.com/watch?v=I_k8FDR0uiM&t=34s

 

 

2번: 문명

더보기

Union-Find로 BFS보다 빠르게 처리할 수 있습니다.

IOI KOREA : https://www.youtube.com/watch?v=0OjHIQvwR9M

 

2016년

1번: 리조트 

더보기

DP 문제입니다. 재귀함수로 매우 직관적으로 풀 수 있습니다.

JusticeHui님 : https://justicehui.github.io/koi/2018/10/30/BOJ13302/

 

 

2번: 주유소

더보기

다익스트라의 변형입니다. 다익스트라 알고리즘을 모른다면 먼저 공부하고 푸는 것이 훨씬 이해에 도움이 됩니다.

JusticeHui님 : https://justicehui.github.io/koi/2018/12/15/BOJ13308/

 

2015년

1번: 동전 게임 

더보기

이런 종류의 문제가 낯설다면 KOI 초등부 문제를 먼저 풀고 오는 것이 좋습니다.

시뮬레이션 문제입니다. 재귀/수식으로 해결 가능합니다.

마이구미님 : https://mygumi.tistory.com/305

 

 

2번: 구간 성분

더보기

vector 전체를 std::set에 넣거나, 해싱으로 해결 가능합니다.

https://howtoliveworldnice.tistory.com/36?category=831934

 

2014년

1번: 관중석

더보기

최대공약수 알고리즘을 이용해 서로소인지 탐색해주며 가능한 경우를 전부 탐색해도 되고, 조금 더 최적화 시킬 수도 있습니다.

sgc109님 : https://sgc109.tistory.com/108

 

 

2번: 버스 노선

더보기

라인 스위핑 문제인데 적절한 정렬과 케이스 분류가 중요합니다.

https://howtoliveworldnice.tistory.com/37?category=831934

 

2013년

1번: 사냥꾼

더보기

적절한 정렬 후 DP를 수행하면 됩니다.

이때 투 포인터로 O(n)에도 가능하고, 이분탐색으로 O(nlogn)에도 가능합니다.

JusticeHui님 : https://justicehui.github.io/koi/2018/07/23/BOJ8983/

 

 

2번: 막대기

더보기

꽤 복잡한 다이나믹 프로그래밍 문제입니다. DT의 정의와 채우는 방법을 잘 정하는 것이 중요합니다.

https://howtoliveworldnice.tistory.com/38?category=831934

 

2012년

1번: 예산

더보기

대표적인 이분탐색 문제입니다. 예산의 합을 기준으로 이분탐색을 수행하는 것이 핵심입니다.

occidere님 : https://blog.naver.com/occidere/221364545507

 

 

2번: 달리기

더보기

세그먼트 트리/펜윅 트리의 개념이 꼭 선행되어야 합니다. 문제해결을 위한 창의적 알고리즘 고급편에 자세한 풀이가 나와 있습니다.

JusticeHui님 : https://justicehui.github.io/koi/2019/03/03/BOJ2517/

 

2011년

1번: 공약수

더보기

최대공약수 알고리즘(유클리드 호제법)을 안다면 쉽게 해결할 수 있습니다.

travelbeeee님 : https://travelbeeee.tistory.com/250

 

 

2번: 부서 배치

더보기

이분매칭 및 Knapsack문제와 유사한 DP를 사용해야 합니다.

https://howtoliveworldnice.tistory.com/40?category=831934

 

2010년

1번: 세 용액

더보기

대표적인 투포인터 문제입니다.

https://howtoliveworldnice.tistory.com/37?category=831934

 

 

2번: 체인점

더보기

다익스트라 + 펜윅트리/세그트리 로 해결하는 문제입니다. 펜윅트리로 최대값/최소값 트리를 구성할 수 있는 특수한 조건이 특징입니다.

https://howtoliveworldnice.tistory.com/46?category=831934

 

2009년

1번: 섞기 수열

더보기

간단한 수학 + 사이클 찾기 문제입니다. DFS연습용으로 좋습니다.

https://howtoliveworldnice.tistory.com/38?category=831934

 

 

2번: 줄다리기

더보기

살짝 복잡한 라인 스위핑 문제입니다. 로직을 받아드리려면 문제를 확실하게 이해해야 합니다.

https://howtoliveworldnice.tistory.com/39?category=831934

 

2008년

1번: 채점

더보기

어떤 방법이 가능한지 묻는 DP 문제입니다. long long 배열의 원소 하나를 64bit bool 배열로 활용하므로써 최적화를 진행합니다.

https://howtoliveworldnice.tistory.com/43?category=831934

 

 

2번: 달팽이

더보기

기하 문제입니다. 

IOI KOREA : https://www.youtube.com/watch?v=xAQCAGqmc18

 

2007년

1번:

더보기

수학적 관찰력이 중요한 문제입니다.

채점, 체인점에 이은 원조 '점' 문제이죠.

https://howtoliveworldnice.tistory.com/49?category=831934

 

 

2번: 초고속철도

더보기

Lower_bound를 이용하여 정말 창의적으로 DP를 수행해야 합니다.

https://howtoliveworldnice.tistory.com/113?category=831934

 

2006년

1번: 기지국

더보기

문제는 무섭게 생겼지만 막상 보면 간단한 DP 문제입니다.

시간복잡도가 O(n^2)가 나오고 n이 10000까지 가능하기 때문에 쫄기 쉬운데 실제로는 넉넉하게 작동합니다.

https://howtoliveworldnice.tistory.com/50?category=831934

 

 

2번: 두부 모판 자르기

더보기

복잡한 DP 문제입니다. 문제 해결을 위한 창의적 알고리즘 고급편에 자세한 설명이 있습니다.

JusticeHui님 : https://justicehui.github.io/koi/2019/01/06/BOJ10937/

 

2005년

1번: 양팔 저울

더보기

탐색 공간의 배제가 적절하게 해서 구현하면 됩니다.

제 풀이는 980ms 대로 매우 빠듯하게 동작하기 때문에 가능하다면 다른 분의 풀이를 참고하시기 바랍니다.

https://howtoliveworldnice.tistory.com/50?category=831934

 

 

2번: 경비행기

더보기

매우 재밌는 이분탐색 + BFS 문제입니다. 위에서 '예산' 문제를 푸셨다면 이분탐색을 적용하기 쉬울 것입니다.

https://howtoliveworldnice.tistory.com/56?category=831934

 

2004년

1번: 돌다리 건너기

 

 

2번: 고속버스 노선

 

2003년

1번: 트리의 높이와 너비

더보기

규칙을 찾으면 중위 순회라는 것을 파악할 수 있습니다. 이후 중위 순회를 구현하면 됩니다.

https://howtoliveworldnice.tistory.com/57?category=831934

 

 

2번: 숫자 박스

더보기

개인적으로 꽤나 어려운 DP 문제였습니다. 

DP 정의를 얼마나 꼼꼼하게 세우느냐가 향후 체감 난이도를 결정합니다.

https://howtoliveworldnice.tistory.com/62?category=831934

 

2002년

1번: 로봇 조종하기

더보기

무조건 DP 식을 스스로 세워보는 것이 좋습니다.

https://howtoliveworldnice.tistory.com/72?category=831934

 

 

2번: 헬기착륙장

 

2001년

1번: 두 배열의 합

더보기

문제가 매우 간단합니다. 이분탐색, 해싱, 투 포인터.. 어떤 것을 활용해도 좋습니다.

https://howtoliveworldnice.tistory.com/56?category=831934

 

 

2번: 로봇

더보기

구현이 자칫하면 루즈해질 수 있는 BFS 문제입니다. 화이팅입니다!

https://howtoliveworldnice.tistory.com/88?category=831934

 

2000년

1번: 수열 축소

더보기

BOJ에 있는 문제는 한국정보올림피아드 원문제와 조건은 비슷하지만 풀이가 전혀 다릅니다.

모두 DP문제입니다.

 

KOI 버전 : https://howtoliveworldnice.tistory.com/112?category=831934

BOJ 버전 : https://howtoliveworldnice.tistory.com/110?category=831934

 

1999년

1번: 검은점과 하얀점 연결

더보기

최대값과 함께 답을 복원해내야 하는 DP 문제입니다. 역추적 과정이 꽤나 흥미롭습니다.

https://howtoliveworldnice.tistory.com/117?category=831934

 

1998년

2번: 통나무 옮기기

더보기

통나무를 어떻게 구조화할 것이냐가 쟁점인 BFS 문제입니다.

https://howtoliveworldnice.tistory.com/82?category=831934

 

1997년

1번: 다각형의 확장

더보기

푸신 분이 있다면 댓글로 힌트를 남겨주세요! 풀이를 쓰셨다면 링크를 달도록 하겠습니다.

 

 

2번: 미로만들기

더보기

0-1BFS 문제인데, 다익스트라 및 BFS 변형으로도 풀립니다.

https://howtoliveworldnice.tistory.com/76?category=831934

 

 

3번: 벽장문의 이동 (3번이지만 난이도가 1번보다 낮아 넣었습니다.)

더보기

간단한 재귀 문제입니다. 입력크기가 작아 적당한 탐색 공간 배제로 메모이제이션 없이 0ms를 받을 수 있습니다.

https://howtoliveworldnice.tistory.com/75?category=831934

 

1996년

1번: 잠수함식별

더보기

 매우 신선했던 오토마타 이론을 활용하는 문제입니다. 이것이 정규표현식이라고도 하는데, 이미 구현된 함수를 사용하는 것보다 오토마타 이론을 공부하여 푸는 것이 훨씬 재밌습니다.

https://howtoliveworldnice.tistory.com/54?category=831934

 

 

2번: 교차하지 않는 원의 현들의 최대집합  

더보기

DP의 정의를 잘 세우는 것이 중요합니다.

https://howtoliveworldnice.tistory.com/100?category=831934

 

마무리


총 46개의 문제중 16문제가 DP문제입니다. 1,2번 만점을 위해 DP문제를 확실히 익히는 것도 좋은 전략입니다.

스스로 알고리즘 문제 푸는 것을 즐기기에 다른 분들도 함께 즐길 수 있길 바랍니다.

여러분의 댓글 하나, 하트 하나가 글쓴이에게 큰 힘이 됩니다.

728x90