전체 글 226

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일..

Advent of Code 2022 Day 15 in Elixir - Beacon Exclusion Zone 풀이

문제 보기 여러 센서가 각각 자신에게 가장 가까이 있는 신호기(beacon)의 위치를 반환할 때, 센서의 탐색 결과에 없는 다른 신호기의 위치를 찾는 문제였다. 큰 한 문제를 작은 문제들로 나누어 푸는 방식이었는데, 첫 번째 문제는 우선 특정 y좌표에서 다른 신호기가 존재할 수 없는 좌표(=센서의 탐색 범위에 포함되는 좌표)를 세는 문제였고, 두 번째 문제는 그 결과를 전체 평면으로 넓혔을 때 단 한 곳의 빈 칸을 찾는 문제였다. 이야기상으로는 한 문제를 둘로 나눠 푸는 것 같지만 실제로는 전혀 다르다. 첫 번째 문제는 값이 크긴 했지만 1차원 연산이어서 조금 얼렁뚱땅 풀어도 어떻게든 되는데, 두 번째 문제는 x=0..4_000_000, y=0..4_000_000 사이의 평면 전체를 탐색해야 하는 탓에,..

Advent of Code 2022 Day 14 in Elixir - Regolith Reservoir 풀이

문제 보기 동굴의 단면이 있을 때, 바위의 위치가 선분의 형태로 주어진 상황. 특정 좌표에서 모래가 쏟아지기 시작할 때, 모래가 더 쌓이지 않으려면 얼마나 모래가 쏟아져야 하는지(문제 1), 더 나아가 주어진 동굴을 모두 채우고 모래가 쏟아지는 지점을 모래가 막으려면 얼마나 쏟아져야 하는지(문제 2)를 구하는 문제였다. 대부분의 로직은 pouring_sand 함수에 집중되어 있다. 쏟아지고 있는 모래가 어디에 위치해야 하는지 계산하고, 적당한 위치에 온 경우 지도를 갱신하고, 다음 모래를 붓는다. 더 쌓이지 못할 상황이면 끝내고 반환한다. 끝이다. 아무래도 재귀에 맛이 들렸나 보다. 하지만 이렇게 간단한걸. 아, 여담이지만 Enum.map() |> Enum.into(%{}) 대신에 Map.new()를 사..

Advent of Code 2022 Day 13 in Elixir - Distress Signal 풀이

문제 보기 중첩 리스트로 주어진 패킷을 비교하는 문제였다. 첫 번째 문제는 패킷 쌍이 올바른 순서로 되어 있는지 확인하는 문제, 두 번째 문제는 전체 패킷을 올바른 순서로 정렬하는 문제였다. 재귀 문제다. 아무리 재귀를 피하려고 해도 이런 문제는 재귀를 쓸 수밖에 없다(변명). 첫 번째 문제에서 아무 생각 없이 compare 함수를 만들어 썼는데, 두 번째 문제를 보니 그냥 조금 전에 작성한 compare 함수를 그대로 정렬 함수에 넣어주면 끝이라 생각보다 문제를 너무 쉽게 풀었다. defmodule Omicron.Day13 do @dir "data/day13/" def q1(file_name \\ "q.txt") do File.read!(@dir file_name) |> String.split("\n\..

Advent of Code 2022 Day 12 in Elixir - Hill Climbing Algorithm 풀이

문제 보기 문제 자체는 일찍 풀었지만(크리스마스 당일에 완주) 이래저래 글을 쓸 에너지가 부족하여 해를 넘겨서야 풀이를 써 본다. 각 지점의 높이가 a(가장 낮은 곳)부터 z(가장 높은 곳)까지 주어진 평면 지도가 주어진다. 한 번에 동서남북으로 한 칸씩, 최대 한 단계씩만 올라갈 수 있다고 했을 때, 시작 지점(a 중 한 곳)부터 도착 지점(z 중 지정된 한 곳)까지 이동하는 최단 거리를 구하는 문제였다. 첫 번째 문제는 시작 지점이 a 중 특정 한 곳으로 주어지며, 두 번째 문제는 a 중 아무 곳에서나 출발했을 때를 계산하면 됐다. 그래프 탐색 방식으로 풀 수도 있지만... 구하는 것이 경로 그 자체가 아니라 최단 경로의 '길이'라, DP식 계산법을 적용해 보았다. 출발 지점부터 시작해..

Advent of Code 2022 Day 11 in Elixir - Monkey in the Middle 풀이

문제 보기 배낭에 있던 물건을 원숭이들에게 빼앗겼는데, 그 물건들을 가지고 원숭이들이 주고받기 놀이를 하고 있었단다. 그걸 지켜보고 있으니 원숭이들은 각 물건들에 대해 내가 '걱정하는 수준'에 따라 어떤 원숭이에게 물건을 던질지를 결정하고 있었다고 한다. 원숭이들의 판단 기준과 각 물건들의 걱정 수준이 주어졌을 때, 가장 많이 물건을 받은 원숭이 두 마리를 찾는 문제였다. 두 문제 모두 기준이 살짝 다를 뿐 대동소이했다. 첫 번째 문제의 경우 매 물건을 받을 때마다 걱정 수준이 3분의 1로 줄어들고, 두 번째 문제는 그렇지 않아 좀 더 큰 수 연산에 대응해야 한다는 정도. 엘릭서에서는 숫자 자료형의 크기 제한이 없으니, 퍼포먼스가 지나치게 떨어지지만 않으면 기본적으로 큰 문제는 없다. 계산..

Advent of Code 2022 Day 10 in Elixir - Cathode-Ray Tube 풀이

문제 보기 드디어 10일차!...에 등장한 AoC 단골 문제, 신호 또는 명령어 리스트를 받아 주어진 규칙에 따라 해석하여 결과를 출력하는 시스템을 구현하는 문제였다. 2019년에 같은 장치를 여러 날에 걸쳐 계속 발전시키는 문제가 나와서(5일차, 7일차, 9일차, ...) 스파게티 괴물을 만들다 못해 포기해버린 역사가 있어(...) 괜히 확장을 고민하게 되어 부담스러운 장르다. CPU 사이클이 있고 명령어가 있는데, 한 명령어가 여러 CPU 사이클을 사용하는 경우도 있고, 사이클 중간과 후를 구분해야 하기도 해서(사이클 중간-연산이 완료되기 전-에 가져온 값은 이전 값) 무엇을 기준으로 계산하는 것이 좋을지 조금 망설이게 되었던 문제였다. 이번에는 우선 명령어 기준으로 구현했다. defmodule Om..

Advent of Code 2022 Day 9 in Elixir - Rope Bridge 풀이

문제 보기 정해진 길이의 로프의 앞 부분을 움직였을 때 끝 부분의 자취를 구하는 문제였다(첫 번째 문제는 짧은 줄, 두 번째 문제는 긴 줄). 플랑크 길이나 온갖 어려운 단어들이 나와서 이게 뭔 소린가 하며 읽었는데, 그런 부분까지 합해서 이번 AoC의 특색 있는 문제 중 하나로 꼽힐 것 같다. 코드 전체적인 구조를 잡는 데 조금 시간이 걸렸다. 로프 끝 부분은 시작 부분과 멀어져야 하는 상황에서만 움직이면 되는 것을 알고, 일단 로프 시작 부분을 움직인 뒤 머리 부분의 방향과 인접 여부를 따져 필요한 경우에만 끝 부분을 움직이도록 구현했다. case문이 좀 많긴 하지만 그래도 제법 깔끔하게 각 경우를 정리하지 않았나 싶다. defmodule Omicron.Day9 do @dir "data/day9/" ..

Advent of Code 2022 Day 8 in Elixir - Treetop Tree House 풀이

문제 보기 높이가 서로 다른 나무들이 모인 숲이 있을 때, 높이가 높은 다른 나무들에 가려져 숲 밖에서 볼 수 없는 위치를 찾아 집을 지으려고 한단다. 숲에 있는 나무들의 높이가 주어졌을 때 조건에 맞는 위치가 몇 곳인지 찾는 것이 첫 번째 문제, 그 중에서도 가장 전망이 좋은(밖의 나무들을 가장 많이 볼 수 있는) 위치를 찾는 것이 두 번째 문제였다. 처음에는 한 행, 한 열에서 가장 작은 값을 찾으면 되겠구나! 했는데 그것이 그렇지도 않아서, 그냥 다 내려놓고 모든 경우의 수를 다 찾는 코드를 짰다. 실행 시간이 생각보다 좀 걸리지만 아무튼 결과는 나온다. defmodule Omicron.Day8 do @dir "data/day8/" def q1(file_name \\ "q.txt") do row_s..