[OSAM] 2019 국방부오픈소스아카데미 집체교육에 도전하다! - 1-1. 집체교육 선발과정 후기: 코딩테스트
글의 저작권 문제가 있는 경우, 바로 내리도록 하겠습니다.
uhug@naver.com 으로 메일 부탁드립니다.
집체교육 선발 과정은 다음과 같은 항목을 테스트합니다.
- 강의 수강률 80% 이상
- 코딩테스트 4문제
- 이론문제 25문제
- 개발계획서
가장 먼저! 다들 가장 궁금해하실 2. 코딩테스트
에 대해 공유해드리려 합니다.
(혹시나.. 안궁금하신 분들은 다음 글: OSAM 2. 집체교육 선발과정 후기: 강의, 이론문제, 개발계획서 편 읽어주심 되겠슴다.. :D)
우선 저는 4문제 중 1번과 2번밖에 못풀었습니다.. 네.. 그렇습니다.. (뚀륵..)
우선 제 기준으로 말씀드리자면..
1번과 2번 문제는 정말 매우 아주 쉬운 문제로 구성되어 있었고
3번은 쪼금 어렵지만 살짝만 생각하면 금방 풀 수 있는 문제이며
4번은 그렇게 어렵지는 않지만 시간이 좀 걸렸던 문제였습니다.
시험 시간은 90분이며 테스트케이스별 부분점수가 있었으나, 아쉽게도 거기까지는 기억이 나지를 않습니다 :(
참고로 저는 1, 2번 문제를 풀고 자신감이 생겨 바로 4번으로 갔다가.. 15분 남겨두고 4번 포기, 3번을 풀다가 결국 둘 다 못풀었습니다…
문제를 푼지 시간이 조금 지나 문제 설명 부분이 정확하지 않을 확률이 높습니다만, 3, 4번 문제는 컨텍스트 그~대로 적어두었고, 1, 2번 문제는 기억+상상력에 의존하여 문제를 소개해드리니 이상한 점이 있다면 피드백 부탁드립니다!
정답은 다음 포스팅에서 다루어 볼 예정입니다. 다음 글: OSAM 1-1. 코딩테스트 정답
그럼 즐거운 코딩 되세요!~
문제
1. 공정한 심사
문제
도키는 알고리즘 학원 원장선생님이다. 도키쌤의 학원에서는 학생들을 특이한 방식으로 가르치는데 바로 수업에 멸망전 개념을 세계 최초로 도입한 것이었다. 수업을 듣는 12명의 학생들 중 1차 쪽찌시험에서 꼴찌한 학생은 교실 퇴장 후 야자를, 1등을 한 학생은 바로 집에갈 수 있도록 하는 제도인 것이었다. 도키는 다음차수에 수강할 12명의 희생량을 잘 괴롭히기 위해 1차 쪽찌시험의 평균값을 확인해 시험의 난이도롤 조절하고 싶어한다. 도키쌤은 1차 시험을 1등으로 통과한 사람이나 꼴찌를 한 사람의 점수 따위는 난이도 반영에 필요가 없다고 생각한다. 도키쌤을 위해 공정하게 1등과 꼴등의 점수를 제외한 평균값을 구하는 프로그램을 작성하여 영원한 고통의 굴레를 만드는데 일조하시오.
죄송합니다.. 문제가 기억이 나지를 않아서 100% 주작글이 되었습니다..
입력
처음부터 총 12줄에 걸쳐서 각 학생의 점수를 나타내는 자연수(최대 100)가 주어진다.
출력
결과에 해당하는 값을 마지막에 출력한다.
- 결과 값은 실수 형태로 출력하며, 소수 한자리수까지 표현한다.
- 예시 출력을 참고하여 공백 등의 형식에 주의한다.
예제 입력 1
1
2
3
4
5
6
7
8
9
10
11
12
예제 출력 1
6.5
- 입출력 형식을 잘 지켜주세요
2. 행운권 추첨
문제
국방소프트웨어 세미나가 열려 많은 사람들이 강의를 듣기 위해 모였다. 세미나 주최 측에서는 참여도를 높이기 위해 사람들에게 추첨권을 써서 넣도록 했는데, 양심을 팔아먹어 실수로 같은 번호의 응모권을 써서 집어넣은 사람들이 있다는 것을 파악했다. 이 문제를 해결하는 프로그램을 작성하시오.
입력
추첨권의 개수를 N이라 가정한다.
- 먼저 정수 N을 입력받고, 그 후 N개의 추첨권 정보 M을 받는다.(0<N<100,000)
- 여기서 M은 자연수이며 0<M<100,000 조건을 만족한다.
출력
중복된 번호 외의 추첨 번호를 순서대로 표시한다.
- 추첨 번호는
숫자(띄어쓰기)숫자(띄어쓰기)숫자
형식으로 표시되어야 한다. 예시 출력을 참고한다.
예제 입력 1
5
1
2
3
4
5
예제 출력 1
1 2 3 4 5
예제 입력 2
6
10
6
3
23
10
6
예제 출력 2
3 23
3. UI Event
문제
최근에는 다양한 GUI 프레임워크와 라이브러리가 등장하면서 한 화면에 수많은 UI 요소가 가득 차 있는 경우가 많다. UI 요소들 중 가장 단순한 것은 직사각형 모양의 버튼이다. 직사각형 모양의 버튼은 화면을 2차원 평면으로 생각했을 때 상하좌우 경계선의 네 좌표로 쉽게 표현할 수 있다. 그렇기 때문에 직사각형 버튼의 위치와 사용자가 클릭한 지점의 좌표를 알고 있으면 사용자가 어떤 버튼을 클릭한 것인지 쉽게 판단할 수 있다.
<대충.. 화면에 직사각형 버튼을 차례로 그린 모습>
해커 도키(?)는 인기 온라인 게임 리그 오브 클라우듴ㅋㅋ의 사용자들이 실시간으로 어떤 버튼을 클릭하는지 계산할 수 있도록 프로그램을 작성하려고 한다. 하지만 화면에 너무 많은 버튼이 있을 뿐만 아니라 여러 버튼이 서로 겹쳐있기 때문에 판단하기가 쉽지 않았다. 도키는 이 프로그램에 존재하는 버튼들의 위치와 버튼이 그려진 순서를 알고 있다. 뒤에 그려진 버튼이 기존의 버튼들을 덮어쓰고 위로 올라온다는 정보를 알 때 각 클릭지점이 어떤 버튼을 클릭하게 되는지 판단하는 프로그램을 작성하시오. 단, 정확히 버튼의 경계선이나 꼭지점을 클릭한 것도 해당 버튼을 클릭한 것으로 처리하며 위에 놓인 버튼을 클릭하면 그 뒤의 가려진 버튼들에는 클릭 이벤트가 전달되지 않는다.
입력
첫 줄에는 두 자연수 N과 M이 공백으로 구분되어 주어진다.
- N은 화면에 그려진 버튼의 수를 나타내는 50이하의 자연수다.
- M은 사용자가 클릭한 지점의 수를 나타내는 1,000이하의 자연수다.
이후 총 N줄에 걸쳐서 각 버튼의 위치를 나타내는 네 자연수가 주어진다.
L
R
B
T
형식으로 공백으로 구분되 네 자연수가 주어진다.- L, R은 각각 왼쪽과 오른쪽 경계선의 x좌표이다.
- B, T는 각각 아래쪽과 위쪽 경계선의 y좌표이다.
- 모든 좌표는 1,000이하의 자연수이다.
- 버튼 정보는 그려진 순서대로 주어진다. 뒤에 주어진 버튼이 가존의 버튼들의 일부를 덮어 쓸 수 있다.
이후 총 M줄에 걸쳐서 각 줄에 사용자가 클릭한 지점을 나타내는 좌표가 주어진다.
X
Y
형식으로 공백으로 구분 된 자연수 좌표가 주어진다.- 모든 좌표는 1,000이하의 자연수이다.
출력
총 N줄에 걸쳐서 각 버튼이 클릭 된 횟수를 버튼 번호 순서대로 출력한다.
- 각 줄에
Button #{버튼번호}: {클릭 횟수}
형식으로 출력한다. 예시 출력을 참고한다. - 버튼의 번호는 입력된 순서대로 1-N으로 부여한다.
- 예시 출력을 참고하여 대소문자와 공백 등의 형식에 주의한다.
예제 입력 1
2 5
1 5 1 5
3 8 3 8
1 1
3 3
3 5
8 8
3 10
예제 출력 1
Button #1: 1
Button #2: 3
- 입출력 형식을 잘 지켜주세요
4. 흔한 제목 찾기
문제
신인 작가 도키(해커, 작가.. 그는 도덕책..)는 자신이 프로그래밍을 공부했던 경험과 노하우를 실어 초보 프로그래머들을 위한 가이드북의 초고를 완성했다. 출판사와의 회의를 통해 책의 출판이 결정되었고, 도키는 자산의 첫 책에 의미있는 제목을 지어주려고 한다. 책 제목에 대한 영감을 얻기 위해 방문한 IT 전문 도서관 ‘라이브러리즈’에는 책들의 수평방향으로 한 줄에 정렬되어 있었다. 모든 책의 제목은 알파벳 대문자로 이루어져 있었으며 모든 책들은 사전순으로 정렬되어 있었다.
대부분의 도서관이 그러하듯 ‘라이브러리즈’에서도 책들을 첫 알파벳 글자를 기준으로 구간을 나누고는 한다. 도키는 책 제목의 첫 글자가 무엇이 되느냐가 자신의 책이 얼마나 눈에 띄게 될 지를 결정할 수 있다는 사실을 발견했다. 도키는 사람들이 주로 책장의 책들을 바라보는 위치와 각도를 수집하여 각 위치에서 가장 많은 책들이 제목의 첫 글자로 사용한 알파벳은 무엇인지 조사하고자 한다.
사전순으로 정렬된 책들의 제목의 첫 글자가 모두 주어질 때 도키가 바라본 구간에서 제목의 첫 글자로 가장 많이 등장한 알파벳을 계산하는 프로그램을 작성해주자.
입력
첫 줄에는 두 자연수 N
Q
형식으로 주어진다.
- N은 전시되어 있는 책의 권 수를 나타내는 10만 이하의 자연수이다.
- Q는 동이가 조사 할 구간의 수를 나타내는 20만 이하의 자연수이다.
두 번째 줄에는 책들이 놓여진 순서대로 각 책의 첫 글자만을 이어붙여 만든 N글자의 문자열이 주어진다.
- 문자열은 정확히 N글자이며 알파벳 대문자로만 구성되어 있다.
- 모든 알파벳은 왼쪽에서 오른쪽으로 사전순으로 정렬되어 있다.
- 가장 왼족부터 1, 2, 3, … N번으로 책에 번호를 붙인다.
이후 총 Q줄에 걸쳐서 동이가 조사하고자 하는 구간에 대한 정보가 각 줄에 두 자연수로 주어진다.
- 각 줄은
L
R
형식의 두 자연수로 구성된다. L은 항상 R이하의 값을 가진다. - L은 도키가 조사하고자 하는 연속된 구간에서 왼쪽 끝에 있는 책의 번호를 나타낸다.
- R은 도키가 조사하고자 하는 연속된 구간에서 오른쪽 끝에 있는 책의 번호를 나타낸다.
출력
도키가 조사하고자 하는 Q개의 구간에 대하여 각각 한 줄에 정답을 출력한다.
- 해당 구간에서 책 제목의 첫 글자로 가장 많이 등장한 알파벳을 출력한다.
- 등장 횟수가 같은 아파벳이 여러개라면 사전순으로 가장 앞서는 알파벳을 출력한다.
예제 입력 1
30 5
AAAAABBBBBBCDDEFIJLMPQRSTUVWYZ
11 12
7 24
12 23
13 29
1 19
예제 출력 1
B
B
D
D
B
- 입출력 형식을 잘 지켜주세요
이상으로 4문제를 모두 소개해드렸습니다. 어떤가요? 풀만하던가요??
문제에 대해 궁금하신 점이 있다면 댓글로 의견 부탁드립니다! 그럼 다음 포스팅에선 정답과 해설로 찾아오도록 하겠습니다.
이전 글: [OSAM] 2019 국방부오픈소스아카데미 집체교육에 도전하다! - 1. 강의 수강 및 지원
다음 글: [OSAM] 2019 국방부오픈소스아카데미 집체교육에 도전하다! - 1-2. 코딩테스트 풀이 및 후기