# 문제
각 요소는 그 지역이 높이이다. 요소의 상하좌우의 값이 해당 요소보다 작다면 해당 요소는 봉우리 지역이다. 봉우리 지역에 해당하는 요소의 갯수는 몇 개인지 알아내는 프로그램을 작성하시오.
# 입력값
let arr = [
[5, 3, 7, 2, 3],
[3, 7, 1, 6, 1],
[7, 2, 5, 3, 4],
[4, 3, 6, 4, 1],
[8, 7, 3, 5, 2],
];
# 풀이
function solution(arr) {
let answer = 0;
let length = arr.length;
// 상하좌우 순
let dx = [0, 0, -1, 1];
let dy = [-1, 1, 0, 0]; // --(2)
for (let i = 0; i < length; i++) {
for (let j = 0; j < length; j++) { // --(1)
let flag = 1; // --(5)
for (let k = 0; k < 4; k++) { // --(2)
let nx = i + dx[k];
let ny = j + dy[k]; // --(3)
if (
nx >= 0 &&
nx < length &&
ny >= 0 &&
ny < length &&
arr[i][j] <= arr[nx][ny] // --(4)
) {
flag = 0; // --(6)
break;
}
}
if (flag) answer++; // --(7)
}
}
return answer;
}
let arr = [
[5, 3, 7, 2, 3],
[3, 7, 1, 6, 1],
[7, 2, 5, 3, 4],
[4, 3, 6, 4, 1],
[8, 7, 3, 5, 2],
];
## 1. 이중 for문을 돌려서 arr[i][j] 로 전체 요소를 좌표처럼 탐색할 수 있다.
## 2. dx, dy를 선언하고 상하좌우로 움직일 수 있도록 배열로 선언해준다.
(i는 x축, j를 y축으로 했을 때 dx, dy로 상하좌우의 값을 반환받을 수 있도록)
## 3. 또 다시 for문을 돌려서 dx, dy의 길이만큼 돌리고, i + dx[k]와 j + dy[k]로 상하좌우의 값들을 정의해준다.
## 4. 먼저는 맨 밑에 비교문을 써줬는데, 현재 좌표와 4방향으로 움직였을 때 좌표의 값을 비교해서 현재 좌표의 값이 작거나 같으면 봉우리가 아니라는 답을 얻을 수 있다. 또한, 배열의 인덱스는 0보다 작아질 수 없고, 배열의 길이보다 커질 수 없기 때문에 && 연산자를 통해 범위를 설정해줄 수 있다.
## 5. k의 값을 가진 for문이 돌기 전에 flag를 선언해줬는데, 1은 true, 0은 false라는 것을 이용해주기 위해 1로 선언한다.
## 6. 4번과 같이 봉우리가 아니라는 답을 얻을 경우에는 flag를 0으로 재선언하고 break문으로 if문을 멈춰준다.
## 7. 다시 k의 값을 가진 for문이 끝나고 나서 flag의 값을 확인해서 true라면 answer에 1을 더해주고, false라면 다시 i와 j의 for문이 돌게끔 작성해준다. (flag의 값이 true라면 봉우리라는 뜻이기 때문)
# 풀이 간 Learning Point
## 1. if문 작성 시 여러 문장을 실행시킬 것이라면 중괄호를 써줘야 제대로 적용이 된다. 가독성을 위해서라도 중괄호는 실행문이 한 줄이라도 작성해주는 것이 좋음.
## 2. 4방향 탐색에서는 dx, dy처럼 4방향에 대한 값을 받을 수 있는 배열을 추가로 선언해서 움직여준다는 것.
'Algorithm' 카테고리의 다른 글
제일 작은 수 제거하기(배열의 재정렬을 경계해야 하는 이유) (0) | 2023.02.11 |
---|