문제 설명
코딩테스트를 준비하는 머쓱이는 프로그래머스에서 문제를 풀고 나중에 다시 코드를 보면서 공부하려고 작성한 코드를 컴퓨터 바탕화면에 아무 위치에나 저장해 둡니다. 저장한 코드가 많아지면서 머쓱이는 본인의 컴퓨터 바탕화면이 너무 지저분하다고 생각했습니다. 프로그래머스에서 작성했던 코드는 그 문제에 가서 다시 볼 수 있기 때문에 저장해 둔 파일들을 전부 삭제하기로 했습니다.
컴퓨터 바탕화면은 각 칸이 정사각형인 격자판입니다. 이때 컴퓨터 바탕화면의 상태를 나타낸 문자열 배열 wallpaper가 주어집니다. 파일들은 바탕화면의 격자칸에 위치하고 바탕화면의 격자점들은 바탕화면의 가장 왼쪽 위를 (0, 0)으로 시작해 (세로 좌표, 가로 좌표)로 표현합니다. 빈칸은 ".", 파일이 있는 칸은 "#"의 값을 가집니다. 드래그를 하면 파일들을 선택할 수 있고, 선택된 파일들을 삭제할 수 있습니다. 머쓱이는 최소한의 이동거리를 갖는 한 번의 드래그로 모든 파일을 선택해서 한 번에 지우려고 하며 드래그로 파일들을 선택하는 방법은 다음과 같습니다.
- 드래그는 바탕화면의 격자점 S(lux, luy)를 마우스 왼쪽 버튼으로 클릭한 상태로 격자점 E(rdx, rdy)로 이동한 뒤 마우스 왼쪽 버튼을 떼는 행동입니다. 이때, "점 S에서 점 E로 드래그 한다."고 표현하고 점 S와 점 E를 각각 드래그의 시작점, 끝점아라고 표현합니다.
- 점 S(lux, luy)에서 점 E(rdx, rdy)로 드래그를 할 때, "드래그 한 거리"는 |rdx - lux| + |rdy - luy|로 정의합니다.
- 점 S에서 점 E로 드래그를 하면 바탕화면에서 두 격자점을 각각 왼쪽 위, 오른쪽 아래로 하는 직사각형 내부에 있는 모든 파일이 선택됩니다.
📌 나의풀이
function solution(arr) {
let answer = [];
let lux = Number.MAX_VALUE;
let luy = Number.MAX_VALUE;
let rdx = Number.MIN_VALUE;
let rdy = Number.MIN_VALUE;
for(let i = 0; i < arr.length; i++) {
for(let j = 0; j < arr[i].length; j++) {
if(arr[i][j] === '#') {
lux = Math.min(lux, i);
luy = Math.min(luy, j);
rdx = Math.max(rdx, i);
rdy = Math.max(rdy, j);
}
}
}
return answer = [lux,luy,rdx + 1,rdy + 1]
}
해당 문제는 그림으로 보고 풀면 쉬운 문제였습니다. 결국 배열을 돌며 arr[i][j] 가 "#" 인곳의 인덱스를 알아내면 되는 것이였습니다. 하지만 그대로 최대 최소 인덱스만 반환한다고 하면 [1,3,4,7]이 될 것 입니다.
반면 위의 그림에서는 (1,3)부터 시작하고 (5,8)까지 드래그를 해야 모든 파일을 선택하는 [1,3,5,8]이 정답일 것입니다.
그렇다면 왜 + 1을 해야만 하는걸까 ?
이 코드에서 rdx와 rdy에 1을 더하는 이유는 배열의 인덱스와 실제 좌표 간의 차이 때문입니다. 배열 인덱스는 0부터 시작하므로, 실제 좌표를 구할 때 1을 더해야 올바른 결과를 얻을 수 있습니다.
여기서 rdx와 rdy는 각각 '#' 문자가 나타나는 가장 오른쪽 아래 모서리의 x와 y 좌표를 나타냅니다. 하지만 배열의 인덱스는 0부터 시작하기 때문에 실제 좌표를 계산할 때 1을 더해야 올바른 값을 얻을 수 있습니다.
예를 들어, 만약 rdx가 3이라면, 실제로는 4번째 행에 '#' 문자가 나타난 것이므로 1을 더해서 4로 바꾸어야 올바른 좌표가 됩니다. 같은 이유로 rdy에도 1을 더하는 것입니다.
그러면 왜 lux, luy는 + 1 을 안할까?
실제 좌표를 구할 때 lux와 luy에서는 1을 더하지 않는 이유는 이들이 왼쪽 위 모서리의 좌표를 나타내기 때문입니다.
lux와 luy는 '#' 문자가 나타나는 가장 왼쪽 위 모서리의 x와 y 좌표를 나타냅니다. 배열의 인덱스는 0부터 시작하므로, 이들을 그대로 사용하면 올바른 좌표를 얻을 수 있습니다.
반면, rdx와 rdy는 가장 오른쪽 아래 모서리의 x와 y 좌표를 나타내며, 배열의 인덱스와 실제 좌표 간의 차이 때문에 1을 더해야 합니다.
'JS 알고리즘 문제풀이' 카테고리의 다른 글
1부터 N까지 합 출력하기 (0) | 2023.10.01 |
---|---|
연필 개수 (0) | 2023.10.01 |
삼각형 판별하기 (0) | 2023.09.23 |
세 수 중 최솟값 (0) | 2023.09.23 |