SlideShare a Scribd company logo
1 of 21
Download to read offline
전국 대학생 프로그래밍 대회 동아리 연합 세미나
알고리즘 문제 출제 전략
김재홍 (Xhark)
ekzm0204@gmail.com
연사소개
● 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!

More Related Content

Viewers also liked

두 번째 startlink.live: 장홍준 (hongjun7) - Teamwork in Programming Contests
두 번째 startlink.live: 장홍준 (hongjun7) - Teamwork in Programming Contests두 번째 startlink.live: 장홍준 (hongjun7) - Teamwork in Programming Contests
두 번째 startlink.live: 장홍준 (hongjun7) - Teamwork in Programming ContestsStartlink
 
[Tech meet up] 알고리즘? 모르고리즘! - 연세대 모르고리즘 동아리 이도현
[Tech meet up] 알고리즘? 모르고리즘! - 연세대 모르고리즘 동아리 이도현[Tech meet up] 알고리즘? 모르고리즘! - 연세대 모르고리즘 동아리 이도현
[Tech meet up] 알고리즘? 모르고리즘! - 연세대 모르고리즘 동아리 이도현NAVER D2
 
Google Code Jam 2017 소개
Google Code Jam 2017 소개Google Code Jam 2017 소개
Google Code Jam 2017 소개Startlink
 
두 번째 startlink.live: 최백준 (baekjoon) - 알고리즘 공부하다 창업...
두 번째 startlink.live: 최백준 (baekjoon) - 알고리즘 공부하다 창업...두 번째 startlink.live: 최백준 (baekjoon) - 알고리즘 공부하다 창업...
두 번째 startlink.live: 최백준 (baekjoon) - 알고리즘 공부하다 창업...Startlink
 
2016 FunctionCup 풀이
2016 FunctionCup 풀이2016 FunctionCup 풀이
2016 FunctionCup 풀이geunwoo bae
 
프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기Jongwook Choi
 
웨일 보안 이야기
웨일 보안 이야기웨일 보안 이야기
웨일 보안 이야기NAVER D2
 

Viewers also liked (7)

두 번째 startlink.live: 장홍준 (hongjun7) - Teamwork in Programming Contests
두 번째 startlink.live: 장홍준 (hongjun7) - Teamwork in Programming Contests두 번째 startlink.live: 장홍준 (hongjun7) - Teamwork in Programming Contests
두 번째 startlink.live: 장홍준 (hongjun7) - Teamwork in Programming Contests
 
[Tech meet up] 알고리즘? 모르고리즘! - 연세대 모르고리즘 동아리 이도현
[Tech meet up] 알고리즘? 모르고리즘! - 연세대 모르고리즘 동아리 이도현[Tech meet up] 알고리즘? 모르고리즘! - 연세대 모르고리즘 동아리 이도현
[Tech meet up] 알고리즘? 모르고리즘! - 연세대 모르고리즘 동아리 이도현
 
Google Code Jam 2017 소개
Google Code Jam 2017 소개Google Code Jam 2017 소개
Google Code Jam 2017 소개
 
두 번째 startlink.live: 최백준 (baekjoon) - 알고리즘 공부하다 창업...
두 번째 startlink.live: 최백준 (baekjoon) - 알고리즘 공부하다 창업...두 번째 startlink.live: 최백준 (baekjoon) - 알고리즘 공부하다 창업...
두 번째 startlink.live: 최백준 (baekjoon) - 알고리즘 공부하다 창업...
 
2016 FunctionCup 풀이
2016 FunctionCup 풀이2016 FunctionCup 풀이
2016 FunctionCup 풀이
 
프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기
 
웨일 보안 이야기
웨일 보안 이야기웨일 보안 이야기
웨일 보안 이야기
 

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

프로그래밍 대회 문제 제작하기
프로그래밍 대회 문제 제작하기프로그래밍 대회 문제 제작하기
프로그래밍 대회 문제 제작하기인서 박
 
국민대학교 컴퓨터프로그래밍
국민대학교 컴퓨터프로그래밍국민대학교 컴퓨터프로그래밍
국민대학교 컴퓨터프로그래밍Minsuk Lee
 
프로그램 기초
프로그램 기초프로그램 기초
프로그램 기초Minsuk Lee
 
세미나
세미나세미나
세미나Dongyi Kim
 
Chapter 11 Practical Methodology
Chapter 11 Practical MethodologyChapter 11 Practical Methodology
Chapter 11 Practical MethodologyKyeongUkJang
 
데이터를 얻으려는 노오오력
데이터를 얻으려는 노오오력데이터를 얻으려는 노오오력
데이터를 얻으려는 노오오력Youngjae Kim
 
Coding interview
Coding interviewCoding interview
Coding interviewSoohan Ahn
 
코딩테스트 합격자 되기 연말강의자료(프로그래머스 콜라보)
코딩테스트 합격자 되기 연말강의자료(프로그래머스 콜라보)코딩테스트 합격자 되기 연말강의자료(프로그래머스 콜라보)
코딩테스트 합격자 되기 연말강의자료(프로그래머스 콜라보)ultrasuperrok
 
[D2대학생세미나]lovely algrorithm
[D2대학생세미나]lovely algrorithm[D2대학생세미나]lovely algrorithm
[D2대학생세미나]lovely algrorithmNAVER D2
 
코딩테트2205-kucc-220508145530-8015b5d7.pdf
코딩테트2205-kucc-220508145530-8015b5d7.pdf코딩테트2205-kucc-220508145530-8015b5d7.pdf
코딩테트2205-kucc-220508145530-8015b5d7.pdfssuser597fbd
 
코딩 테스트 및 알고리즘 문제해결 공부 방법 (고려대학교 KUCC, 2022년 4월)
코딩 테스트 및 알고리즘 문제해결 공부 방법 (고려대학교 KUCC, 2022년 4월)코딩 테스트 및 알고리즘 문제해결 공부 방법 (고려대학교 KUCC, 2022년 4월)
코딩 테스트 및 알고리즘 문제해결 공부 방법 (고려대학교 KUCC, 2022년 4월)Suhyun Park
 
Things Data Scientists Should Keep in Mind
Things Data Scientists Should Keep in MindThings Data Scientists Should Keep in Mind
Things Data Scientists Should Keep in MindDataya Nolja
 
애자일 게임 개발: 현실 세계의 혼돈을 다루는 법 (Agile Game Development: Dealing With Chaos In Th...
애자일 게임 개발: 현실 세계의 혼돈을 다루는 법 (Agile Game Development: Dealing With Chaos In Th...애자일 게임 개발: 현실 세계의 혼돈을 다루는 법 (Agile Game Development: Dealing With Chaos In Th...
애자일 게임 개발: 현실 세계의 혼돈을 다루는 법 (Agile Game Development: Dealing With Chaos In Th...Kay Kim
 
현업 엔지니어의 시각에서 본 알고리즘 공부의 장점과 단점
현업 엔지니어의 시각에서 본 알고리즘 공부의 장점과 단점현업 엔지니어의 시각에서 본 알고리즘 공부의 장점과 단점
현업 엔지니어의 시각에서 본 알고리즘 공부의 장점과 단점Wonha Ryu
 
손코딩뇌컴파일눈디버깅을 소개합니다.
손코딩뇌컴파일눈디버깅을 소개합니다.손코딩뇌컴파일눈디버깅을 소개합니다.
손코딩뇌컴파일눈디버깅을 소개합니다.Kwangsung Ha
 
애자일 머신러닝
애자일 머신러닝애자일 머신러닝
애자일 머신러닝Seungil You
 
20210315 일하면서 배운 것
20210315 일하면서 배운 것20210315 일하면서 배운 것
20210315 일하면서 배운 것인욱 황
 
개발자, 성장하는 '척' 말고, 진짜 성장하기
개발자, 성장하는 '척' 말고, 진짜 성장하기개발자, 성장하는 '척' 말고, 진짜 성장하기
개발자, 성장하는 '척' 말고, 진짜 성장하기Donghyun Cho
 
애자일 프랙티스
애자일 프랙티스애자일 프랙티스
애자일 프랙티스한 경만
 
교과연계 SW교육하기
교과연계 SW교육하기교과연계 SW교육하기
교과연계 SW교육하기Jaehwi Alice Kim
 

Similar to 두 번째 startlink.live: 김재홍 (xhark) - 알고리즘 문제 출제 전략 (20)

프로그래밍 대회 문제 제작하기
프로그래밍 대회 문제 제작하기프로그래밍 대회 문제 제작하기
프로그래밍 대회 문제 제작하기
 
국민대학교 컴퓨터프로그래밍
국민대학교 컴퓨터프로그래밍국민대학교 컴퓨터프로그래밍
국민대학교 컴퓨터프로그래밍
 
프로그램 기초
프로그램 기초프로그램 기초
프로그램 기초
 
세미나
세미나세미나
세미나
 
Chapter 11 Practical Methodology
Chapter 11 Practical MethodologyChapter 11 Practical Methodology
Chapter 11 Practical Methodology
 
데이터를 얻으려는 노오오력
데이터를 얻으려는 노오오력데이터를 얻으려는 노오오력
데이터를 얻으려는 노오오력
 
Coding interview
Coding interviewCoding interview
Coding interview
 
코딩테스트 합격자 되기 연말강의자료(프로그래머스 콜라보)
코딩테스트 합격자 되기 연말강의자료(프로그래머스 콜라보)코딩테스트 합격자 되기 연말강의자료(프로그래머스 콜라보)
코딩테스트 합격자 되기 연말강의자료(프로그래머스 콜라보)
 
[D2대학생세미나]lovely algrorithm
[D2대학생세미나]lovely algrorithm[D2대학생세미나]lovely algrorithm
[D2대학생세미나]lovely algrorithm
 
코딩테트2205-kucc-220508145530-8015b5d7.pdf
코딩테트2205-kucc-220508145530-8015b5d7.pdf코딩테트2205-kucc-220508145530-8015b5d7.pdf
코딩테트2205-kucc-220508145530-8015b5d7.pdf
 
코딩 테스트 및 알고리즘 문제해결 공부 방법 (고려대학교 KUCC, 2022년 4월)
코딩 테스트 및 알고리즘 문제해결 공부 방법 (고려대학교 KUCC, 2022년 4월)코딩 테스트 및 알고리즘 문제해결 공부 방법 (고려대학교 KUCC, 2022년 4월)
코딩 테스트 및 알고리즘 문제해결 공부 방법 (고려대학교 KUCC, 2022년 4월)
 
Things Data Scientists Should Keep in Mind
Things Data Scientists Should Keep in MindThings Data Scientists Should Keep in Mind
Things Data Scientists Should Keep in Mind
 
애자일 게임 개발: 현실 세계의 혼돈을 다루는 법 (Agile Game Development: Dealing With Chaos In Th...
애자일 게임 개발: 현실 세계의 혼돈을 다루는 법 (Agile Game Development: Dealing With Chaos In Th...애자일 게임 개발: 현실 세계의 혼돈을 다루는 법 (Agile Game Development: Dealing With Chaos In Th...
애자일 게임 개발: 현실 세계의 혼돈을 다루는 법 (Agile Game Development: Dealing With Chaos In Th...
 
현업 엔지니어의 시각에서 본 알고리즘 공부의 장점과 단점
현업 엔지니어의 시각에서 본 알고리즘 공부의 장점과 단점현업 엔지니어의 시각에서 본 알고리즘 공부의 장점과 단점
현업 엔지니어의 시각에서 본 알고리즘 공부의 장점과 단점
 
손코딩뇌컴파일눈디버깅을 소개합니다.
손코딩뇌컴파일눈디버깅을 소개합니다.손코딩뇌컴파일눈디버깅을 소개합니다.
손코딩뇌컴파일눈디버깅을 소개합니다.
 
애자일 머신러닝
애자일 머신러닝애자일 머신러닝
애자일 머신러닝
 
20210315 일하면서 배운 것
20210315 일하면서 배운 것20210315 일하면서 배운 것
20210315 일하면서 배운 것
 
개발자, 성장하는 '척' 말고, 진짜 성장하기
개발자, 성장하는 '척' 말고, 진짜 성장하기개발자, 성장하는 '척' 말고, 진짜 성장하기
개발자, 성장하는 '척' 말고, 진짜 성장하기
 
애자일 프랙티스
애자일 프랙티스애자일 프랙티스
애자일 프랙티스
 
교과연계 SW교육하기
교과연계 SW교육하기교과연계 SW교육하기
교과연계 SW교육하기
 

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

  • 1. 전국 대학생 프로그래밍 대회 동아리 연합 세미나 알고리즘 문제 출제 전략 김재홍 (Xhark) ekzm0204@gmail.com
  • 2. 연사소개 ● 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)
  • 3. 연사소개 PS대회경력 ● ACM-ICPC World Final 2011 (13th), 2016 (28th) ● Facebook Hacker Cup Final Round 2012 ● Google Code Jam World Finals 2015(24th), 2016(17th)
  • 4. 연사소개 출제경력 ● 어딘가 학원 캠프의 출제조교 ● 어딘가 학교의 출제조교 ● 어딘가 대회의 조교 ● 카이스트 교내 대회 문제 출제 ● 전대프연 대회 문제 출제
  • 5. 주의할 점 본 세미나는 연사의 주관이 많이 포함되어 있습니다. 들으실 때 조심하시기 바랍니다.
  • 6. 알고리즘 문제 출제 전략 - 할 이야기 ● 다양한 문제를 출제하며 느낀점들을 공유 1. 문제를 출제하면 좋은점 2. 좋은 문제란? 3. 문제를 만드는 방법 4. 마치며 "이 문제도 총체적 난국입니다." "빠진 조건 추가 부탁드립니다." "메모리 제한 너무 심하지 않나요ㅠㅠ"
  • 7. 문제를 출제하면 좋은점 ● 문제를 출제하는 것은 문제를 푸는 것과 다른 방식으로 많은 배울점들이 있음 ○ 특정 알고리즘으로 푸는 문제를 만들 때: ■ 알고리즘이 적용 가능한 문제의 형태를 폭넓게 알고 있어야 재미있는 문제를 만들 수 있다. ■ 다른 해결방법/알고리즘이 작동하지 않도록 데이터의 범위나 문제 조건등을 조정하며 그 알고리즘이 잘 작동하는 범위에 대한 이해가 늘어난다. ■ 해법 알고리즘의 구현 중 실수하기 쉬운 부분에 대한 테스트 데이터를 만들며 Corner case를 생각하는 능력이 늘어나고, 이것은 문제를 풀 때에도 적용 가능하다.
  • 8. 문제를 출제하면 좋은점 ● 문제를 출제하는 것은 문제를 푸는 것과 다른 방식으로 많은 배울점들이 있음 ○ 실생활, 혹은 실무에서 발생하는 문제에 조건을 걸어 해결가능한 문제로 만들 떄: ■ 알고리즘으로 빠르게 문제를 해결하기 위한 실생활, 실무의 문제와의 차이를 이해할 수 있다. ● e.g) Knapsack문제 : NP이지만 총량제한과 각 물건 무게를 정수로 가정을 추가하는 등 ■ 가능한 여러 조건 set을 고려하며, 각각 알고리즘이 적용되었을 때 장단점을 비교 가능
  • 9. 문제를 출제하면 좋은점 ● 문제를 풀 때 출제자의 시점에서 생각하는데 도움이 됨. ○ 무슨 심정으로 출제자는 이런 조건을 추가했을까? ○ 범위를 왜 더 크게 할 수 없었을까? ○ 왜 이러한 예제를 주었을까? ○ 어떠한 목적으로 출제한 문제일까?
  • 10. 좋은 문제란? ● 좋은 대회란 무엇인가? ○ 한국 ACM-ICPC의 좌 교수님의 지론... ■ 모든 팀이 한 문제이상 풀고 ■ 모든 문제는 푼 팀이 있어야 하며 ■ 모든 문제를 전부 푼팀은 없어야 한다. ● 그렇다면 좋은 문제란?
  • 11. 좋은 문제란? ● 목적(교육, 평가, 혹은 대회 등)에 따라서 좋은 문제는 달라짐. ● 기본적으로 만드는 사람 / 푸는 사람 모두에게 좋은 문제의 분류 ○ 다양한 해결 방법 ■ 해결 방법의 경우의 수가 다양하고, 각각 난이도가 비슷하면 좋다. ■ 안좋은 예) A, B가 주어지면 A+B를 출력하시오 ● 해결법이 문제에 적혀있음. ■ 안좋은 예) 데이터 제한에 알고리즘의 시간복잡도가 쓰여있는 경우 ○ 몇몇의 특수한 예외 케이스 ■ 문제 그 자체의 성질 때문에 생기는 예외 케이스가 존재하면 좋다. ● 너무 많으면 예외 케이스들이 하나의 문제가 되므로 좋지 않음. ○ 문제 해결 중심 내용과 관계없는 구현은 최소화 ■ 안좋은 예) 도시간의 연결은 X Y의 형태로 연결되어 있음이 주어지는데, 각각 X, Y는 도시명의 regex를 DES로 암호화한 형태로 주어진다.
  • 12. 문제를 만드는 방법 ● 문제의 목적 설정 ○ 기본적인 Algorithm, Data Structure ○ 여러 알고리즘 응용력 ○ 아이디어 문제 ○ 실제 실생활/실무에서 발생하는 문제 ○ 참가 팀들 중 50%가 풀 수 있는 문제 ● 목적에 맞는 문제 작성 ○ 본문 작성 (각색, 설명) ○ 범위 및 예제데이터 ● 테스트 데이터 제작 ● 채점 및 질문 ○ 대회 진행 혹은 문제를 업로드시 채점 및 질문의 답변
  • 13. 문제를 만드는 방법 ● 문제의 목적 설정 ● 목적에 맞는 문제 작성 ● 테스트 데이터 제작 ○ 잘못된 알고리즘, 꼼수, 실수를 잡아내는 데이터 생성 ■ 입력 가능한 모든 데이터를 넣어볼 수 없으니… ● BST, 퀵소트가 N^2인 경우를 넣자 ● Suffix Tree 문제를 Hash로 푸는 것을 막자 ● 휴리스틱한 Cutting은 모두 틀리는 ‘일반적인 Worst Case’를 넣자 ○ 앞, 뒤나 중간부터 확인하는 알고리즘… ○ 랜덤 알고리즘... ● 채점 및 질문 feedback
  • 14. 문제를 만드는 방법 ● 테스트 데이터 제작 ○ 아주 일부의 Case에서만 오답/시간초과가 나는 알고리즘들을 다수 커버하는, 강력하고 일반적인 데이터 생성을 하는 것은 하나의 “문제” ○ 때때로 테스트 데이터 제작은 문제 조건 만으로 문제 이상의 난이도 ■ e.g) 점이 N개 주어지는 기하문제 ● 조건0. N은 매우 크고 모든 좌표는 정수이고 범위는 매우 좁다. ● 조건1. 세 점이 한 직선위에 있지 않다.
  • 15. 문제를 만드는 방법 ● 테스트 데이터 제작 ○ 때때로 테스트 데이터 제작은 문제 이상의 난이도 ■ e.g) 점이 N개 주어지는 기하문제 ● 조건0. N은 매우 크고 모든 좌표는 정수이고 범위는 매우 좁다. ● 조건1. 세 점이 한 직선위에 있지 않다. ● 조건2. 네 점이 한 원 위에 있지는 않다. ● 조건3. 모든 점은 e이상 떨어져 있다. ● 조건4. N이 매우 크므로 random seed를 입력으로 주고 generate하는 형태 ● 조건5. 사실 3차원 기하
  • 16. 문제를 만드는 방법 ● 테스트 데이터 제작 ○ 특수한 경우(Corner case / Worst case)의 데이터 제작 ■ 광범위한 N에서 sample을 generate가능한 형태로 최대한 넓은 범위에서 생성되도록 코드를 구현해 데이터를 여러개 생성해야함. ● 안좋은예) N이 매우 큰 Dynamic문제에서 그리디 해결법 막기 위한 N이 작은 케이스를 넣은 경우 ○ N이 작을 경우 Back-Tracking, 클경우 그리디로 해결하여 AC! ● 안좋은예) N이 큰 트리 내에 작은 반례 트리를 몇개 넣은 경우 ○ 손으로 만들 수 있는 작은 경우들 중 있는 예외를 subtree에서 발견하면 해결하고, 전체적으로는 잘못된 방법으로 해결하여 AC!
  • 17. 문제를 만드는 방법 ● 테스트 데이터 제작 ○ 물론 아무리 노력해도 끝이 없는 문제… ■ Program testing can be used to show the presence of bugs, but never to show their absence! - Edsger Dijkstra ○ 하지만 그 문제를 풀 때 필요한 ‘예상 소요 시간’내에 생각할 수 있는 수 많은 경우의 수를 차단하는 노력은 가능함. ○ 기본적으로 출제자에게는 시간제한이 없으므로… ○ 문제를 풀 때 생각나는 다양한 잘못된 풀이법 구상도, 문제를 출제할 때에는 매우 필요한 능력.
  • 18. 마치며 ● 세줄요약 ● 간단한 문제라도 출제할 수 있는 기회가 있다면 최대한 참여하자 ● 문제를 풀어보는 것 이상으로 문제를 만드는 것도 중요하다. ● 문제를 만들어보는 경험이 문제를 풀 때에도 도움이 된다.
  • 19. 마치며 What I cannot create, I do not understand - Richard Feynman
  • 20. 홍보 인공지능에 대해 알고싶다면? 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/