Advent of Code 2025 Day 2
자세한 설명은 DAY1 포스팅확인!
바로 문제 풀어보겠다~
마찬가지로 번역은 파파고 사용했습니다!
Part 1
--- 둘째 날: 선물 가게 ---
안으로 들어가 엘리베이터를 타고 유일한 다른 정류장인 선물 가게로 향합니다. "북극을 방문해 주셔서 감사합니다!" 근처 표지판이 기쁜 마음으로 외칩니다. 누가 북극을 방문해도 되는지는 확실하지 않지만 여기를 통해 로비에 접근할 수 있고, 거기서부터 북극 기지의 나머지 부분에 접근할 수 있습니다.
놀라울 정도로 다양한 선택지를 지나가다가 점원 중 한 명이 당신을 알아보고 도움을 요청합니다.
알고 보니, 어린 엘프 중 한 명이 선물 가게 컴퓨터에서 게임을 하다가 선물 가게 데이터베이스에 잘못된 제품 ID를 추가하는 데 성공했어요! 물론, 그들의 잘못된 제품 ID를 식별하는 데 문제가 없겠죠?
그들은 이미 대부분의 제품 ID 범위를 확인했습니다. 확인해야 할 제품 ID 범위는 몇 가지(퍼즐 입력)뿐입니다. 예를 들어:
11-22,95-115,998-1012,1188511880-1188511890,222220-222224,
1698522-1698528,446443-446449,38593856-38593862,565653-565659,
824824821-824824827,2121212118-2121212124
(ID 범위는 읽기 쉽도록 여기에 포장되어 있으며, 입력 시 한 줄로 길게 표시됩니다.)
범위는 쉼표(,)로 구분되며, 각 범위는 대시(-)로 구분된 첫 번째 ID와 마지막 ID를 제공합니다.
어린 엘프가 어리석은 패턴을 하고 있었기 때문에, 유효하지 않은 ID를 찾기 위해 특정 숫자 시퀀스만 두 번 반복되는 ID를 찾으면 됩니다. 따라서 55(두 번 5개), 6464(두 번 64개), 123123(두 번)은 모두 유효하지 않은 ID가 됩니다.
숫자 중 어느 것도 선행 0이 없습니다. 0101은 전혀 ID가 아닙니다. (101은 무시할 수 있는 유효한 ID입니다.)
당신의 임무는 주어진 범위에 나타나는 모든 유효하지 않은 ID를 찾는 것입니다. 위의 예시에서:
11-22에는 11과 22라는 두 개의 유효하지 않은 ID가 있습니다.
95-115에는 유효하지 않은 ID 99가 하나 있습니다.
998-1012에 유효하지 않은 ID가 하나 있습니다.
118511880-118511890에 유효하지 않은 ID가 하나 있습니다.
222220-222224에 유효하지 않은 ID가 하나 있습니다.
1698522-1698528에는 유효하지 않은 ID가 포함되어 있지 않습니다.
446443-446449에 유효하지 않은 ID가 하나 있습니다.
38593856-38593862에 유효하지 않은 ID가 하나 있습니다.
나머지 범위에는 유효하지 않은 ID가 포함되어 있지 않습니다.
이 예제의 모든 유효하지 않은 ID를 합산하면 1227775554가 생성됩니다.
유효하지 않은 ID를 모두 합치면 무엇을 얻을 수 있나요?
정답
function main(input) {
const rangeList = input.split(",");
let answer = 0;
rangeList.forEach((range) => {
const [start, end] = range.split("-").map(Number);
for (let i = start; i <= end; i++) {
if (i.toString().length % 2 === 1) {
continue;
}
const half = i.toString().length / 2;
const firstHalf = i.toString().slice(0, half);
const secondHalf = i.toString().slice(half);
if (firstHalf !== secondHalf) {
continue;
}
answer += i;
}
});
console.log(answer);
}
const input = `2200670-2267527,265-409,38866-50720,7697424-7724736,33303664-33374980,687053-834889,953123-983345,3691832-3890175,26544-37124,7219840722-7219900143,7575626241-7575840141,1-18,1995-2479,101904-163230,97916763-98009247,52011-79060,31-49,4578-6831,3310890-3365637,414256-608125,552-1005,16995-24728,6985-10895,878311-912296,59-93,9978301-10012088,17302200-17437063,1786628373-1786840083,6955834840-6955903320,983351-1034902,842824238-842861540,14027173-14217812`;
main(input);
해설
- 문자열의 길이가 홀수면 패스
- 문자열을 절반으로 나눠서 둘이 비교
Part 2
--- 파트 2 ---
점원은 목록의 범위에 여전히 유효하지 않은 ID가 있다는 것을 재빨리 발견합니다. 어쩌면 젊은 엘프도 다른 어리석은 패턴을 하고 있었던 걸까요?
이제 ID는 최소 두 번 반복되는 일부 숫자 시퀀스로만 구성된 경우 유효하지 않습니다. 따라서 12341234(1234 두 번), 123123(123 세 번), 12121212(1212 다섯 번), 11111(1 7번)은 모두 유효하지 않은 ID입니다.
이전과 동일한 예에서:
11-22에는 여전히 유효하지 않은 두 개의 ID, 11과 22가 있습니다.
95-115에는 이제 99와 111이라는 두 개의 유효하지 않은 ID가 있습니다.
998-1012에는 이제 999와 1010이라는 두 개의 유효하지 않은 ID가 있습니다.
118511880-118511890에는 여전히 유효하지 않은 ID인 118511885가 하나 있습니다.
222220-222224에는 여전히 유효하지 않은 ID인 222222가 하나 있습니다.
1698522-1698528에는 여전히 유효한 ID가 없습니다.
46443-44649에 여전히 유효하지 않은 ID가 하나 있습니다.
38593856-38593862에는 여전히 유효하지 않은 ID인 38593859가 하나 있습니다.
565653-565659 now has one invalid ID, 565656.
824824821-824824827 now has one invalid ID, 824824824.
21212118-21212124에 유효하지 않은 ID가 하나 있습니다.
이 예제의 모든 유효하지 않은 ID를 합산하면 4174379265가 생성됩니다.
이 새로운 규칙을 사용하여 모든 유효하지 않은 ID를 합산하면 무엇을 얻을 수 있나요?
정답
function main(input) {
const rangeList = input.split(",");
let answer = 0;
rangeList.forEach((range) => {
const [start, end] = range.split("-").map(Number);
for (let i = start; i <= end; i++) {
const regex = /^(\d+)\1+$/;
if (regex.test(i.toString())) {
answer += i;
}
}
});
console.log(answer);
}
const input = `2200670-2267527,265-409,38866-50720,7697424-7724736,33303664-33374980,687053-834889,953123-983345,3691832-3890175,26544-37124,7219840722-7219900143,7575626241-7575840141,1-18,1995-2479,101904-163230,97916763-98009247,52011-79060,31-49,4578-6831,3310890-3365637,414256-608125,552-1005,16995-24728,6985-10895,878311-912296,59-93,9978301-10012088,17302200-17437063,1786628373-1786840083,6955834840-6955903320,983351-1034902,842824238-842861540,14027173-14217812`;
main(input);
해설
Part1은 2번반복된 것만 찾아야하고 이번에는 2번 이상도 가능하기때문에 브루트포스로 진행해 모든 경우의 수를 검사함
Day2도 브루트포스로 1초 이내에 풀려서 따로 시간복잡도를 줄이진않았다.
기준없이 오래걸린다 싶으면 최적화를 하려했는데 performance.now()로 시간찍고 3초 미만으로 풀렸을 경우에만 정답으로 간주하고 넘어간다면 시간복잡도를 줄여야겠다.
공간복잡도의 경우에는... 고려해야하는 문제가 나올때 생각해보겠다.