[백준 알고리즘] 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. 정리
- 엄청 복잡하게 작성한 느낌이다. 변수명 설정이나 함수 작성법을 좀 더 깔끔하게 작성할 수 있도록 노력해야겠다.
- 맞추긴 했는데 흠.....