코딩테스트

코딩테스트 안전지대

김도현2 2023. 6. 21. 22:09
반응형

코딩테스트 안전지대

문제 설명

 

출력 예시

 

지뢰가 매개변수로 깔려 있으면 지뢰가 있는 지역과 지뢰 인접한 위험지역을 제외한

안전 지역이 몇칸인지 출력하는 문제 입니다.

 

지뢰찾기게임의 지뢰라고 생각하시면 됩니다.

 

 

const board = [[1, 0, 0, 0, 1], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [1, 0, 0, 1, 1]];
const answerarr = board.map(subArr => subArr.slice());	//board배열과 연결을 끊기위해 map을 이용
var answer = 0;

if(board.length == 1){
    board.forEach(e=>{
        if(e==0){
            answer++
        }
    })
}

//7

우선 지역 탐색용과 위험지역을 표시할 board와 똑같은 배열을 하나 더 만들어줍니다.

 

map을 쓴 이유는 answerarr = board 이렇게 선언해버리면 배열끼리 연결되어 배열 하나를 바꿔도

두개 다 바뀌게 됩니다.

 

const board = [[1, 0, 0, 0, 1], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [1, 0, 0, 1, 1]];
const answerarr = board.map(subArr => subArr.slice());	//board배열과 연결을 끊기위해 map을 이용
var answer = 0;

for(let i=0; i<board.length; i++){
    board[i].forEach((e,index) => {
        if(e == 1 && i < board.length-1 && index == 0){             
            answerarr[i][index-1] = 2;
            answerarr[i][index+1] = 2;

            answerarr[i+1][index-1] = 2;
            answerarr[i+1][index] = 2;
            answerarr[i+1][index+1] = 2;
        }
        if(e == 1 && i < board.length-1 && index > 0){               
            answerarr[i][index-1] = 2;
            answerarr[i][index+1] = 2;

            answerarr[i+1][index-1] = 2;
            answerarr[i+1][index] = 2;
            answerarr[i+1][index+1] = 2;
        }
        if(e == 1 && i > 0 && i < board.length-1 && index >=1 && index <= board.length-1){
            answerarr[i-1][index-1] = 2;
            answerarr[i-1][index] = 2;
            answerarr[i-1][index+1] = 2;

            answerarr[i][index-1] = 2;
            answerarr[i][index+1] = 2;

            answerarr[i+1][index-1] = 2;
            answerarr[i+1][index] = 2;
            answerarr[i+1][index+1] = 2;
        }
        if(e == 1 && i == board.length-1){
            answerarr[i-1][index-1] = 2;
            answerarr[i-1][index] = 2;
            answerarr[i-1][index+1] = 2;

            answerarr[i][index-1] = 2;
            answerarr[i][index+1] = 2;
        }
    })
}
for(let j=0; j<board.length; j++){
    answerarr[j].forEach((e,index) => {
        if(e==0){
            answer++
        }
    })
}

//7

그냥 바보같이 조건문을 사용하여 무식하게 풀었습니다..

아직 다른 방법이 생각나지 않은 저는 멀었습니다.

 

간략하게 코드에 대해 설명하자면,

만약 지뢰를 발견하게 된다면 인접한 지역(요소)을 모두 '2' 라는 정수로 바꿔버려 위험지역을 표시합니다.

 

하지만 이대로 사용하게 되면 board배열안에 배열이 한줄일 때 문제가 생깁니다.

그러므로 조건문을 하나 더 달아주도록 하겠습니다.

 

 

 

const board = [[1, 0, 0, 0, 1], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [1, 0, 0, 1, 1]];
const answerarr = board.map(subArr => subArr.slice());	//board배열과 연결을 끊기위해 map을 이용
var answer = 0;

if(board.length == 1){
    board.forEach(e=>{
        if(e==0){
            answer++
        }
    })
    return answer
}

for(let i=0; i<board.length; i++){
    board[i].forEach((e,index) => {
        if(e == 1 && i < board.length-1 && index == 0){             
            answerarr[i][index-1] = 2;
            answerarr[i][index+1] = 2;

            answerarr[i+1][index-1] = 2;
            answerarr[i+1][index] = 2;
            answerarr[i+1][index+1] = 2;
        }
        if(e == 1 && i < board.length-1 && index > 0){               
            answerarr[i][index-1] = 2;
            answerarr[i][index+1] = 2;

            answerarr[i+1][index-1] = 2;
            answerarr[i+1][index] = 2;
            answerarr[i+1][index+1] = 2;
        }
        if(e == 1 && i > 0 && i < board.length-1 && index >=1 && index <= board.length-1){
            answerarr[i-1][index-1] = 2;
            answerarr[i-1][index] = 2;
            answerarr[i-1][index+1] = 2;

            answerarr[i][index-1] = 2;
            answerarr[i][index+1] = 2;

            answerarr[i+1][index-1] = 2;
            answerarr[i+1][index] = 2;
            answerarr[i+1][index+1] = 2;
        }
        if(e == 1 && i == board.length-1){
            answerarr[i-1][index-1] = 2;
            answerarr[i-1][index] = 2;
            answerarr[i-1][index+1] = 2;

            answerarr[i][index-1] = 2;
            answerarr[i][index+1] = 2;
        }
    })
}
for(let j=0; j<board.length; j++){
    answerarr[j].forEach((e,index) => {
        if(e==0){
            answer++
        }
    })
}

//7

만약 배열안에 배열이 한개라면 그냥 0을 세어서 답을 출력하도록 조건을 달았습니다.

 

그렇게 이 문제를 풀어보면 안전구역은 7개밖에 나오지 않아 답은 7이 출력됩니다.