↓ 본문으로 건너뛰기

Code Jam Kickstart 2018 Round C 후기

·3 분
nyan101
작성자
nyan101
목차

한동안 개인 사정으로 인해 다른 일을 할 수 없어 Google Code Jam 본대회 Qualification Round를 불참했는데, 마침 오늘 Code Jam Kickstart 가 있길래 참가해봤다.

Kickstart는 CodeJam 본대회와 달리 비교적 자주 진행되고(2017년 기준 7회), 다양한 시간대에 분포해 있어 코포처럼 새벽까지 깨어있지 않아도 참가할 수 있다. 대회 자체적으로 상을 주지는 않지만 좋은 성적을 낼 경우 구글에서 인턴/입사 인터뷰 메일이 오기도 하니 시간이 된다면 참가해보자. 실제로 2017년 Kickstart Round G 때 15등 찍어서 메일 받아봄.

한동안 코딩을 하지 않아 걱정했는데 다행히 풀이들이 비교적 금방 떠올랐고, 최종 14등으로 대회를 마칠 수 있었다.

문제는 여기 에서 볼 수 있다. 어차피 며칠 후면 analysis가 올라오겠지만 내 풀이를 간단히 적어봤다.

Problem A. Planet Distance

사이클이 하나 있는 그래프가 주어지면, 각 정점에서 사이클까지의 거리를 구하는 문제이다. Cycle-Detection을 진행하고 어떤 정점들이 사이클에 속하는지 구해 BFS를 돌리면 된다. 코딩이 조금 까다로울 것이라 생각했으나 Large의 N제한이 1000인 걸 보고 그냥 O(N^2)으로 구현했다.

Problem B. Fairies and Witches

주어진 그래프의 각 간선이 막대라고 가정하자. 이들 중 다음을 만족하는 막대들의 집합의 수를 구하는 문제이다.

  • 집합의 어떤 두 막대도 원 그래프에서 인접(=끝점을 공유)하지 않는다.
  • 집합의 막대들을 모두 사용해 넓이가 0이 아닌 Convex Polygon을 만들 수 있다.

이중 Convex Polygon에 대한 두 번째 조건은 다음과 같이 바꿀 수 있다.

  • 집합에 속한 막대의 수가 3 이상이다.
  • 집합에 속한 막대의 총 길이 합은 가장 긴 막대길이의 2배를 넘어야 한다.

이제 첫 번째 조건을 만족하는 집합을 생성하고 위 조건을 고려하면 된다. 이는 N제한이 Small에서 6, Large에서 15로 주어졌기에 완전탐색으로 풀 수 있다고 생각했다. Small의 경우 O(2^E)로도 가능했으나 Large를 해결하기엔 약간 부족했고, 집합에서 “간선끼리 공유하는 정점이 없다” = “각 정점에서 최대 하나의 인접간선만 뽑을 수 있다"는 점에 착안해 고려해야 하는 경우의 수를 크게 줄일 수 있었다.

Problem C. Kickstart Alarm

문제 링크에 공식이 나와 있어 따로 작성하지는 않는다. 주어진 공식으로 POWER_i라는 값이 정의될 때, i가 1~K까지 모든 POWER의 합을 구하는 문제이다. 식을 정리하면 결과적으로 다음을 구하라는 문제로 바뀐다.

A[1], A[2], …, A[N]에 대해

A[i] x (N-i+1) x ( (1^1+1^2+…+1^K) + (2^1+2^2+…+2^K) + … + (i^1+i^2+…+i^K))

들의 합을 구하라.

a^1 + a^2 + a^3 + … + a^K를 등비수열의 합 공식을 써 구할 수 있다는 것만 파악하면 O(N logK)에 해결할 수 있다.

해당 라운드의 최종 스코어보드 에서 각 참가자가 작성한 코드를 다운받을 수 있으니 참고하자.

관련 글

SCPC 2017 후기

·2 분
지난 8월 17일 삼성전자 서울 R&D캠퍼스에서 열린 SCPC(Samsung Collegiate Programming Cup) 본선대회에 참가했다. 2015년 1회 대회부터 계속 본선까지만 진출하고 막상 수상은 못했어서 이번이 사실상 마지막 기회였는데, 졸업 전 마지막 대회라 운이 좋았는지 4등상(+200만원)을 받아갈 수 있었다. 개인별로 사진과 같은 환경이 제공되었고 저기서 노트북이랑 책상 빼고는 전부 집으로 가져갈 수 있었다. 메인은 역시 기계식키보드

Coq 02 - 자연수 덧셈의 결합법칙 증명

·5 분
대부분의 reference가 그렇듯이 읽다보면 쉽게 지루해진다. 지루함을 덜하고 Coq에 익숙해지기 위해 일단 예제를 조금씩 따라해보면서 익혀가기로 했다. 자바를 처음 배울 때 public static void main(int argv, char **argc)가 정확히 뭔지는 몰라도 “Hello World” 부터 찍어보는 그런 마음으로 진행해봤다. CoqIDE 실행 프로그램을 처음 실행하면 다음과 같은 화면을 볼 수 있다. 크게 3가지 창으로 나뉘어져 있으며, 왼쪽은 코드 작성을, 오른쪽 위/아래는 각각 Proof 보조/결과 출력을 담당하는 역할이었다.

Coq 01 - Introduction

·6 분
<Interactive Theorem Proving and Program Development>라는 책을 추천받아 조금씩 읽어보기로 했다. 첫 장에서는 Coq에 대한 간단한 안내를 진행한다. 책의 순서를 따라가면서 하나씩 알아보자 타입 먼저 Coq에서는 Gallina라는 언어를 사용해 요구사항(Specification)을 서술한다. 대부분의 다른 프로그래밍 언어들과 마찬가지로 타입은 declaration과 typing rule에 의해 정해진다.