📑 문제

✏️ 풀이
재영
저는 그냥 일감에 따라 무식하게 완전 탐색으로 풀었습니다!
- 결국 N = 100이니까, 충분히 O(n^3)이어도 그냥 풀릴 것 같다는 느낌이 들었습니다.
- 따라서 x와 y를 쭉 탐색하면서
true
인 것들을 배열에 담는getIslandXY
함수를 실행하여 리턴값을isLandXY
에 할당합니다.
- 이때 주의할 것은, 자바스크립트에서 2차원 내에서 배열 값을 찾는 방법이 없거나 잘 몰라서,
x,y
를 하나의 문자로stringfy
하였습니다.
forEach
로 배열을 돌 때마다cnt
라는 변수에 4를 할당합니다. 이후,getResult
에서는 이를 다시 숫자로 변환하면서, 만약 해당 값이 만약 들어 있다면 붙어있다는 뜻입니다. 결국perimeter
이 1만큼 줄어드는 꼴이기 때문에cnt
를 1 뺍니다.
result
에cnt
를 더합니다. 이를 반복 후result
를 반환합니다.
/** * @param {number[][]} grid * @return {number} */ const islandPerimeter = grid => { const isLandXY = getIsLandXY(grid); return getResult(isLandXY); } const getResult = (arr) => { let result = 0; arr.forEach(xy => { const [x, y] = xy.split(','); const nxny = [[1, 0], [-1, 0], [0, 1], [0, -1]]; let cnt = 4; for (let i = 0; i < 4; i += 1) { const [ nx, ny ] = nxny[i]; cnt -= arr.includes(`${x * 1 + nx * 1},${y * 1 + ny * 1}`) ? 1 : 0 } result += cnt; }) return result; } const getIsLandXY = (grid) => { let arr = []; for (let i = 0; i < grid.length; i++) { for (let j = 0; j < grid[0].length; j++) { const now = grid[i][j] arr = [...arr, ...(now ? [`${i},${j}`] : [])]; } } return arr; } const grid = [[0,1]]; console.log(islandPerimeter(grid));
효성
var islandPerimeter = function(grid) { let answer = 0 const row = grid.length const col = grid[0].length const diffR = [0, 0, 1, -1] const diffC = [1, -1, 0, 0] for(let r=0; r<row; r++) { for(let c=0; c<col; c++) { if(grid[r][c] !==1) { continue } for(let i=0; i<4; i++) { const nextR = r + diffR[i] const nextC = c + diffC[i] if(nextR < 0 || nextR >= row || nextC < 0 || nextC >= col) { answer++ continue } if(grid[nextR][nextC] === 0) { answer++ } } } } return answer };
- row와 col의 길이 및 정답 count를 정의한다.
- row와 col의 차이에 대한 배열을 정의한다.
- grid를 순회하며 1일때
- 위아래양옆이 범위를 초과할 때 또는 0일 때 answer의 count를 + 1한다.
row와 col의 차이에 대한 배열을 정의하는 점 기억하기!
은찬
/** * @param {number[][]} grid * @return {number} */ const islandPerimeter = (grid) => { const directX = [-1, 1, 0, 0]; const directY = [0, 0, -1, 1]; const row = grid.length; const col = grid[0].length; const visited = Array.from({length: row}, () => Array(col).fill(false)); let sum = 0; const checkRange = (x, y) => x >= 0 && x < row && y >= 0 && y < col ? true : false; const dfs = (x, y) => { for(let i = 0; i < 4; i++){ const nx = x + directX[i]; const ny = y + directY[i]; if(checkRange(nx, ny)){ if(grid[nx][ny] && !visited[nx][ny]){ visited[nx][ny] = true; dfs(nx, ny); } else if(!grid[nx][ny]){ sum++; } } else{ sum++; } } } for(let i = 0; i < row; i++){ for(let j = 0; j < col; j++){ if(grid[i][j] && !visited[i][j]){ visited[i][j] = true; dfs(i, j); } } } return sum; };
현석
var islandPerimeter = function(grid) { const width = grid.length const length = grid[0].length const isVisited = Array.from({length: width}, () => new Array(length).fill(false)) const stack = []; let ans = 0; loop: for(let i = 0; i < width; i++) { for(let j = 0; j < length; j++) { if(grid[i][j] === 0) continue; stack.push([i, j]) break loop; } } while(stack.length) { const [rowIdx, colIdx] = stack.pop(); if(isVisited[rowIdx][colIdx]) continue; isVisited[rowIdx][colIdx] = true; if (rowIdx > 0 && grid[rowIdx-1][colIdx]) { stack.push([rowIdx - 1, colIdx]) } else { ans += 1; } if (rowIdx < width - 1 && grid[rowIdx+1][colIdx]) { stack.push([rowIdx + 1, colIdx]) } else { ans += 1; } if (colIdx > 0 && grid[rowIdx][colIdx-1]) { stack.push([rowIdx , colIdx-1]) } else { ans += 1; } if (colIdx < length - 1 && grid[rowIdx][colIdx+1]) { stack.push([rowIdx, colIdx + 1]) } else { ans += 1; } } return ans };
희진
/** * @param {number[][]} grid * @return {number} */ var islandPerimeter = function(grid) { const findNode=[] for(let i=0;i<grid.length;i++){ for(let j=0;j<grid[0].length;j++){ if(grid[i][j] === 1){ findNode.push([i,j]); } } } let count = 0 let length = findNode.length for(let i=0;i<length;i++){ for(let j=i+1;j<length;j++){ let distance = Math.abs(findNode[i][0]-findNode[j][0])+ Math.abs(findNode[i][1]-findNode[j][1]) if(distance===1){ count++ } } } const tot = length * 4; return tot - 2*count //1060 ms };