programmers_가장 큰 정사각형 찾기_java
2023. 5. 10. 18:22ㆍAlgorithm/Programmers
728x90
https://school.programmers.co.kr/learn/courses/30/lessons/12905
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
- 완전탐색 : 효율성 시간초과
import java.util.*;
class Solution
{
private static int[][] delta = {{0,1}, {1, 0}, {1,1}}; // 우, 하, 우하
public int solution(int [][]board){
int answer = 0;
int width = board[0].length;
int hieght = board.length;
for (int i = 0; i< hieght; i++){
for (int j = 0; j<width; j++){
if(board[i][j] == 1){ // 1인 좌표에서 사각형 탐지
answer = Math.max(findSquare(width, hieght, board, i, j), answer);
}
}
}
return answer * answer;
}
public int findSquare(int width, int height, int[][] board, int y, int x){
Queue<Point> queue = new LinkedList<>();
queue.offer(new Point(y, x));
boolean[][] visited = new boolean[height][width];
int level = 1;
while (!queue.isEmpty()){
int size = queue.size();
for (int i = 0; i<size; i++){
Point nowPoint = queue.poll();
if (visited[nowPoint.y][nowPoint.x]) continue;
visited[nowPoint.y][nowPoint.x] = true;
for (int j = 0; j<3; j++){
int nexty = nowPoint.y + delta[j][0];
int nextx = nowPoint.x + delta[j][1];
if (0<=nexty && nexty<height && 0<=nexty && nextx <width && board[nexty][nextx] == 1){
queue.offer(new Point(nexty, nextx));
}else{
return level;
}
}
}
level++;
}
return level;
}
public class Point{
int y, x;
public Point(int y, int x){
this.y = y;
this.x = x;
}
}
}
- dp
import java.util.*;
class Solution
{
private static int[][] delta = {{0,-1}, {-1, 0}, {-1,-1}}; // 좌, 상, 좌상
public static int solution(int [][]board){
int answer = 0;
int width = board[0].length;
int height = board.length;
int[][] dp = new int[height][width];
for (int i = 0; i< height; i++){
for (int j = 0; j<width; j++){
if(board[i][j] == 1){
dp[i][j] = isSquare(width, height, dp, i, j) + 1;
answer = Math.max(answer, dp[i][j]);
}
}
}
// // dp 배열 확인용
// for (int i = 0; i< height; i++){
// for (int j = 0; j<width; j++){
// System.out.print(dp[i][j] + " ");
// }
// System.out.println();
// }
return answer * answer;
}
public static int isSquare(int width, int height, int[][] dp, int y, int x){
int res = Integer.MAX_VALUE;
boolean suc = true;
for(int i = 0; i<3; i++){ // 상, 좌, 좌상 확인
int nexty = y + delta[i][0];
int nextx = x + delta[i][1];
if(0 <= nexty && nexty < height && 0<= nextx && nextx < width && dp[nexty][nextx] != 0){
res = Math.min(res, dp[nexty][nextx]);
}else{ // 정사각형 못만드는 경우
suc = false;
break;
}
}
if(!suc) res = 0;
return res;
}
}
'Algorithm > Programmers' 카테고리의 다른 글
programmers_점 찍기_java (0) | 2023.05.11 |
---|---|
programmers_거리두기 확인하기_java (0) | 2023.05.11 |
programmers_배달_java (0) | 2023.05.10 |
programmers_줄 서는 방법_java (0) | 2023.05.10 |
programmers_전력망을 둘로 나누기_java (0) | 2023.05.09 |