[백준] 16165 걸그룹 마스터 준석이 JavaScript

·2024년 4월 14일

문제

정우는 소문난 걸그룹 덕후이다. 정우의 친구 준석이도 걸그룹을 좋아하지만 이름을 잘 외우지 못한다는 문제가 있었다. 정우는 친구를 위해 걸그룹 개인과 팀의 이름을 검색하여 외우게 하는 퀴즈 프로그램을 만들고자 한다.

입력

첫 번째 줄에는 총 입력 받을 걸그룹의 수 N(0 < N < 100)과 맞혀야 할 문제의 수 M(0 < M < 100)을 입력받는다.

두 번째 줄부터는 각 걸그룹마다 팀의 이름, 걸그룹의 인원 수, 멤버의 이름을 한 줄씩 차례대로 입력받는다. 팀과 멤버의 이름은 최대 100글자이며, 모든 글자는 알파벳 소문자이다. 하나의 걸그룹이나 서로 다른 두 걸그룹에 이름이 같은 두 멤버가 있는 경우는 없다.

그 다음 줄부터는 M개의 퀴즈를 입력받는다. 각각의 퀴즈는 두 줄로 이루어져 있으며, 팀의 이름이나 멤버의 이름이 첫 줄에 주어지고 퀴즈의 종류를 나타내는 0 또는 1이 두 번째 줄에 주어진다. 퀴즈의 종류가 0일 경우 팀의 이름이 주어지며, 1일 경우 멤버의 이름이 주어진다.

출력

첫 번째 줄부터 차례대로 퀴즈에 대한 답을 출력한다. 퀴즈의 종류가 0일 경우 해당 팀에 속한 멤버의 이름을 사전순으로 한 줄에 한 명씩 출력한다. 퀴즈의 종류가 1일 경우 해당 멤버가 속한 팀의 이름을 출력한다.

예제 입력

3 4
twice
9
jihyo
dahyeon
mina
momo
chaeyoung
jeongyeon
tzuyu
sana
nayeon
blackpink
4
jisu
lisa
rose
jenny
redvelvet
5
wendy
irene
seulgi
yeri
joy
sana
1
wendy
1
twice
0
rose
1

예제 출력

twice
redvelvet
chaeyoung
dahyeon
jeongyeon
jihyo
mina
momo
nayeon
sana
tzuyu
blackpink

내가 했던 풀이 방법

members : 걸그룹별로 멤버 이름을 모아둔 배열 (member를 요소로 갖는다.)
member : 한 걸그룹의 멤버 이름 Set
member_n : 한 걸그룹의 멤버 수
idols : 걸그룹 이름을 모아둔 배열
index : input(입력받은 입력 중 N,M을 제외한 모든 입력)을 다루는 index
question : 문제로 받은 걸그룹 이름 또는 멤버 이름
type : 퀴즈의 종류 (0일 경우, 해당 그룹의 멤버를 사전 순으로 출력 / 1일 경우 해당 멤버의 소속 그룹을 출력)
answer : 퀴즈에 대한 정답
arr : member를 배열로 변환한 값

  1. members를 길이가 N인 2차원 배열로 초기화해준다. idols를 길이가 N인 배열로 초기화해준다. (둘의 index를 같이하여 idols[1]이 blackpink일 경우 members[1]의 Set에는 blackpink의 멤버 이름이 담겨있다.)

  2. index를 0부터 시작하고 input을 한 번 검사할 때마다 1씩 증가시키도록 한다. (for문으로 관리하지 않는 이유는 멤버를 저장 + 퀴즈 풀이 과정이 input에 모두 담겨있기 때문에 전역으로 index를 관리해주어야 하기 때문이다.)

  3. 멤버 정보가 그룹이름 + 멤버 수 + 멤버로 되어있으므로 먼저, input[index]에 있는 값을 idols에 넣어준다. 그 다음 input[index]에 값을 정수형으로 변환하여 member_n에 저장해준다.

  4. member에 새로운 Set를 선언해주고, 0부터 member_n까지 input[index]에 값을 member에 넣어준 뒤, 모든 멤버 이름이 담긴 Set을 members에 넣어준다. (Set을 이용하는 이유는 퀴즈를 풀 때 해당 값이 존재하는지를 검색해야 하므로, 효율적인 Set을 이용해준다.)

  5. 3-4번을 N번 반복해 모든 걸그룹의 정보를 저장해준다.

  6. 현재 index값부터 input.length-1까지 i를 2씩 증가시키면서, 퀴즈를 풀이한다. 퀴즈는 멤버 이름(또는 그룹 이름) + 퀴즈 종류로 되어있으므로, 먼저 input[i]에 들어있는 값을 question에 넣어주고, input[i+1]에 들어있는 값을 정수형으로 변환하여 type에 넣어준다.

  7. type이 1일 경우, members 배열을 검사하여 member에 question이 있는 경우, idols 배열에 해당 인덱스를 넣은 값을 answer에 추가해준다. (한 줄씩 출력하므로 \n을 추가해준다.)

  8. type이 0일 경우, idols 배열을 검사하여, question과 같은 값이 있는 경우, 해당 인덱스의 members 값을 배열로 변환해준 뒤, 멤버 이름을 사전 순으로 정렬해준다. 그 뒤 모든 멤버를 한 줄 씩 출력해준다. (배열로 변환하는 이유는 사전 순으로 출력하기 위해 sort를 이용하기 위해서이다. Set에는 순서가 없기 때문에 퀴즈를 풀기 전 미리 정렬을 할 수 없기 때문이다.)

코드

const fs = require('fs');
let [n, ...input] = fs.readFileSync(0, 'utf-8').toString().trim().split('\n');

let N = parseInt(n.trim().split(' ')[0]);
let M = parseInt(n.trim().split(' ')[1]);

let members = Array.from({ length: N }, () => []);
let idols = Array.from({ length: N });
let member = [];
let index = 0;
let member_n = 0;
for (let i = 0; i < N; i++) {
  idols[i] = input[index++].trim();
  member_n = parseInt(input[index++]);
  member = new Set();
  for (let j = 0; j < member_n; j++) {
    member.add(input[index++].trim());
  }
  members[i] = member;
}

let question = '';
let type = 0;
let answer = '';
let arr = [];
for (let i = index; i < input.length; i += 2) {
  question = input[i].trim();
  type = parseInt(input[i + 1].trim());
  if (type === 1) {
    for (let j = 0; j < N; j++) {
      if (members[j].has(question)) {
        answer += idols[j] + '\n';
        break;
      }
    }
  } else {
    for (let j = 0; j < N; j++) {
      if (idols[j] === question) {
        arr = Array.from(members[j]);
        arr.sort();
        for (let k = 0; k < arr.length; k++) {
          answer += arr[k] + '\n';
        }
      }
    }
  }
}

console.log(answer.trim());

회고

문제가 어렵다기 보다는 구현할 게 좀 많은 문제였던 것 같다. 저장해주어야 하는 게 많아서 Map을 써야하나 고민했지만, Map보다 Set이 더 다루기가 편해서 Set만으로 풀이했다.

profile
Frontend🍓

0개의 댓글