📌 문제
2019 HEPC - MAVEN League의 "비밀번호 만들기"와 같은 방식으로 비밀번호를 만든 경민이는 한 가지 문제점을 발견하였다. 비밀번호가 랜덤으로 만들어져서 기억을 못 한다는 것이었다! 그래서 경민이는 메모장에 사이트의 주소와 비밀번호를 저장해두기로 했다. 하지만 컴맹인 경민이는 메모장에서 찾기 기능을 활용하지 못하고 직접 눈으로 사이트의 주소와 비밀번호를 찾았다. 메모장에 저장된 사이트의 수가 늘어나면서 경민이는 비밀번호를 찾는 일에 시간을 너무 많이 쓰게 되었다. 이를 딱하게 여긴 문석이는 경민이를 위해 메모장에서 비밀번호를 찾는 프로그램을 만들기로 결심하였다! 문석이를 도와 경민이의 메모장에서 비밀번호를 찾아주는 프로그램을 만들어보자.
📌 입력
첫째 줄에 저장된 사이트 주소의 수 N(1 ≤ N ≤ 100,000)과 비밀번호를 찾으려는 사이트 주소의 수 M(1 ≤ M ≤ 100,000)이 주어진다.
두번째 줄부터 N개의 줄에 걸쳐 각 줄에 사이트 주소와 비밀번호가 공백으로 구분되어 주어진다. 사이트 주소는 알파벳 소문자, 알파벳 대문자, 대시('-'), 마침표('.')로 이루어져 있고, 중복되지 않는다. 비밀번호는 알파벳 대문자로만 이루어져 있다. 모두 길이는 최대 20자이다.
N+2번째 줄부터 M개의 줄에 걸쳐 비밀번호를 찾으려는 사이트 주소가 한줄에 하나씩 입력된다. 이때, 반드시 이미 저장된 사이트 주소가 입력된다.
📌 출력
첫 번째 줄부터 M개의 줄에 걸쳐 비밀번호를 찾으려는 사이트 주소의 비밀번호를 차례대로 각 줄에 하나씩 출력한다.
📌 예제 입력 및 출력
📌 풀이
알아야 하는 것
- arr.split() : 괄호 안에 적은 구분자를 기준으로 분리한다.
- arr.slice(시작(,끝)) : 어떤 배열의 시작부터 끝의 앞까지를 새로운 배열로 반환한다. 음수 인덱스의 경우 배열의 끝에서부터 길이를 나타낸다.
- arr.join() : 괄호 안의 구분자로 연결해 하나의 문자열을 만든다.
구할 것
입력값이 1번째 줄에는 전체 사이트의 개수(16)와 찾고자 하는 사이트 주소의 수(4)
2번째 줄부터 한 줄에 하나씩 입력 값(사이트, 비밀번호)이 주어진다.
상수 siteNum으로 input의 0번째 줄을 공백 기준으로 분리해 ["16", "4"]를 만든다.
이제 siteNum[0]에 전체 사이트의 개수가, siteNum[1]에 찾고자 하는 사이트 주소의 수가 할당됐다.
sitePassword 라는 맵을 만들면서 0번째 줄에는 siteNum이 있으니 input의 1번째 줄부터 for문으로 순회한다.
이 때 변수 i는 siteNum[0] 이하까지 돌아야 16번째 주소까지 갈 수 있다.
구조 분해 할당으로 [site, password] 의 site에 input[i]의 0번째를, password에 input[i]의 1번째를 할당한다.
[site, password] = ["nate.com", "VOICEMAIL"] 이런 식으로 할당되는 구조로, 이 쌍을 sitePassword에 저장한다.
전체 사이트의 개수는 16개지만, 실질적인 입력값은 여기에 찾고자 하는 사이트 주소 4개까지 더해져 총 20줄이다.
전체 20줄에서 찾고자 하는 사이트 주소 4개만 잘라내기 위해 slice를 사용하는데, 뒤부터 카운트할 것이므로 음수(-) 부호를 붙인다.
wantFindPassword는 찾고자 하는 주소 4개의 값을 갖게 된다.
문제 기준으로는 [ 'startlink.io', 'acmicpc.net', 'noj.am', 'mcc.hanyang.ac.kr' ]이다.
sitePassword 맵에 위 주소(키값)가 있다면, get 메서드로 밸류값을 가져와 answer에 push한다.
그럼 총 4줄로 답이 구성되지만 한 줄에 4개가 나란히 있는 모양으로 출력되어야 하기 때문에 join("\n")을 붙여준다.
answer의 각 요소에 "\n"이라는 구분자를 붙여 연결하는 것이므로 모든 줄에 줄바꿈이 이뤄진다.
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");
const siteNum = input[0].split(" ");
const sitePassword = new Map();
for (let i = 1; i <= siteNum[0]; i++) {
let [site, password] = input[i].split(" ");
sitePassword.set(site, password);
}
let wantFindPassword = input.slice(-siteNum[1]);
let answer = [];
for (let i = 0; i < wantFindPassword.length; i++) {
if (sitePassword.has(wantFindPassword[i])) {
answer.push(sitePassword.get(wantFindPassword[i]));
}
}
console.log(answer.join("\n"));
문제는 매우 쉽지만 백준의 입력값 출력값 형태에 익숙해지려고 풀어봤다.
"\n"를 프로그래머스에서는 거의 안 쓰다 보니 깜빡해서 2번 틀렸다...
'⚙️ 코딩테스트' 카테고리의 다른 글
[JavaScript] 프로그래머스 코딩테스트 레벨 2 : 타겟 넘버 (0) | 2023.07.04 |
---|---|
[JavaScript] 백준 코딩테스트 : 스택 (0) | 2023.06.29 |
[JavaScript] 프로그래머스 코딩테스트 레벨 2 : H-Index (0) | 2023.06.27 |
[JavaScript] 프로그래머스 코딩테스트 레벨 2 : 가장 큰 수 (0) | 2023.06.27 |
[JavaScript] 프로그래머스 코딩테스트 레벨 2 : 소수 찾기 (0) | 2023.06.26 |