엘릭서 169

Advent of Code 2022 Day 25 in Elixir - Full of Hot Air 풀이

문제 보기 AoC2022 마지막 날 문제. 아주 상냥한 난이도였다. 5진수인데 0부터 4까지의 대신 -2~2를 쓰는(헷갈리지 않기 위해 -2는 =로, -1은 -로 나타낸다) 특이한 숫자 표기법을 해독하는 문제였다. 예를 들면 이런 식. Decimal SNAFU 1 1 2 2 3 1= 4 1- 5 10 6 11 7 12 8 2= 9 2- 10 20 15 1=0 20 1-0 2022 1=11-2 12345 1-0---0 314159265 1121-1110-1=0 이 숫자를 10진수로 바꾸는 것은 기본 규칙은 다른 진법 변환과 같으니 그리 어려운 것은 아니었고, 주어진 숫자들을 모두 더한 뒤 다시 변형 5진법으로 바꾸는 것에 조금 고민을 했다. 10진수를 일반적인 5진법으로 바꿨을 때 3, 4에 해당하는 수는..

Advent of Code 2022 Day 24 in Elixir - Blizzard Basin 풀이

문제 보기 주어진 지도에서 눈 폭풍이 방향을 따라 이동할 때, 출발 지점부터 도착 지점까지 눈 폭풍을 피해 가는 최단 시간을 구하는 문제였다. 문제 2는 출발 지점에 뭘 두고 왔다며(.....) 출발 지점까지 되돌아갔다 다시 도착 지점에 가는 최단 시간을 구하면 됐다. 시간에 따른 눈 폭풍의 위치는 항상 일정해서(내 위치에 따라 변하는 것은 아니어서), 시간대별로 변하는 상황에 따라 내가 어떻게 움직이는 것이 좋은지만을 계산하면 되었다. 19일차에서 썼던 BFS 방식(?)을 다시 한 번 적용했고, 그리 어렵지 않게 풀 수 있었다. defmodule Omicron.Day24 do @dir "data/day24/" def q1(file_name \\ "q.txt") do {map, map_width, map..

Advent of Code 2022 Day 23 in Elixir - Unstable Diffusion 풀이

문제 보기 요즘 시기에 또 나름 맞는 듯한 거리두기 문제. 모여 있는 요정들이 주어진 규칙에 따라서 조금씩 흩어질 때, 일정 단계가 지난 후 얼마나 흩어졌는지(문제 1), 완전히 흩어져서 더 움직이지 않아도 될 때까지 몇 단계가 지나야 하는지(문제 2)를 구하면 됐다. 8방향을 모두 봐야 해서 구현이 조금 길어지긴 했으나, 그리 어려운 문제는 아니었다. defmodule Omicron.Day23 do @dir "data/day23/" def q1(file_name \\ "q.txt", round_count \\ 10) do elves = build_elves_mapset(file_name) policy = [:n, :s, :w, :e] 1..round_count |> Enum.reduce({elves, ..

Advent of Code 2022 Day 22 in Elixir - Monkey Map 풀이

문제 보기 올해 AoC 3대장을 뽑으라고 하면 17일차, 21일차, 그리고 이 날 문제이리라. 아래와 같은 형태의 지도가 주어지고, 이동할 거리와 방향이 주어졌을 때, 시작 위치에서 출발해 지시대로 이동했을 때의 최종 위치를 구하는 문제였다. #은 가로막힌 곳이라 더 전진할 수 없고, .이 없는 곳으로 나가면 반대쪽 끝으로 다시 들어오는("wrap around") 구조. ...# .#.. #... .... ...#.......# ........#... ..#....#.... ..........#. ...#.... .....#.. .#...... ......#.21일차와 마찬가지로 문제 1은 그냥 그대로 하면 되어서 어렵지 않았는데, 문제 2가 아주 끔찍한 녀석이었다. 주어진 지도가 실제로는 정육면체였던 ..

Advent of Code 2022 Day 21 in Elixir - Monkey Math 풀이

문제 보기 AoC2022 또 하나의 난관. 여러 변수가 있고, 각 변수에 값(자연수)이나 다른 변수 사이의 관계식(이 경우 항상 두 항의 사칙연산)이 주어질 때, 관계식을 풀어 원하는 값을 계산하는 문제였다. 문제 1은 그대로 주어진 관계식을 풀어 최상위의 root 값을 구하는 문제였다. 문제 2는 조건을 조금 바꾸어, root를 이루는 관계식의 두 항이 사칙연산 관계가 아니라 같은 값이어야 할 때, humn(=human=나...)가 어떤 값을 가져야 하는지를 묻는 문제였다. 다시 말해 root를 이루는 관계식의 두 항 중 humn이 포함되지 않은 한 쪽은 지금까지처럼 값을 구할 수 있으니, 다른 한 항의 최상위 값을 알고 있을 때 거꾸로 연산 트리의 하위로 내려가 humn을 구해야 했다. 문제 1은 주..

Advent of Code 2022 Day 20 in Elixir - Grove Positioning System 풀이

문제 보기 요정들의 암호를 복호화 어쩌고 하는 명목으로 숫자 위치 옮기기 퍼즐을 푸는 문제였다. 각 숫자를 숫자 크기만큼 위치를 바꾸되(1인 경우 오른쪽으로 한 칸, -2인 경우 왼쪽으로 두 칸), 옮기는 숫자는 원래 주어진 숫자의 순서대로(중요)여야 했다. 즉 3번째 차례에서 옮겨야 하는 숫자가 반드시 3번째 자리에 있지는 않다는 뜻이므로, 숫자를 섞으면서도 원래 이 숫자가 어디에 있었는지를 기억해야 했다. 그나마 다행인 것은 숫자 목록의 끝과 끝이 이어져 있어 순서만 맞다면 무엇이 첫 숫자로 오든 큰 상관이 없었다는 점 정도. 1번과 2번 문제의 푸는 방법이 약간 다른데, 1번은 위치 바꾸기를 숫자 목록의 각 숫자에 대해 한 번씩만 하면 되어 이진 플래그를 썼고, 2번은 열 바퀴 돌려야 했기 때문에 ..

Advent of Code 2022 Day 19 in Elixir - Not Enough Minerals 풀이

문제 보기 초기 자원이 주어지고, 그 자원을 소비하여 다른 자원을 캘 수 있는 채굴 로봇을 생산할 수 있다고 할 때, 자원을 어떻게 모으고 어떤 로봇을 언제 어떤 순서로 생산해야 주어진 시간 내에 최종 단계 자원을 더 많이 모을 수 있는지를 알아내는 문제였다. 문제 1은 각 로봇 청사진(같은 종류의 채굴 로봇이어도 청사진에 따라 드는 자원이 다르다)마다 주어진 시간 안에 생산할 수 있는 최종 단계 자원의 최대량을 찾는 문제였고, 문제 2는 주어진 로봇 청사진 중 앞 3개에 대해 더 깊은 연산을 요구하는 문제였다. 클리커 게임이나 경영 게임이나... 주로 하는 시뮬레이션류 게임에서 무엇을 어떤 순서로 키울지를 고민하는 것과 비슷해서 개인적으로는 재밌는 소재의 문제였다. 처음에는 알고리즘적으로... 이 자원..

Advent of Code 2022 Day 18 in Elixir - Boiling Boulders 풀이

문제 보기 어려운 문제가 이어지던 도중에 잠깐 쉬어가는 날이었다. 주어진 좌표에 각각 1x1x1의 정육면체 모양의 용암이 있을 때 전체 표면적(문제 1)과, 용암으로 감싸인 빈 공간(에어 포켓)을 뺀 순수 외부 표면적(문제 2)을 구하는 문제였다. 전체 표면적은 그저 6(단위 정육면체의 표면적)에서 겹치는 면 수만큼 빼면 되니 그리 어렵지 않았고, 에어 포켓을 거꾸로 단위 정육면체의 집합으로 생각하고 표면적을 구하면 순수 외부 표면적도 쉽게 구할 수 있었다. 문제를 풀기에 바빠서 입출력과 로직을 분리할 생각은 안 하고 그냥 q2 함수에서 임시 파일을 만들어 q1 함수를 호출한 것이 옥의 티처럼 보이지만, 지금 수정하기에도 조금 그러니 그대로 올려 둔다. defmodule Omicron.Day18 do @..

Advent of Code 2022 Day 17 in Elixir - Pyroclastic Flow 풀이

문제 보기 올해 AoC는 중간 넘어서가 확실히 어렵다(끝부분은 오히려 그다지 어렵지 않았다). 그 중에서도 최고 난이도를 자랑하는 17일차 테트리스 문제. 주어진 모양(가로 일자, 십자, 역 ㄱ자, 세로 일자, 2x2 덩어리)의 테트리스 블록이 돌아가며 떨어지고, 주어진 패턴의 바람이 또 돌아가며 분다. 그렇게 해서 주어진 공간에 블럭들을 쌓아갈 때, 2022개의 블록이 떨어진 후의 높이를 구하는 문제였다. 블록의 모양이 일정치 않아 가로세로 크기만으로는 생각하기가 어렵고, 빈 자리를 잘 생각하면서 짜야 했다. 예를 들어 십자의 경우에는 가로세로 크기는 3이되, 네 귀퉁이가 빈 자리임을 항상 생각해야 하는 식. 자연스럽게 인덱스 계산이 중요해져서 이래저래 고생을 했다. 블록의 기준점 같은 것들을 바꿔가면..

Advent of Code 2022 Day 16 in Elixir - Proboscidea Volcanium 풀이

문제 보기 센서가 가리키는 길로 가다 보니 어느새 화산 지하의 동굴에 도착한 일행. 분출이 얼마 남지 않아, 주어진 시간(30분)동안 동굴을 돌아다니며 밸브를 열어 최대한 압력을 줄여야 한단다. 각 밸브가 줄일 수 있는 압력의 양과 지도가 주어졌을 때, 줄일 수 있는 최대 압력은 얼마인지 묻는 문제였다. 2번째 문제는 조금 더 복잡해서, 동료 코끼리에게 4분동안 밸브 여는 방법을 가르쳐준 후 26분 동안 둘이 각자 밸브를 열러 다닐 때 줄일 수 있는 최대 압력을 묻는 문제였다. 아무 생각 없이 접근한 결과 그래프 DFS와 비슷한 꼴로 문제를 풀게 되어 연산 시간이 제법 오래 걸렸던 문제로 기억한다. 덕분에 정답임을 확인하자마자 지쳐서 코드 정리고 뭐고 그냥 에디터를 닫아버렸던(...) 그런 문제. 25일..