Advent of Code 2025 시작 및 Day 1

Advent of Code 2025 시작 및 Day 1
advent of code backgroud image

자주보는 GeekNews에서 Advent of Code 2025 들을 보고 예전에 코딩테스트 문제 풀던 시절이 떠올라 참여함
주소: GeekNews AOC 2025

설명은

  • Advent of Code는 Eric Wastl이 만든 연례 프로그래밍 퍼즐 이벤트로, 매년 12월 1일부터 시작되는 온라인 어드벤트 캘린더 형식의 퍼즐 제공
    • 참가자는 매일 새로운 문제를 풀며, 언어 제약 없이 자유롭게 풀이 가능
    • 문제는 면접 대비, 교육, 연습, 경쟁, 상호 도전 등 다양한 용도로 활용됨
  • 참여에 컴퓨터 과학 전공 지식은 필요하지 않으며, 기본적인 프로그래밍과 문제 해결 능력만으로 충분함
    • 모든 문제는 10년 된 하드웨어에서도 15초 이내 실행 완료 가능

12일동안 총 12문제 24파트로 구성되고 하루에 1문제 2파트가 공개됌.

풀이방식은 항상 그렇듯이 브루트포스로 시작해서 시간복잡도를 줄이는 방향으로 풀이할 생각이다. 특별한 경우가 아니라면 브루트포스로 풀린문제를 더 나은 시간복잡도로 개선하진않을 것 같다.(할수도 안할수도 ㅎㅎ)

한국 시간 매일 오후 2시에 문제가 오픈되고 나는 넉넉하게 저녁에 퇴근하고 풀생각임. 랭킹은 의미없다...

번역은 파파고 돌렸습니다 ㅋㅋ

Day1문제부터 풀어보겠다.

Part 1

## --- Day 1: 비밀 입구 ---

엘프들은 좋은 소식과 나쁜 소식을 가지고 있어요.

좋은 소식은 그들이 [프로젝트 관리](https://en.wikipedia.org/wiki/Project_management)! 을 발견했다는 것입니다. 이를 통해 평소 크리스마스 비상사태를 예방하는 데 필요한 도구를 갖추게 되었습니다. 예를 들어, 이제 그들은 북극 장식을 빨리 끝내야 다른 중요한 작업을 제때 시작할 수 있다는 것을 알게 되었습니다.

나쁜 소식은 그들이 _다른_ 비상사태를 겪고 있다는 것을 깨달았다는 것입니다: 그들의 자원 계획에 따르면, 그들 중 어느 누구도 북극을 장식할 시간이 남지 않았다는 것입니다!

크리스마스를 지키기 위해 엘프들은 _당신_이 _12월 12일까지 북극 장식을 완료해야 합니다_.

퍼즐을 풀어서 별을 모으세요. 매일 두 개의 퍼즐이 제공되며, 첫 번째 퍼즐을 완료하면 두 번째 퍼즐이 잠금 해제됩니다. 각 퍼즐은 _별_ 하나씩 제공됩니다. 행운을 빕니다!

장식을 시작할 준비가 된 북극 기지의 비밀 입구에 도착합니다. 안타깝게도 _비밀번호_가 변경된 것 같아서 입장할 수 없습니다. 벽에 테이프로 붙인 문서가 유용하게 설명합니다:

"새로운 보안 프로토콜로 인해 비밀번호는 아래 금고에 잠겨 있습니다. 새로운 조합에 대해서는 첨부된 문서를 참조하세요."

금고에는 화살표만 있는 다이얼이 있고 다이얼 주위에는 '0'부터 '99'까지의 숫자가 순서대로 표시되어 있습니다. 다이얼을 돌리면 각 숫자에 도달할 때 작은 _클릭_ 소음이 납니다.

첨부된 문서(퍼즐 입력)에는 금고를 여는 방법을 알려주는 _회전_ 시퀀스가 포함되어 있습니다. 회전은 'L' 또는 'R'로 시작하는데, 이는 회전이 _왼쪽_(숫자가 낮을수록) 또는 _오른쪽_(숫자가 높을수록) 중 어느 쪽으로 회전해야 하는지를 나타냅니다. 그런 다음 회전에는 다이얼을 해당 방향으로 몇 번 클릭해야 하는지를 나타내는 _distance_ 값이 있습니다.

따라서 다이얼이 '11'을 가리키고 있다면 'R8'을 회전시키면 다이얼이 '19'를 가리키게 됩니다. 그 후 'L19'를 회전하면 '0'을 가리키게 됩니다.

다이얼이 원이기 때문에 다이얼을 '0'에서 '왼쪽'으로 한 번 클릭하면 '99'를 가리킵니다. 마찬가지로 다이얼을 '99'에서 오른쪽으로 돌리면 클릭 한 번으로 '0'을 가리킵니다.

따라서 다이얼이 '5'를 가리키고 있다면 'L10'을 회전시키면 '95'를 가리킬 수 있습니다. 그 후 'R5'를 회전하면 '0'을 가리킬 수 있습니다.

다이얼은 '50'을 가리키며 시작됩니다.  
  
지침을 따를 수도 있지만, 최근 필요한 북극 비밀 출입 보안 교육 세미나에서 금고가 실제로 미끼라는 사실을 배웠습니다. 실제 비밀번호는 _순서를 회전한 후 다이얼이 '0'을 가리키게 된 횟수_입니다.  
  
예를 들어, 첨부된 문서에 다음과 같은 회전이 포함되어 있다고 가정해 보겠습니다:

"""
L68
L30
R48
L5
R60
L55
L1
L99
R14
L82
"""

이러한 회전을 따르면 다이얼이 다음과 같이 움직입니다:  
  
- 다이얼은 '50'을 가리키며 시작됩니다.  
- 다이얼이 'L68'로 회전하여 '82'를 가리킵니다.  
- 다이얼이 'L30'으로 회전하여 '52'를 가리킵니다.  
- 다이얼이 'R48'로 회전하여 '_0_'을 가리킵니다.  
- 다이얼이 'L5'로 회전하여 '95'를 가리킵니다.  
- 다이얼이 'R60'으로 회전하여 '55'를 가리킵니다.  
- 다이얼이 'L55'로 회전하여 '_0_'을 가리킵니다.  
- 다이얼이 'L1'로 회전하여 '99'를 가리킵니다.  
- 다이얼이 'L99'로 회전하여 '_0_'을 가리킵니다.  
- 다이얼이 'R14'로 회전하여 '14'를 가리킵니다.  
- 다이얼이 'L82'로 회전하여 '32'를 가리킵니다.  
  
이 과정에서 다이얼이 '0'을 총 세 번 가리키기 때문에 이 예제의 비밀번호는 '_3_'입니다.  
  
첨부된 문서에서 회전을 분석하세요. _문을 여는 실제 비밀번호는 무엇인가요?_?

정답

/**
 *
 * @param {string[]} input
 */
function main(input) {
  let count = 50;
  let answer = 0;
  
  input.forEach((element) => {
    const direction = element.slice(0, 1);
    const rotate = element.slice(1);
  
    const i = parseInt(rotate, 10);
  
    if (direction === "R") {
      count += i;
    } else {
      count -= parseInt(rotate, 10);
    }
  
    const mod = count.toString().slice(-2);
    if (mod === "0" || mod === "00") {
      answer += 1;
    }
  });
  
  console.log(answer);
}
 
const input = `R30`
main(input.split("\n").map((s) => s.trim()));

해설

자물쇠를 rotate만큼 돌려서 나온 숫자가 딱 0일때 카운트

Part 2

올바른 비밀번호라고 확신하지만 문이 열리지 않습니다. 노크를 하지만 아무도 대답하지 않습니다. 생각하는 동안 눈사람을 만듭니다.  
  
눈사람을 위해 눈덩이를 굴리다가 눈 속에 떨어졌을 것 같은 또 다른 보안 문서를 발견합니다:  
  
"새로운 보안 프로토콜로 인해, 추후 공지가 있을 때까지 비밀번호 방법 0x434C49434B를 사용해 주세요."  
  
교육 세미나에서 "방법 0x434C49434B"는 회전 중이든 회전이 끝날 때든 상관없이 클릭이 다이얼을 0으로 향하게 하는 횟수를 실제로 세는다는 것을 의미합니다.  
  
위의 예와 동일한 회전을 따라 다이얼이 회전하는 동안 몇 번 더 0을 가리킵니다:  
  
다이얼은 50을 가리키며 시작합니다.  
다이얼은 82를 가리키도록 L68을 회전시킵니다. 이 회전 동안 다이얼은 한 번에 0을 가리킵니다.  
다이얼이 52를 가리키도록 L30 회전합니다.  
다이얼이 R48로 회전하여 0을 가리킵니다.  
다이얼이 95를 가리키도록 L5 회전합니다.  
다이얼은 R60을 회전시켜 55를 가리키게 합니다. 이 회전 동안 다이얼은 한 번에 0을 가리킵니다.  
다이얼이 0을 가리키도록 L55로 회전합니다.  
다이얼이 L1 회전하여 99를 가리킵니다.  
다이얼이 0을 가리키기 위해 L99로 회전합니다.  
다이얼이 R14 회전하여 14를 가리킵니다.  
다이얼은 32를 가리키도록 L82를 회전시킵니다. 이 회전 동안 다이얼은 한 번에 0을 가리킵니다.  
이 예제에서 다이얼은 회전이 끝날 때 0을 세 번 가리키고, 회전 중에 세 번 더 가리키게 됩니다. 따라서 이 예제에서는 새 비밀번호가 6이 됩니다.  
  
조심하세요: 다이얼이 50을 가리키고 있다면, R1000처럼 한 번 회전하면 다이얼이 0을 10번 가리키다가 다시 50으로 돌아갈 수 있습니다!  
  
비밀번호 메서드 0x434C49434B를 사용하여 문을 여는 비밀번호는 무엇인가요?

정답

/**
 *
 * @param {string[]} input
 */

function main(input) {
  let count = 50;
  let answer = 0;
  
  input.forEach((element) => {
    const direction = element.slice(0, 1);
    const rotate = element.slice(1);
  
    const i = parseInt(rotate, 10);
  
    if (direction === "R") {
      for (let start = 0; start < i; start++) {
        count += 1;
  
        const mod = count.toString().slice(-2);
        if (mod === "0" || mod === "00") {
          answer += 1;
        }
      }
    } else {
      for (let start = 0; start < i; start++) {
        count -= 1;
  
        const mod = count.toString().slice(-2);
        if (mod === "0" || mod === "00") {
          answer += 1;
        }
      }
    }
  });
  
  console.log(answer);
}
  
const input = `R30`
main(input.split("\n").map((s) => s.trim()));

해설

자물쇠를 rotate만큼 돌리면서 지나가는 숫자가 딱 0일때 카운트

Day 1이라 역시 쉬운 문제가 나왔고 바로 코드 써내려가면서 푼것같다.