Advent of Code 퍼즐을 Kotlin답게 풀어보기

Advent of Code 퍼즐을 Kotlin답게 풀어보기

Advent of Code는 매년 12월에 열리는 행사예요. 12월 1일부터 25일까지, 축제 분위기의 퍼즐이 매일 하나씩 공개되죠. Advent of Code를 만든 Eric Wastl의 허락을 받아서, 이 퍼즐들을 어떻게 Kotlin의 관용적인 스타일(idiomatic Kotlin)로 풀 수 있는지 하나씩 보여드릴게요. 크리스마스 캘린더처럼 하루에 한 문제씩 푸는 재미를 Kotlin 배우기와 함께 즐겨볼 수 있어요.

출처: Advent of Code puzzles in idiomatic Kotlin

본문

Advent of Code 2025, 2024, 2023, 2022, 2021, 2020의 해법을 이 페이지에서 정리했어요.

Advent of Code 준비하기

Advent of Code 문제를 Kotlin으로 풀기 시작하는 기본적인 요령부터 알려드릴게요.

  • 이 GitHub 템플릿을 사용해서 프로젝트를 만들어요
  • Kotlin 개발자 어드보커트 Sebastian Aigner의 환영 영상도 확인해 보세요

Advent of Code 2022

Day 1: Calorie counting

Kotlin Advent of Code 템플릿과, Kotlin에서 문자열·컬렉션을 다룰 때 쓰는 편리한 함수들을 배워요. 대표적으로 maxOf()sumOf()가 있어요. 확장 함수(extension function)를 어떻게 활용하면 해답을 깔끔하게 구조화할 수 있는지도 함께 살펴봐요.

  • Advent of Code에서 퍼즐 설명 읽기
  • 영상에서 해답 확인하기: Advent of Code 2022 Day 1 | Kotlin

Day 2: Rock paper scissors

Kotlin의 Char 타입 연산을 이해하고, Pair 타입과 to 생성자가 패턴 매칭과 잘 어울린다는 걸 확인해요. 그리고 compareTo() 함수를 써서 자신만의 객체에 순서를 부여하는 방법도 배워요.

  • Advent of Code에서 퍼즐 설명 읽기
  • 영상에서 해답 확인하기: Advent of Code 2022 Day 2 | Kotlin

Day 3: Rucksack reorganization

kotlinx.benchmark 라이브러리가 어떻게 코드의 성능 특성을 이해하게 해 주는지 배워요. intersect 같은 집합 연산으로 겹치는 데이터를 골라내는 법을 보고, 같은 해답의 서로 다른 구현들 간 성능 비교도 확인해요.

  • Advent of Code에서 퍼즐 설명 읽기
  • 영상에서 해답 확인하기: Advent of Code 2022 Day 3 | Kotlin

Day 4: Camp cleanup

infixoperator 함수가 코드를 얼마나 표현력 있게 만들어 주는지 보면서, StringIntRange 타입의 확장 함수로 입력을 쉽게 파싱하는 방법도 함께 봐요.

  • Advent of Code에서 퍼즐 설명 읽기
  • 영상에서 해답 확인하기: Advent of Code 2022 Day 4 | Kotlin

Day 5: Supply stacks

팩토리 함수로 더 복잡한 객체를 만드는 법, 정규 표현식 사용법, 그리고 양방향 큐인 ArrayDeque 타입을 배워요.

  • Advent of Code에서 퍼즐 설명 읽기
  • 영상에서 해답 확인하기: Advent of Code 2022 Day 5 | Kotlin

Day 6: Tuning trouble

kotlinx.benchmark 라이브러리로 더 깊이 있게 성능을 조사해 봐요. 같은 해답의 16가지 변형의 특성을 비교하는 내용이에요.

  • Advent of Code에서 퍼즐 설명 읽기
  • 영상에서 해답 확인하기: Advent of Code 2022 Day 6 | Kotlin

Day 7: No space left on device

트리 구조를 모델링하는 법을 배우고, Kotlin 코드를 프로그램적으로 생성하는 데모도 구경해요.

  • Advent of Code에서 퍼즐 설명 읽기
  • 영상에서 해답 확인하기: Advent of Code 2022 Day 7 | Kotlin

Day 8: Treetop tree house

sequence 빌더가 실제로 어떻게 동작하는지 보고, 프로그램의 초안과 idiomatic Kotlin 해답이 얼마나 달라질 수 있는지도 봐요. 여기엔 특별 게스트 Roman Elizarov가 함께해요!

  • Advent of Code에서 퍼즐 설명 읽기
  • 영상에서 해답 확인하기: Advent of Code 2022 Day 8 | Kotlin

Day 9: Rope bridge

run 함수와 라벨 반환(labeled return)을 보고, coerceIn이나 zipWithNext 같은 편리한 표준 라이브러리 함수도 살펴봐요. ListMutableList 생성자로 원하는 크기의 리스트를 만드는 법과, 문제 상황을 Kotlin으로 시각화한 모습도 엿볼 수 있어요.

  • Advent of Code에서 퍼즐 설명 읽기
  • 영상에서 해답 확인하기: Advent of Code 2022 Day 9 | Kotlin

Day 10: Cathode-ray tube

범위(range)와 in 연산자가 범위 확인을 얼마나 자연스럽게 만드는지, 함수 파라미터를 어떻게 리시버로 바꾸는지 배우고, tailrec 수식어도 가볍게 살펴봐요.

  • Advent of Code에서 퍼즐 설명 읽기
  • 영상에서 해답 확인하기: Advent of Code 2022 Day 10 | Kotlin

Day 11: Monkey in the middle

가변적(mutable)이고 명령적인 코드에서 불변·읽기 전용 데이터 구조를 쓰는 더 함수적인 접근으로 옮겨가는 법을 봐요. 컨텍스트 리시버(context receiver)에 대해서도 배우고, 게스트가 Advent of Code만을 위해 직접 만든 시각화 라이브러리 이야기도 들어볼 수 있어요.

  • Advent of Code에서 퍼즐 설명 읽기
  • 영상에서 해답 확인하기: Advent of Code 2022 Day 11 | Kotlin

Day 12: Hill Climbing algorithm

큐(queue), ArrayDeque, 함수 참조(function reference), tailrec 수식어를 써서 Kotlin으로 경로 탐색 문제를 풀어봐요.

  • Advent of Code에서 퍼즐 설명 읽기
  • 영상에서 해답 확인하기: Advent of Code 2022 Day 12 | Kotlin

Advent of Code 2021

참고: Advent of Code 2021에 관한 블로그 포스트도 읽어보세요.

Day 1: Sonar sweep

windowedcount 함수를 적용해서 정수 쌍(pair)과 쌍삼조(triplet)를 다뤄봐요.

  • Advent of Code에서 퍼즐 설명 읽기
  • Kotlin Blog의 Anton Arhipov 해답을 확인하거나 영상 보기: Advent of Code 2021 in Kotlin, Day 1: Sonar Sweep

Day 2: Dive!

구조 분해 선언(destructuring declaration)과 when 식에 대해 배워요.

  • Advent of Code에서 퍼즐 설명 읽기
  • GitHub의 Pasha Finkelshteyn 해답을 확인하거나 영상 보기: Advent of Code 2021 in Kotlin, Day 2: Dive!

Day 3: Binary diagnostic

이진수를 다루는 다양한 방법을 살펴봐요.

  • Advent of Code에서 퍼즐 설명 읽기
  • Kotlin Blog의 Sebastian Aigner 해답을 확인하거나 영상 보기: Advent of Code 2021 in Kotlin, Day 3: Binary Diagnostic

Day 4: Giant squid

입력을 파싱하는 법을 배우고, 더 편리하게 처리하기 위해 몇 가지 도메인 클래스를 도입해요.

  • Advent of Code에서 퍼즐 설명 읽기
  • GitHub의 Anton Arhipov 해답을 확인하거나 영상 보기: Advent of Code 2021 in Kotlin, Day 4: Giant Squid

Advent of Code 2020

참고: Advent of Code 2020 퍼즐의 모든 해답을 저희 GitHub 저장소에서 찾을 수 있어요.

Day 1: Report repair

입력 처리, 리스트 순회, 맵을 만드는 여러 방법을 살펴보고, let 함수로 코드를 단순하게 만드는 법도 배워요.

  • Advent of Code에서 퍼즐 설명 읽기
  • Kotlin Blog의 Svetlana Isakova 해답을 확인하거나 영상 보기: Learn Kotlin With the Kotlin Team: Advent of Code 2020 #1

Day 2: Password philosophy

문자열 유틸리티 함수, 정규 표현식, 컬렉션 연산을 살펴보고, let 함수가 식(expression) 변환에 얼마나 유용한지도 봐요.

  • Advent of Code에서 퍼즐 설명 읽기
  • Kotlin Blog의 Svetlana Isakova 해답을 확인하거나 영상 보기: Learn Kotlin with The Kotlin Team: Advent of Code 2020 #2

Day 3: Toboggan trajectory

명령적 코드와 더 함수적인 코드 스타일을 비교하고, 쌍(pair)과 reduce() 함수를 다루며, 코드 편집의 컬럼 선택 모드와 정수 오버플로 문제 해결도 함께 살펴봐요.

  • Advent of Code에서 퍼즐 설명 읽기
  • GitHub의 Mikhail Dvorkin 해답을 확인하거나 영상 보기: Learn Kotlin with the Kotlin Team: Advent of Code 2020 #3

Day 4: Passport processing

when 식을 적용하고, 입력을 검증하는 여러 방법(유틸리티 함수, 범위 다루기, 집합 멤버십 확인, 특정 정규 표현식 매칭)을 살펴봐요.

  • Advent of Code에서 퍼즐 설명 읽기
  • Kotlin Blog의 Sebastian Aigner 해답을 확인하거나 영상 보기: Learn Kotlin with the Kotlin Team: Advent of Code 2020 #4

Day 5: Binary boarding

Kotlin 표준 라이브러리 함수(replace(), toInt(), find())를 써서 숫자의 이진 표현을 다루고, 강력한 지역 함수(local function)를 살펴보며, Kotlin 1.5의 max() 함수 사용법도 배워요.

  • Advent of Code에서 퍼즐 설명 읽기
  • Kotlin Blog의 Svetlana Isakova 해답을 확인하거나 영상 보기: Learn Kotlin with the Kotlin Team: Advent of Code 2020 #5

Day 6: Custom customs

표준 라이브러리 함수인 map(), reduce(), sumOf(), intersect(), union()을 써서 문자열과 컬렉션의 문자를 그룹화하고 세는 법을 배워요.

  • Advent of Code에서 퍼즐 설명 읽기
  • Kotlin Blog의 Anton Arhipov 해답을 확인하거나 영상 보기: Learn Kotlin with the Kotlin Team: Advent of Code 2020 #6

Day 7: Handy haversacks

정규 표현식 사용법, Kotlin에서 Java의 HashMapcompute() 메서드를 써서 맵의 값을 동적으로 계산하는 법, forEachLine() 함수로 파일을 읽는 법을 배워요. 그리고 탐색 알고리즘인 깊이 우선(DFS)과 너비 우선(BFS)을 비교해 봐요.

  • Advent of Code에서 퍼즐 설명 읽기
  • Kotlin Blog의 Pasha Finkelshteyn 해답을 확인하거나 영상 보기: Learn Kotlin with the Kotlin Team: Advent of Code 2020 #7

Day 8: Handheld halting

sealed class와 람다로 명령어를 표현하고, Kotlin 집합으로 프로그램 실행 중의 루프를 찾아내며, 시퀀스와 sequence { } 빌더 함수로 지연(lazy) 컬렉션을 구성해요. 성능 지표를 확인하는 실험적인 measureTimedValue() 함수도 시도해 봐요.

  • Advent of Code에서 퍼즐 설명 읽기
  • Kotlin Blog의 Sebastian Aigner 해답을 확인하거나 영상 보기: Learn Kotlin with the Kotlin Team: Advent of Code 2020 #8

Day 9: Encoding error

any(), firstOrNull(), firstNotNullOfOrNull(), windowed(), takeIf(), scan() 함수로 Kotlin에서 리스트를 다루는 여러 방법을 살펴봐요. 이 함수들은 idiomatic Kotlin 스타일을 잘 보여주는 예시예요.

  • Advent of Code에서 퍼즐 설명 읽기
  • Kotlin Blog의 Svetlana Isakova 해답을 확인하거나 영상 보기: Learn Kotlin with the Kotlin Team: Advent of Code 2020 #9

더 알아보기

  • Kotlin Koans로 더 많은 과제를 풀어보기
  • JetBrains Academy의 무료 Kotlin Core 트랙으로 실제 동작하는 앱 만들기