https://school.programmers.co.kr/learn/courses/30/lessons/120866?language=java
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
처음에는 DFS나 BFS를 활용하는 문제인줄 알았는데 알고보니 그냥 반복문과 조건문만 활용하면 되는 간단한 문제였다. 조금 생각해야할 부분이라면 계속해서 지뢰가 늘어나는 부분을 어떻게 제외할 거냐인데 나는 boolean형 배열을 사용했다.
1. 변수 설정 및 초기화를 해준다.
1-1. 이 때 board 배열에 0과 1인 부분을 나누어서 설정한다. (지뢰가 있어 나중에 makeone 함수에 넣을 인덱스 값만 뺴고 전부 true로 바꿔준다.)
1-2. 상하좌우뿐만아니라 대각선 방향도 체크해야하기 떄문에 dir의 크기를 8로 설정해서 값을 넣어준다.
2. 최대값까지의 배열 인덱스를 돌며 지뢰가 있는 부분을 체크한 후, makeone 메소드에 넣어 지뢰로 바꿔준다.
2-1. 1-1에서 true로 남은 인덱스 값과 현재 1인 값을 대상으로만 조건을 제한한다.
2-2. 만약 현재 1인 값으로만 대상을 제한하면 board의 값이 계속해서 업데이트 될때마다 무조건적으로 들어가게 되기 떄문이다.
3. 모든 board 배열값을 대상으로 체크해서 값을 업데이트 해준 후, 남아있는 0의 갯수를 세서 리턴한다.
문제 및 입출력
코드
class Solution
{
static int[][] dir = new int[][]{{1,0},{-1,0},{0,1},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}};
public static void makeone(int[][] board, int maxx, int maxy, int x, int y)
{
for(int k=0; k<dir.length; k++)
{
x += dir[k][0];
y += dir[k][1];
if(x>=0 && x<maxx && y>=0 && y<maxy)
{
board[x][y] = 1;
}
x -= dir[k][0];
y -= dir[k][1];
}
}
public int solution(int[][] board)
{
int answer = 0;
int maxx = board.length;
int maxy = board[0].length;
boolean[][] visit = new boolean[board.length][board[0].length];
for(int i=0; i<maxx; i++)
{
for(int j=0; j<maxy; j++)
{
if(board[i][j]==0)
{
visit[i][j] = true;
}
}
}
for(int i=0; i<maxx; i++)
{
int x = i;
for(int j=0; j<maxy; j++)
{
int y = j;
if(!visit[i][j] && board[x][y]==1)
{
visit[i][j] = true;
makeone(board, maxx, maxy, x, y);
}
}
}
for(int i=0; i<maxx; i++)
{
for(int j=0; j<maxy; j++)
{
if(board[i][j]==0)
{
answer++;
}
}
}
return answer;
}
}
'[ 다먹살 ] > - Coding' 카테고리의 다른 글
[프로그래머스] 레벨0 다항식 더하기 (0) | 2022.10.24 |
---|---|
[프로그래머스] 레벨0 OX퀴즈 (0) | 2022.10.24 |
[프로그래머스] 레벨0 분수의 덧셈 (0) | 2022.10.20 |
[프로그래머스] 레벨2 피로도 (0) | 2022.10.19 |
[프로그래머스] 레벨2 할인 행사 (0) | 2022.10.18 |
댓글