Advent of Code는 매년 12월에 열리는 알고리즘 챌린지 시리즈로, 코딩 실력 향상 및 AI 없이 문제 해결 연습에 매우 유용합니다. 🎄
효율적인 개발 환경 구축을 위해 TypeScript, Node.js, VS Code를 사용하며, npm/pnpm으로 프로젝트를 초기화하고 @types/node, typescript를 설치합니다. 🛠️
tsconfig.json을 Node.js 타입에 맞게 설정하고, package.json에 "type": "module"을 추가하여 import 문을 사용할 수 있도록 합니다. ⚙️
퍼즐 입력은 fs/promises 모듈을 사용하여 sample_input.txt 및 input.txt 파일에서 읽어오며, 각 줄을 기준으로 분리하여 처리합니다. 📄
Day 1 문제는 0부터 99까지의 숫자가 있는 원형 다이얼(총 100개 값)이 50에서 시작하여, 주어진 방향(좌/우)과 값만큼 회전할 때 0을 몇 번 통과하는지 계산하는 것입니다. 🎯
Day 1의 핵심 로직은 회전 방향에 따라 값을 양수/음수로 변환하고, current = (current + value) 계산 후 음수 결과에 대해 while 루프를 통해 total (100)을 반복적으로 더하여 올바른 랩핑을 처리하는 것입니다. 🌀
최종 다이얼 위치는 current = change % total을 사용하여 항상 0-99 범위 내에 있도록 하며, current 값이 0이 될 때마다 카운트를 증가시킵니다. 🔢
Day 2 문제는 다이얼이 0을 지나칠 때마다 카운트하는 것으로, 단순히 0에 멈추는 것이 아니라 회전 중 0을 넘어서는 횟수를 계산합니다. 🛣️
Day 2의 핵심 로직은 특히 'Left' 회전(음수 값)의 경우 Math.floor((value * -1) / total)을 사용하여 0을 몇 번 완전히 지나쳤는지 계산하고, 이 divisions 값을 총 카운트에 추가하는 것입니다. 📈
음수 값에 대한 모듈로 연산을 항상 양수로 반환하는 사용자 정의 mod 함수(((value % divisor) + divisor) % divisor 또는 value - divisor * Math.floor(value / divisor))를 구현하여 랩핑 로직을 단순화하고 코드의 견고성을 높입니다. ✨