https://adventofcode.com/2019/day/8
요정들은 당신이 화성에 버려진 탐사선을 다시 구동시킬 수 있다는 것을 깨닫고 기분이 좋아졌습니다. 그래서 그들은 당신이 화성에 잠시 머물 수 있을지 물어봤고, 결국 당신은 화성에 있는 탐사선 근처에 잠시 착륙하기로 했습니다.
탐사선에 다가간 당신은, 탐사선이 이미 재시작 프로세스에 들어가있는 것을 발견했습니다! 탐사선은 BIOS 비밀번호를 입력받기 위해 대기하는 상태입니다. 탐사선을 담당하는 요정이 당신에게 비밀번호가 담긴 사진(퍼즐의 입력)을 네트워크를 통해 전송했습니다.
하지만 불행하게도, 이미지는 평범한 포맷이 아닌 우주에서 사용되는 특수한 포맷으로 인코딩되어 있습니다. 왜 이런 포맷을 쓰는지 알고있는 요정들은 전혀 없었지만, 어찌됐든 요정들은 인코딩된 이미지를 디코드할 수 있는 설명서를 보내주었습니다.
이미지는 각각 단일 픽셀의 색상을 나타내는 일련의 숫자로 전송됩니다. 숫자는 맨 윗줄부터 한줄을 왼쪽에서 오른쪽으로 채우고, 그 아랫줄로 내려가는 방식으로 차례로 이미지를 채워갑니다.
그리고 각 이미지는 동일한 크기의 여러 레이어들로 구성되어 있습니다. 첫 번째 숫자는 첫 번째 레이어의 맨 왼쪽 위 픽셀을, 두 번째 숫자는 같은 레이어의 바로 오른쪽에 있는 픽셀과 같이 반복하여 이미지를 채워가다가, 마지막 숫자는 마지막 레이어의 맨 오른쪽 아래 픽셀을 뜻하게 됩니다.
예를 들어, 가로 3
픽셀, 세로 2
픽셀의 이미지인 경우, 이미지 데이터 123456789012
는 다음과 같이 나타낼 수 있습니다.
Layer 1: 123
456
Layer 2: 789
012
당신이 요정에게 받은 이미지는 가로 25
픽셀, 세로 6
픽셀입니다.
이미지가 전송 과정에서 망가지지 않았는지 확인하기 위해, 요정들은 당신이 받은 이미지의 레이어들 중에서 0
의 수가 가장 적은 레이어를 찾아달라고 부탁합니다. 그 레이어에서 1
의 개수와 2
의 개수를 곱한 값은 얼마인가요?
이제 당신은 이미지를 복호화할 준비가 되었습니다. 이미지는 여러 레이어를 각 레이어의 같은 위치끼리 맞추어 겹침으로써 그릴 수 있습니다. 각 숫자는 각 픽셀의 색을 나타냅니다. (0
은 검정색, 1
은 흰색, 2
는 투명입니다.)
레이어들은 첫번째 레이어가 가장 앞에, 마지막 레이어가 가장 뒤에 위치하도록 그려집니다. 즉, 특정 위치가 주어졌을 때, 첫 번째 레이어와 두 번째 레이어가 투명하고, 세 번째 레이어에 검은색, 네 번째 레이어에 흰색이 칠해져 있다면, 해당 위치에 최종적으로 그려지는 색은 검은색입니다.
예를 들어, 가로 세로 2
픽셀의 이미지가 주어졌을 때, 이미지 데이터가 0222112222120000
로 주어진 경우 레이어는 다음과 같이 구분됩니다.
Layer 1: 02
22
Layer 2: 11
22
Layer 3: 22
12
Layer 4: 00
00
이후, 최종 이미지는 각 위치의 투명이 아닌 픽셀 중 가장 상단에 위치한 픽셀의 색이 됩니다.
- 왼쪽 위 픽셀 : 최상단 레이어의 값이
0
이므로, 검은색으로 칠해집니다. - 오른쪽 위 픽셀 : 최상단 레이어의 값이
2
(투명)이고, 두 번째 레이어의 값이1
이므로 흰색으로 칠해집니다. - 왼쪽 아래 픽셀 : 맨 위 두 레이어의 값이
1
이고, 세 번째 레이어의 값이1
이므로 흰색으로 칠해집니다. - 오른쪽 아래 픽셀 : 맨 아래 레이어를 제외한 모든 레이어가 투명하므로,
0
(검은색)이 칠해집니다.
즉, 최종 이미지는 다음과 같이 그려집니다.
01
10
당신의 이미지를 복호화하면 나오는 메시지는 무엇인가요?