[백준 알고리즘] Node.js 1384. 메시지

2023. 8. 4. 17:03카테고리 없음

1. 문제

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

 

1384번: 메시지

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

www.acmicpc.net

 

2. 풀이

  • 아이들은 원형으로 앉아있다. 메시지가 적힌 종이는 왼쪽 방향으로 넘긴다.
  • 나쁜말이 적힌 메시지는 'N'으로 표시된다.
const inputs = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');
let idx = 1; // Group 번호를 표시할 변수

let result = ""; // 결과값을 출력할 변수
while(true){
  let n = +inputs.shift(); // 그룹에 몇명이 있는지 확인

  if(n === 0) break; // 만약 0 이라면 반복문 탈출.
  
  // n명까지 자르고 split을 이용하여 배열로 만듬.
  let group = inputs.splice(0,n).map(v => v.split(" "));
  let nastyGroup = []; // 나쁜말을 한 인덱스를 담을 변수.
  
  // group 반복
  group.forEach((item, index) => {
    let findIndexArr = []; // 'N' 이 있는 인덱스를 담을 배열.
    item.forEach(word => { // item = ['이름', 'P' 또는 'N'... ]
      if(word === 'N') { // 해당 단어가 'N' 이라면
      	
        // 'N'인 인덱스 값을 배열에 담음.
        findIndexArr = item.map((w,itemIdx) => w === word ? itemIdx : -1 )
                      .filter(w => w !== -1);
      }
    })
  
    // 만약 'N'이 담긴 배열의 길이가 0이 아니라면
    if(findIndexArr.length !== 0) {
      findIndexArr.forEach(findIdx => {
      	// 나쁜말을 한 사람의 이름을 알기 위한 index 계산.
        // 메시지를 왼쪽으로 전달하기 때문에 구분해주어야 함.
        let target = index - findIdx < 0 ? item.length + index - findIdx : index - findIdx;
        nastyGroup.push([group[target][0], item[0]])
      })
      
    }
  })
    
  // 출력 형식을 맞추기 위한 if문
  if(result !== "") result += `\n`
  
  // 그룹 번호 넣어주고
  result += `Group ${idx}\n`

  // 만약 나쁜말을 한 사람이 없다면
  if(nastyGroup.length === 0){
    result += "Nobody was nasty\n"
  } else { 
  
    // 출력 형식을 맞추기 위한 반복문.
    let answer = nastyGroup.map((item) => {
      return `${item[0]} was nasty about ${item[1]}\n`;
    })
  
    result += `${answer.join("")}`
  }
  
  // 다음 그룹을 위해 idx 증가.
  idx++;
}

// 결과 출력
console.log(result)

 

3. 정리

  • 엄청 복잡하게 작성한 느낌이다. 변수명 설정이나 함수 작성법을 좀 더 깔끔하게 작성할 수 있도록 노력해야겠다.
  • 맞추긴 했는데 흠.....