📌강의 정리
봉우리가 되려면 12,3,6,9시가 다 나보다 낮아야 한다.
여기서 중요한점은 격자의 가장자리는 0으로 나보다 작다고 생각해야한다.
구석에 있다면 바깥쪽은 볼필요가 없다.
4방향 탐색에서 if문을 남발하지말자
1행 2열 인 '1'이 있다.
dx와 dy의 배열을 새로 만들어야 한다.
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
을 하면 이 배열을 더해주고 빼면서 봉우리를 찾는 코드를 짤 수 있다.
이중 포문을 만들고 거기다 k로 k<4의 포문을 하나더 안에 만든다.
이제 제일 안에
let nx = i+dx[k]
let ny = j+dy[k]
를 하면 방향을 정할 수 있다.
또한 이 코드가 작동하기 전에 flag변수를 1로 해주고
나보다 같거나 큰애가 있다면 바로 플래그를 0으로 바꾸고 break를 걸어주면된다.
또한 조건에서 인덱스 -1로 되는 부분을 탐색하면 안되므로
nx≥0 && nx<n && ny≥0 && ny<n && 을 앞에 넣어줘야 한다.
이제 앞으로 dx,dy를 써서 상하좌우 탐색하고 flag변수를 쓰는 것을 종종 할것이다.
📌느낀점
나는 정말 극한의 하드코딩을 했는데 그래서인지 더더욱
지금까지 했던 문제들중 제일 어렵고 제일 신기하며 크게 다가왔다.
알고리즘이란 이런거구나를 깨달았고 여기서 쓰인 그 어떤 코드도 내가 모르는 코드가 없었다..
알고리즘이 점점 재밌어지는것 같다.
dx,dy와 조건들을 잘 거는 것 그리고 삼중포문 k, flag변수들을 잘 기억해둬야겠다.
// 22.06.04 추가
// 나의 코드
<html>
<head>
<meta charset="UTF-8" />
<title>출력결과</title>
</head>
<body>
<script>
function solution(arr) {
let answer = 0;
const getVisited = (row, col) =>
Array.from(Array(row), () => Array(col).fill(0));
let arr2 = getVisited(arr.length + 2, arr.length + 2);
for (let i = 0; i < arr.length; i++) {
for (let j = 0; j < arr.length; j++) {
arr2[i + 1][j + 1] = arr[i][j];
}
}
for (let k = 1; k < arr2.length - 1; k++) {
for (let l = 1; l < arr2.length - 1; l++) {
if (
arr2[k][l] > arr2[k - 1][l] &&
arr2[k][l] > arr2[k + 1][l] &&
arr2[k][l] > arr2[k][l - 1] &&
arr2[k][l] > arr2[k][l + 1]
)
answer++;
}
}
console.log(arr2);
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],
];
console.log(solution(arr));
</script>
</body>
</html>
//나의 코드
<html>
<head>
<meta charset="UTF-8">
<title>출력결과</title>
</head>
<body>
<script>
function solution(arr){
let answer=0;
let n = arr.length;
for(let i=0; i<n; i++){
for(let j=0; j<n; j++){
if(i===0){
if(j===0){
if(Math.max(arr[i][j],
arr[i+1][j]) === arr[i][j]){
answer++;
console.log(i,j)
}
continue;
}
else if(j===n-1){
if(Math.max(arr[i][j], arr[i][j-1],
arr[i+1][j]) === arr[i][j]){
answer++;
console.log(i,j)
}
continue;
}
}
if(i===n-1){
if(j===0){
if(Math.max(arr[i][j], arr[i][j+1],
arr[i-1][j]) === arr[i][j]){
answer++;
console.log(i,j)
}
continue;
}
else if(j===n-1){
if(Math.max(arr[i][j], arr[i][j-1],
arr[i-1][j]) === arr[i][j]){
answer++;
console.log(i,j)
}
continue;
}
}
if(i===0){
if(Math.max(arr[i][j], arr[i][j+1],
arr[i][j-1], arr[i+1][j]) === arr[i][j]){
answer++;
console.log(i,j)
}
continue;
}
if(i===n-1){
if(Math.max(arr[i][j], arr[i][j-1],
arr[i-1][j], arr[i][j+1]) === arr[i][j]){
answer++;
console.log(i,j)
}
continue;
}
if(j===0){
if(Math.max(arr[i][j], arr[i][j+1],
arr[i-1][j], arr[i+1][j]) === arr[i][j]){
answer++;
console.log(i,j)
}
continue;
}
if(j===n-1){
if(Math.max(arr[i][j], arr[i][j-1],
arr[i-1][j], arr[i+1][j]) === arr[i][j]){
answer++;
console.log(i,j)
}
continue;
}
if(Math.max(arr[i][j], arr[i][j-1], arr[i][j+1],
arr[i-1][j], arr[i+1][j]) === arr[i][j]){
answer++;
console.log(i,j)
}
continue;
}
}
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]];
console.log(solution(arr));
</script>
</body>
</html>
//강사님 코드
<html>
<head>
<meta charset="UTF-8">
<title>출력결과</title>
</head>
<body>
<script>
function solution(arr){
let answer=0;
let n=arr.length;
let dx=[-1, 0, 1, 0];
let dy=[0, 1, 0, -1];
for(let i=0; i<n; i++){
for(let j=0; j<n; j++){
let flag=1;
for(let k=0; k<4; k++){
let nx=i+dx[k];
let ny=j+dy[k];
if(nx>=0 && nx<n && ny>=0 && ny<n && arr[nx][ny]>=arr[i][j]){
flag=0;
break;
}
}
if(flag) answer++;
}
}
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]];
console.log(solution(arr));
</script>
</body>
</html>
'JS 알고리즘 문제풀이 > 섹션 2. 1, 2차원 배열 탐색' 카테고리의 다른 글
6.격자판 최대합 (0) | 2022.01.13 |
---|---|
5.등수구하기 (0) | 2022.01.12 |
4.점수계산 (0) | 2022.01.12 |
3.가위바위보 (0) | 2022.01.12 |
2.보이는 학생 (0) | 2022.01.12 |