개발새발 로그

[JS] 백준 10025번 : 적록색약 - 구현문제 본문

알고리즘/구현

[JS] 백준 10025번 : 적록색약 - 구현문제

이즈흐 2023. 7. 27. 00:55

https://www.acmicpc.net/problem/10026

 

10026번: 적록색약

적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다. 크기가 N×N인 그리드의 각 칸에 R(빨강), G(초록)

www.acmicpc.net

 

 

📋풀이방법

1. 적록색약인 사람과 아닌사람을 구분해서 DFS로 상하좌우를 검사해 그룹을 만든다.

2. DFS할 때 visited를 두개를 생성해서 둘이 따로 구분해준다.

 

🤟내 제출

const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim();
input=input.replace(/\r/g,"").split("\n");

let N=Number(input.shift().split(" "));
let arr=[];
for (let i = 0; i < N; i++) {
    arr.push(input[i].split(''));
    
}

let dx=[0,1,-1,0];
let dy=[1,0,0,-1];

let R_cnt=0;
let RG_cnt=0;

function R_DFS(color,y,x){
    for(var i=0;i<4;i++){
        let nx=x+dx[i];
        let ny=y+dy[i];
        if(nx>=0 && ny>=0 && ny<N && nx<N && visited_R[ny][nx]==0){
            if(arr[ny][nx]==color){
                visited_R[ny][nx]=1;
                R_DFS(arr[ny][nx],ny,nx)
            }
        }
    }    
}
function RG_DFS(color,y,x){
    for(var i=0;i<4;i++){
        let nx=x+dx[i];
        let ny=y+dy[i];
        if(nx>=0 && ny>=0 && ny<N && nx<N && visited_RG[ny][nx]==0){
            if(color=="R"){
                if(arr[ny][nx]=="R" || arr[ny][nx]=="G"){
                    visited_RG[ny][nx]=1;
                    RG_DFS(arr[ny][nx],ny,nx)
                }
            }
            else if(color=="G"){
                if(arr[ny][nx]=="R" || arr[ny][nx]=="G"){
                    visited_RG[ny][nx]=1;
                    RG_DFS(arr[ny][nx],ny,nx)
                }
            }
            else {
                if(arr[ny][nx]==color){
                    visited_RG[ny][nx]=1;
                    RG_DFS(arr[ny][nx],ny,nx)
                }
            }
            
        }
    }    
}


let visited_R=Array.from({length:N},()=>Array(N).fill(0))
let visited_RG=Array.from({length:N},()=>Array(N).fill(0))
for(var i=0;i<N;i++){
    for(var j=0;j<N;j++){
        if(visited_R[i][j]==0){
            R_cnt++;
            visited_R[i][j]=1;
            R_DFS(arr[i][j],i,j);
        }
        if(visited_RG[i][j]==0){
            RG_cnt++;
            visited_RG[i][j]=1;
            RG_DFS(arr[i][j],i,j);
            console.log(visited_RG)
        }
    }
}
console.log(visited_RG)
console.log(R_cnt,RG_cnt);

 

 

💢어려웠던 점

1. 이 문제에서 어려웠던 점은 없었다!

728x90
반응형
LIST