두 번째 startlink.live: 김재홍 (xhark) - 알고리즘 문제...

21
전국 대학생 프로그래밍 대회 동아리 연합 세미나 알고리즘 문제 출제 전략 김재홍 (Xhark) [email protected]

Transcript of 두 번째 startlink.live: 김재홍 (xhark) - 알고리즘 문제...

전국 대학생 프로그래밍 대회 동아리 연합 세미나알고리즘 문제 출제 전략

김재홍 (Xhark)[email protected]

연사소개

● 2009 KAIST 입학● 2011 Google Korea (SW Engineer Internship)● 2012~2014 Inswave Systems (Java Programmer)● 2014~2015 Ridibooks (Web Developer)● 졸업후 2016~ SK T-Brain (AI Research Engineer)

연사소개

PS대회경력

● ACM-ICPC World Final 2011 (13th), 2016 (28th)● Facebook Hacker Cup Final Round 2012● Google Code Jam World Finals 2015(24th), 2016(17th)

연사소개

출제경력

● 어딘가 학원 캠프의 출제조교● 어딘가 학교의 출제조교● 어딘가 대회의 조교

● 카이스트 교내 대회 문제 출제● 전대프연 대회 문제 출제

주의할 점본 세미나는 연사의 주관이 많이 포함되어 있습니다.

들으실 때 조심하시기 바랍니다.

알고리즘 문제 출제 전략 - 할 이야기

● 다양한 문제를 출제하며 느낀점들을 공유

1. 문제를 출제하면 좋은점 2. 좋은 문제란?3. 문제를 만드는 방법4. 마치며

""이 문제도 총체적 난국입니다 ."

""빠진 조건 추가 부탁드립니다 ."

""메모리 제한 너무 심하지 않나요ㅠㅠ"

문제를 출제하면 좋은점

● 문제를 출제하는 것은 문제를 푸는 것과 다른 방식으로 많은 배울점들이 있음○ 특정 알고리즘으로 푸는 문제를 만들 때:

■ 알고리즘이 적용 가능한 문제의 형태를 폭넓게 알고 있어야 재미있는 문제를 만들 수 있다.

■ 다른 해결방법/알고리즘이 작동하지 않도록 데이터의 범위나 문제 조건등을 조정하며 그 알고리즘이 잘 작동하는 범위에 대한 이해가 늘어난다.

■ 해법 알고리즘의 구현 중 실수하기 쉬운 부분에 대한 테스트 데이터를 만들며 Corner case를 생각하는 능력이 늘어나고, 이것은 문제를 풀 때에도 적용 가능하다.

문제를 출제하면 좋은점

● 문제를 출제하는 것은 문제를 푸는 것과 다른 방식으로 많은 배울점들이 있음○ 실생활, 혹은 실무에서 발생하는 문제에 조건을 걸어 해결가능한 문제로 만들 떄:

■ 알고리즘으로 빠르게 문제를 해결하기 위한 실생활, 실무의 문제와의 차이를 이해할 수 있다.

● e.g) Knapsack문제 : NP이지만 총량제한과 각 물건 무게를 정수로 가정을 추가하는 등

■ 가능한 여러 조건 set을 고려하며, 각각 알고리즘이 적용되었을 때 장단점을 비교 가능

문제를 출제하면 좋은점

● 문제를 풀 때 출제자의 시점에서 생각하는데 도움이 됨.○ 무슨 심정으로 출제자는 이런 조건을 추가했을까?

○ 범위를 왜 더 크게 할 수 없었을까?

○ 왜 이러한 예제를 주었을까?

○ 어떠한 목적으로 출제한 문제일까?

좋은 문제란?

● 좋은 대회란 무엇인가? ○ 한국 ACM-ICPC의 좌 교수님의 지론...

■ 모든 팀이 한 문제이상 풀고■ 모든 문제는 푼 팀이 있어야 하며■ 모든 문제를 전부 푼팀은 없어야 한다.

● 그렇다면 좋은 문제란?

좋은 문제란?

● 목적(교육, 평가, 혹은 대회 등)에 따라서 좋은 문제는 달라짐.● 기본적으로 만드는 사람 / 푸는 사람 모두에게 좋은 문제의 분류

○ 다양한 해결 방법■ 해결 방법의 경우의 수가 다양하고, 각각 난이도가 비슷하면 좋다.■ 안좋은 예) A, B가 주어지면 A+B를 출력하시오

● 해결법이 문제에 적혀있음.■ 안좋은 예) 데이터 제한에 알고리즘의 시간복잡도가 쓰여있는 경우

○ 몇몇의 특수한 예외 케이스■ 문제 그 자체의 성질 때문에 생기는 예외 케이스가 존재하면 좋다.

● 너무 많으면 예외 케이스들이 하나의 문제가 되므로 좋지 않음.○ 문제 해결 중심 내용과 관계없는 구현은 최소화

■ 안좋은 예) 도시간의 연결은 X Y의 형태로 연결되어 있음이 주어지는데 , 각각 X, Y는 도시명의 regex를 DES로 암호화한 형태로 주어진다.

문제를 만드는 방법

● 문제의 목적 설정○ 기본적인 Algorithm, Data Structure○ 여러 알고리즘 응용력○ 아이디어 문제○ 실제 실생활/실무에서 발생하는 문제○ 참가 팀들 중 50%가 풀 수 있는 문제

● 목적에 맞는 문제 작성○ 본문 작성 (각색, 설명)○ 범위 및 예제데이터

● 테스트 데이터 제작● 채점 및 질문

○ 대회 진행 혹은 문제를 업로드시 채점 및 질문의 답변

문제를 만드는 방법

● 문제의 목적 설정● 목적에 맞는 문제 작성

● 테스트 데이터 제작○ 잘못된 알고리즘, 꼼수, 실수를 잡아내는 데이터 생성

■ 입력 가능한 모든 데이터를 넣어볼 수 없으니…● BST, 퀵소트가 N^2인 경우를 넣자● Suffix Tree 문제를 Hash로 푸는 것을 막자● 휴리스틱한 Cutting은 모두 틀리는 ‘일반적인 Worst Case’를 넣자

○ 앞, 뒤나 중간부터 확인하는 알고리즘…○ 랜덤 알고리즘...

● 채점 및 질문 feedback

문제를 만드는 방법

● 테스트 데이터 제작○ 아주 일부의 Case에서만 오답/시간초과가 나는 알고리즘들을 다수 커버하는, 강력하고 일반적인 데이터 생성을 하는 것은 하나의 “문제”

○ 때때로 테스트 데이터 제작은 문제 조건 만으로 문제 이상의 난이도■ e.g) 점이 N개 주어지는 기하문제

● 조건0. N은 매우 크고 모든 좌표는 정수이고 범위는 매우 좁다.● 조건1. 세 점이 한 직선위에 있지 않다.

문제를 만드는 방법

● 테스트 데이터 제작○ 때때로 테스트 데이터 제작은 문제 이상의 난이도

■ e.g) 점이 N개 주어지는 기하문제● 조건0. N은 매우 크고 모든 좌표는 정수이고 범위는 매우 좁다.● 조건1. 세 점이 한 직선위에 있지 않다.● 조건2. 네 점이 한 원 위에 있지는 않다.● 조건3. 모든 점은 e이상 떨어져 있다.● 조건4. N이 매우 크므로 random seed를 입력으로 주고 generate하는 형태● 조건5. 사실 3차원 기하

문제를 만드는 방법

● 테스트 데이터 제작○ 특수한 경우(Corner case / Worst case)의 데이터 제작

■ 광범위한 N에서 sample을 generate가능한 형태로 최대한 넓은 범위에서 생성되도록 코드를 구현해 데이터를 여러개 생성해야함 .

● 안좋은예) N이 매우 큰 Dynamic문제에서 그리디 해결법 막기 위한 N이 작은 케이스를 넣은 경우

○ N이 작을 경우 Back-Tracking, 클경우 그리디로 해결하여 AC!● 안좋은예) N이 큰 트리 내에 작은 반례 트리를 몇개 넣은 경우

○ 손으로 만들 수 있는 작은 경우들 중 있는 예외를 subtree에서 발견하면 해결하고, 전체적으로는 잘못된 방법으로 해결하여 AC!

문제를 만드는 방법

● 테스트 데이터 제작○ 물론 아무리 노력해도 끝이 없는 문제…

■ Program testing can be used to show the presence of bugs, but never to show their absence! - Edsger Dijkstra

○ 하지만 그 문제를 풀 때 필요한 ‘예상 소요 시간’내에 생각할 수 있는 수 많은 경우의 수를 차단하는 노력은 가능함.

○ 기본적으로 출제자에게는 시간제한이 없으므로…○ 문제를 풀 때 생각나는 다양한 잘못된 풀이법 구상도, 문제를 출제할 때에는 매우 필요한 능력.

마치며

● 세줄요약

● 간단한 문제라도 출제할 수 있는 기회가 있다면 최대한 참여하자● 문제를 풀어보는 것 이상으로 문제를 만드는 것도 중요하다.● 문제를 만들어보는 경험이 문제를 풀 때에도 도움이 된다.

마치며

What I cannot create, I do not understand

- Richard Feynman

홍보

인공지능에 대해 알고싶다면?

AI Korea : https://www.facebook.com/groups/AIKoreaOpen/

SK T-Brain : https://www.facebook.com/SKTBrain/

WE ARE HIRING! https://sktbrain.github.io/awesome-recruit.v2/

Thank you!