문제 설명
다음 그림과 같이 지뢰가 있는 지역과 지뢰에 인접한 위, 아래, 좌, 우 대각선 칸을 모두 위험지역으로 분류합니다.
지뢰는 2차원 배열 board
에 1로 표시되어 있고 board
에는 지뢰가 매설 된 지역 1과, 지뢰가 없는 지역 0만 존재합니다.
지뢰가 매설된 지역의 지도 board
가 매개변수로 주어질 때, 안전한 지역의 칸 수를 return하도록 solution 함수를 완성해주세요.
class Solution {
public int solution(int[][] board) {
int answer = 0;
int arrowsArr[] = new int[8];
// 0 : 위 4 : 위 왼 대각선
// 1 : 아래 5 : 위 오른 대각선
// 2 : 왼 6 : 아래 왼 대각선
// 3 : 오른 7 : 아래 오른 대각선
for(int i = 0; i < board.length; i++){
for(int j = 0; j < board.length; j++){
int nowR = board[i][j];
if(board.length == 1){
// RUNTIME 오류인 이유를 생각해 보면 내 코드는 1줄짜리 배열이 안돌아감
//왼쪽 / 오른쪽만 신경쓰면 됨
if(board[i].length == 1){
//[0, 0] 과 같이 2차원 배열인데 값이 1개만 있을 경우
// (런타임 에러)
arrowsArr[2] = 0;
arrowsArr[3] = 0;
}else if(j == 0){
//맨 위의 맨 왼쪽 지역
arrowsArr[2] = 0;
arrowsArr[3] = board[i][j+1];
}else if(j == (board.length-1)){
//맨 위의 맨 오른쪽 지역
arrowsArr[2] = board[i][j-1];
arrowsArr[3] = 0;
}else{
arrowsArr[2] = board[i][j-1];
arrowsArr[3] = board[i][j+1];
}
if(nowR == 0 && arrowsArr[2] == 0 && arrowsArr[3] == 0){
answer++;
}
}else{
if(i == 0){
//맨 위 지역
arrowsArr[0] = 0;
arrowsArr[1] = board[i+1][j];
if(j == 0){
//맨 위의 맨 왼쪽 지역
arrowsArr[2] = 0;
arrowsArr[3] = board[i][j+1];
arrowsArr[4] = 0;
arrowsArr[5] = 0;
arrowsArr[6] = 0;
arrowsArr[7] = board[i+1][j+1];
}else if(j == (board.length-1)){
//맨 위의 맨 오른쪽 지역
arrowsArr[2] = board[i][j-1];
arrowsArr[3] = 0;
arrowsArr[4] = 0;
arrowsArr[5] = 0;
arrowsArr[6] = board[i+1][j-1];
arrowsArr[7] = 0;
}else{
arrowsArr[2] = board[i][j-1];
arrowsArr[3] = board[i][j+1];
arrowsArr[4] = 0;
arrowsArr[5] = 0;
arrowsArr[6] = board[i+1][j-1];
arrowsArr[7] = board[i+1][j+1];
}
}else if(i == board.length-1){
//맨 아래 지역
arrowsArr[0] = board[i-1][j];
arrowsArr[1] = 0;
if(j == 0){
//맨 아래의 맨 왼쪽 지역
arrowsArr[2] = 0;
arrowsArr[3] = board[i][j+1];
arrowsArr[4] = 0;
arrowsArr[5] = board[i-1][j+1];
arrowsArr[6] = 0;
arrowsArr[7] = 0;
}else if(j == (board.length-1)){
//맨 아래의 맨 오른쪽 지역
arrowsArr[2] = board[i][j-1];
arrowsArr[3] = 0;
arrowsArr[4] = board[i-1][j-1];
arrowsArr[5] = 0;
arrowsArr[6] = 0;
arrowsArr[7] = 0;
}else{
arrowsArr[2] = board[i][j-1];
arrowsArr[3] = board[i][j+1];
arrowsArr[4] = board[i-1][j-1];
arrowsArr[5] = board[i-1][j+1];
arrowsArr[6] = 0;
arrowsArr[7] = 0;
}
}else if (j == 0){
//맨 왼쪽 지역
arrowsArr[0] = board[i-1][j];
arrowsArr[1] = board[i+1][j];
arrowsArr[2] = 0;
arrowsArr[3] = board[i][j+1];
arrowsArr[4] = 0;
arrowsArr[5] = board[i-1][j+1];
arrowsArr[6] = 0;
arrowsArr[7] = board[i+1][j+1];
}else if(j == (board.length-1)){
//맨 오른쪽 지역
arrowsArr[0] = board[i-1][j];
arrowsArr[1] = board[i+1][j];
arrowsArr[2] = board[i][j-1];
arrowsArr[3] = 0;
arrowsArr[4] = board[i-1][j-1];
arrowsArr[5] = 0;
arrowsArr[6] = board[i+1][j-1];
arrowsArr[7] = 0;
}else{
//평범한 지역
arrowsArr[0] = board[i-1][j];
arrowsArr[1] = board[i+1][j];
arrowsArr[2] = board[i][j-1];
arrowsArr[3] = board[i][j+1];
arrowsArr[4] = board[i-1][j-1];
arrowsArr[5] = board[i-1][j+1];
arrowsArr[6] = board[i+1][j-1];
arrowsArr[7] = board[i+1][j+1];
}
if(nowR == 0 && arrowsArr[0] == 0 && arrowsArr[1] == 0
&& arrowsArr[2] == 0 && arrowsArr[3] == 0
&& arrowsArr[4] == 0 && arrowsArr[5] == 0
&& arrowsArr[6] == 0 && arrowsArr[7] == 0){
answer++;
}
}
}
}
return answer;
}
}
노가다형 코드에 경악을 합니다.
근데 풀기 전에 샘플 코드로 코딩 테스트에 내 버려서 수정본이 안 들어감
이걸 중복코드를 안 쓰고 알고리즘을 사용해서 10라인 이내로 짜신 분이...없다...
종종 코드 봐볼 예정
이거 조금 개선해 보려고 했는데 코드 더 이상해짐... 복잡도도 증가...
답글삭제dfs stack 형으로 짬 : 복잡도 증가 (물리적으로 눈으로 보기에 느림)
재귀로 짜봄 : 저 코드의 복잡도보다 인간이 알아보기 힘들 정도로 만듬ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
짤 수 있다 : true
아름답게 짤 수 있다 : false