본문 바로가기
ComputerScience/알고리즘, 프로그래머스

[Lv.0] 안전지대 (2차원 배열과 경우의수)

by VictorMeredith 2023. 1. 30.

1. 문제

2. 전략

  1) 지뢰의 좌표를 찾는다.

  2) 지뢰의 좌표로부터 상하좌우 8칸이 0이라면 'x'로 바꾼다 (지뢰가 여러개일수 있으므로 1이면 그대로 1로 둔다.)

  3) 만약 지뢰가 좌상끝/좌끝/좌하끝/우상끝/우끝/우하끝/상끝/하끝 인 경우를 고려해야한다.

  4) * 풀이 도중 board[삼항연산자][삼항연산자] 의 방법에 오류가 있어 별도의 함수를 만들어 풀었다.

function solution(board) {
    var answer = 0;
    let n = board.length-1; 
    // board는 어떤수x어떤수의 정사각형 형태이므로 
    // let n = board의 요소의 마지막index혹은 board의 마지막index
    
    let ifNeg = (a)=>{ 
    // ifNeg는 파라미터 자신이 음수면 0이되고, 아니면 -1 해주는 함수(index가 음수가 되지 않도록 조정)
        if(a === 0){
            a = 0;
        }
        else{
            a = a-1
        }
        return Number(a)
    }
    
    let ifPos = (a,n)=>{ 
    // ifPos는 파라미터 자신이 n과 같으면 n이되고, 아니면 +1 해주는 함수(index가 배열의 마지막index를 넘지 않도록)
        if( a === n){
            a = n
        }
        else{
            a = a+1;
        }
        return Number(a)
    }
    
    for(i in board){
        for(j in board){ //2차원배열 순회
            if(board[i][j] === 1){ //i,j에 지뢰가 있는 경우 실행
                i = Number(i);
                j = Number(j);
                
                // 지뢰가 각 부분 끝에 있는 경우를 고려하여 index가 음수 혹은 마지막index를 넘지 않도록
                // 앞에서 정의한 함수를 이용하여 범위를 조정해준다.
                board[ifNeg(i)][ifNeg(j)] === 0 ? board[ifNeg(i)][ifNeg(j)] = 'x' : null; 
                board[i][ifNeg(j)] === 0 ? board[i][ifNeg(j)] = 'x' : null; 
                board[ifPos(i,n)][ifNeg(j)] === 0 ? board[ifPos(i,n)][ifNeg(j)] = 'x' : null;
                board[ifNeg(i)][j] === 0 ? board[ifNeg(i)][j] = 'x' : null;
                board[ifPos(i,n)][j] ===0 ? board[ifPos(i,n)][j] = 'x' : null;
                board[ifNeg(i)][ifPos(j,n)] ===0 ? board[ifNeg(i)][ifPos(j,n)] = 'x' : null;
                board[i][ifPos(j,n)] ===0 ? board[i][ifPos(j,n)] = 'x' : null;
                board[ifPos(i,n)][ifPos(j,n)] ===0 ? board[ifPos(i,n)][ifPos(j,n)] = 'x' : null;
                // 지뢰 주변의 값이 0이라면 'x'로 변환해주고, 아니면 null
                
            }
        }
    }
    
    let allCount = 0; //전체 0의 개수 카운트
    for(k in board){
        for(l in board){ // 순회하면서 카운팅해준다.
            if(board[k][l] === 0){
                allCount++
            }
        }
    }
    
    return allCount;
}

 

3. 알아야할 사항

  1) 삼항연산자

    - (조건문) ? (조건문이true면 실행) : (아니라면 실행)

    - 간단하게 한줄로 if else문을 작성할 수 있는 축약문법이다.

    - 중첩도 가능하다. React에서 jsx내부에는 if문을 사용할 수 없으므로 if문 대신에 자주 쓴다.

    - 가독성이 똥이므로 잘 생각해서 if else 많이 쓰자.

댓글