백준 1384번
  • 위 문제는 처음에 문제 이해를 잘못해서 풀이방향이 잘못될뻔한 문제이다..종이를 넘기는것이 입력받은 값기준 첫번째 줄이 두번째줄에게 종이를 넘기는 것이므로 예제 1번에서 N은 아래로 두번째 있는 아이가 쓴것이라고 이해했다.근데 왜인지 위로 두번째를 넘겼어야했다. 이건 아직도 잘모르겠지만..위로 하니까 풀렸다(예제출력을 보고 알았다)

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

 

1384번: 메시지

그룹 번호를 "Group 1"과 같이 출력함으로써 출력을 시작합니다. 그 다음 줄부터 누가(A) 누구(B)에게 나쁜 말을 했는지 "A was nasty about B"로 한 줄씩 출력합니다. 나쁜 말이 여러 개라면, 입력받은 순

www.acmicpc.net

 

 

처음이자 정답으로 제출한 코드
const fs = require('fs');
const input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");

//그룹과 종이에 적힌값을 입력받아 함수로서 처리
//child 배열을 검색 만일 N이 존재할경우 badChild를 true로 변경하고 해당하는 인덱스를 위로 j칸 찾는다.
//이때 i-j가 음수일 수 있으므로 이를 확인하여 해당경우는 반대로 연산
const checkPN = (group,child) => {
    console.log("Group " + group);
    let badChild = false;
    for(let i = 0;i<child.length;i++){
        for(let j = 1; j < child[0].length;j++){
            if(child[i][j] == "N"){
                badChild = true;
                if((i - j) < 0){
                    console.log(child[(i-j) + child.length][0] + " was nasty about " + child[i][0]);
                }
                else{
                    console.log(child[i-j][0] + " was nasty about " + child[i][0]);
                }
            }
        }
    }
    if(!badChild){
        console.log("Nobody was nasty");
    }
    console.log();
}

let roof = 0;
let group = 1;

//입력값을 그룹인원만큼 뽑아내어 함수에게 매개변수로 주며 호출
while(Number(input[roof]) != 0){
    let childPaper = [];
    for(let i = roof + 1; i <= roof + Number(input[roof]);i++){
        childPaper.push(input[i].trim().split(' '));
    }
    checkPN(group,childPaper);
    
    roof += Number(input[roof])+1;
    group++;
}

 

결과

 

 

첫번째 제출에서 출력형식이 잘못됬던 점은 그룹의 인원을 출력하고 console.log()로 띄어쓰기를 한번 해주어야됬었다.

 

위 문제를 보고 떠올린 아이디어는 간단하다.

이중배열로 데이터를 받고 각 인덱스의 0번째 인덱스에는 아이들의 이름이 들어갈것이고 그 이후의 인덱스에는 P 또는 N의 값이 있을것이다.

 

이중배열로 1번째 배열부터 검색하여 N 이라는 값이 나올경우에는 badChild이라는 boolean 값을 참으로 바꾸고 N이 나온 인덱스로부터 역추적하면된다.

역추적은 상하인덱스로 이동을 해주면되기 떄문에 위 코드에서는 j번째 인덱스는 놔두고 i번째 인덱스를 옮겨주면된다.

 

그 이후 추적한 i번째 인덱스의 [0]번째 값에는 이름이 들어있으므로 이와 기존 i번째 인덱스의 [0] 번째 값을 출력해주면된다.

 

만일 nasty 학생이 없을경우  badChild 값이 false로 유지되므로 if 문을 통해 !badChild 일경우 nasty 한 학생이 없었음을 출력해주면된다.

 

위 문제는 단순 구현의 문제로 구현하는데는 오래걸렸지만 아이디어를 내는 부분에서는 크게 생각할거리가 없었던거 같다.

'백준' 카테고리의 다른 글

백준 1417번 "소트인사이드"  (0) 2024.04.16
백준 2018번 "수들의 합 5"  (0) 2024.04.15
백준 1316번 "그룹 단체 체커"  (0) 2024.04.13
백준 1475번 "방번호"  (0) 2024.04.12
백준 2563번 "색종이"  (0) 2024.04.12

+ Recent posts