일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- react-query
- html
- 메모리
- 타입스크립트
- #프로젝트캠프 #프로젝트캠프후기 #유데미 #스나이퍼팩토리 #웅진씽크빅 #인사이드아웃 #IT개발캠프 #개발자부트캠프 #리액트 #react #부트캠프 #리액트캠프
- 리액트
- 유데미
- 프로그래머스
- CS
- 스레드
- 스나이퍼팩토리
- 해시
- 프로세스
- 자바스크립트
- Algorithm
- 프로젝트캠프
- 인사이드아웃
- 네트워크
- App Runner
- 웅진씽크빅
- IT개발캠프
- 개발자부트캠프
- react
- cs #네트워크
- javascript
- 알고리즘
- ip
- React.js
- BFS
- typescript
- Today
- Total
Bin's Blog
[프로그래머스] Level2 - 가장 큰 정사각형 찾기(Javascript) 본문
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
▶ 문제 요약
1. 1과 0으로 채워진 표가 있다. 표 1칸은 1 * 1 정사각형으로 이루어져 있다.
2. 표에서 1로 이루어진 가장 큰 정사각형을 찾아 넓이를 리턴해라.
▶ 정답 코드
function solution(board) {
let answer = 0;
let column = board.length;
let row = board[0].length;
// board와 같은 2차원 배열 dp를 생성
let dp = Array.from(Array(column), () => Array(row).fill(0));
// 첫 번째 행의 dp값을 board의 값과 같게 맞춰준다.
for (let i = 0; i < column; i++) {
dp[i][0] = board[i][0];
// 넓이의 최댓값 찾기
answer = Math.max(answer, dp[i][0]);
}
// 첫 번째 열의 dp값을 board의 값과 같게 맞춰준다.
for (let j = 0; j < row; j++) {
dp[0][j] = board[0][j];
answer = Math.max(answer, dp[0][j]);
}
// 두번째 행과 열부터 마지막 행과 열까지 순회하면서
for (let i = 1; i < column; i++) {
for (let j = 1; j < row; j++) {
// 값이 1이라면
if (board[i][j] === 1) {
// (i, j) 위치에서 만들 수 있는 가장 큰 정사각형의 한 변의 길이는
// 왼쪽 위, 위, 왼쪽 중에서 최솟값에서 +1을 더한다.
dp[i][j] = Math.min(dp[i-1][j-1], dp[i-1][j], dp[i][j-1]) +1;
answer = Math.max(answer, dp[i][j]);
}
}
}
// 가장 큰 정사각형의 한 변의 길이를 제곱 == 넓이
return answer * answer;
}
▶ 풀이 과정
1. 각 위치에서 만들 수 있는 정사각형의 최대 크기를 저장해두면, 다른 위치에서의 정사각형의 크기를 계산하는데 재사용할 수 있다. 그래서 dp를 사용했다.
2. 행과 열의 길이를 변수에 담고 나서 board와 똑같은 2차원 배열을 담아서 기본 값은 0으로 설정한다.
3. 첫 번째 행과 첫 번째 열에서 만들 수 있는 정사각형의 크기가 그 자리의 값과 동일하다. 열의 경우에는 위쪽의 값이 존재하지 않고 행의 경우에는 왼쪽, 왼쪽 위의 값이 존재하지 않기 때문이다. 그래서 board와 똑같은 값을 dp에 저장하고 answer에는 dp 배열 중에 가장 큰 값을 저장한다. dp 배열의 값이 정사각형의 한 변의 길이를 나타내므로, dp 배열의 값 중 가장 큰 값이 가장 큰 정사각형의 한 변의 길이가 된다.
4. 두 번째 행과 열부터 마지막 행과 열까지 순회하면서 dp를 계산하고 answer을 갱신한다. board[i][j]가 1이라면 (i, j) 위치에서 만들 수 있는 가장 큰 정사각형의 한 변의 길이는 왼쪽 위, 위, 왼쪽 중에서 가장 작은 값에 1을 더한 값이 된다.
5. 한 변의 길이의 제곱한 것이 넓이다.
'Algorithm' 카테고리의 다른 글
[프로그래머스] Level2 - 거리두기 확인하기(Javascript) (0) | 2023.05.29 |
---|---|
[프로그래머스] Level2 - 점 찍기(Javascript) (0) | 2023.05.26 |
[프로그래머스] Level2 - 배달(Javascript) (0) | 2023.05.24 |
[프로그래머스] Level2 - 줄 서는 방법(Javascript) (0) | 2023.05.23 |
[프로그래머스] Level2 - 전력망을 둘로 나누기(Javascript) (0) | 2023.05.23 |