[Algorithm] 프로그래머스 81302 : 거리두기 확인하기

Ell!·2021년 10월 22일
0

algorithm

목록 보기
1/5

문제

프로그래머스 81302번. 2021년 카카오 인턴쉽 코테에서 나온 거리두기 확인하기 문제이다.

접근 방식

  1. 처음에는 일단 덤벼보자는 생각에 완전 탐색을 해서 P를 찾아서 모아놓은 다음에 그 P 중에서 거리두기를 지키지 않는 녀석을 탈락시키자는 생각으로 접근을 했다. 그런데 막상 그렇게 해보니깐 생각만큼 되지가 않더라... 고려해야할 사항이 너무 많아서
  2. 그래서 고민을 한참하다가 질문하기 탭에 어떻게 접근해야하는지 나와있어서 그 방법을 따라보았다. P와 X를 찾아서 5X5의 0 배열을 만들고서, P와 그 주변(동서남북)에는 -1씩 해주고, X에는 +10씩 해주어서 (+10이 아니어도 되고 -1 4개를 상쇄시킬 정도의 큰 수이면 된다. > 3) -2보다 작은 원소가 있으면 탈락!
  3. 결국 핵심은 현재 P와 X의 상태를 5x5 배열에 적어 놓는다는 개념이었다

코드

접근 방식은 도움을 받았으니 그래도 코드는 직접 짰다..

/* 
처음에는 완전탐색으로 p의 위치를 죄다 찾아서 해당 인원이 거리두기를 지키고 있는지
체크해가지고 하나씩 탈락시키려고 했었음.
하지만 문제의 접근과정을 살펴보니.... 
각 P와 X의 상태를 5X5 int배열로 나타낸다! 라는 느낌으로 풀어가더라.
*/



function solution(places) {
    
    let PList = []; // P와 X의 좌표를 끄집어 냄.
    let XList = [];
    console.log(places);
    for(let i = 0; i < places.length; i++){
        let place = places[i]; // 각 대기실
        let eachP = [];
        let eachX = [];
        for(let x = 0; x < place.length; x++){
            let line = place[x]; // 각 라인 (x)
            for(let y = 0; y < line.length; y++){
                let person = line[y]; // 각 사람 (y)
                if(person === 'P'){
                    eachP.push([x,y]);
                } else if(person === 'X'){
                    eachX.push([x,y]);
                }
            }
        }
        PList[i] = eachP;
        XList[i] = eachX;
    }
   
    let answer = [1,1,1,1,1];
    
    for(let k = 0; k < 5; k++){
        let intArr = [[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0]] // 0으로 채워진 5X5 배열
    
        for(let i = 0; i < PList[k].length; i++){
            let person = PList[k][i]; // P
            let [x, y] = person; // person의 좌표
            //console.log(person)
            //console.log(x,y)
            intArr[x][y] -= 1; //P의 자리부터 --;
            if(x < 4) intArr[x+1][y]--; // 아래쪽 -- (x가 4 이상이면 자리 없음)
            if(x > 0) intArr[x-1][y]--; // 위쪽 --; (x가 0 이하면 자리 없음)
            if(y < 4) intArr[x][y+1]--; // 오른쪽--; 
            if(y > 0) intArr[x][y-1]--;  
        }
        console.log("---");
        for(let j = 0; j < XList[k].length; j++){
            let block = XList[k][j];
            let [x,y] = block;
            intArr[x][y] += 10; // X로 막은데는 10을 더해서 아예 막혀있음을 나타냄
        }
        console.log(intArr)
        
        // -2보다 작은 것들이 있는지 체크
        for(let a = 0; a < 5; a++){
            for(let b = 0; b < 5; b++){
                if(intArr[a][b] <= -2){
                    console.log(a,b)
                    answer[k] = 0;
                    break;
                }
            }
        }
    }
    
   
    return answer;
}

어... 그런데 다른 사람의 풀이도 보니깐 그냥 완전탐색으로 풀어버린 사람들도 많은거 같다 ㅋㅋㅋㅋ p위치 찾고 각 사람마다 거리두기를 지키는지?를 판단해서
역시 코테는 내가 가는 길을 안 까먹는 것이 중요한 거 같다 ㅋㅋ

profile
더 나은 서비스를 고민하는 프론트엔드 개발자.

0개의 댓글