안녕하세요. 박기린 입니다.
백준 10809번 알파벳 찾기 문제를 풀어봅시다.
문제 링크
https://www.acmicpc.net/problem/10809
문제 해석
1. 모든 입력은 소문자 알파벳으로만 구성됩니다.
2. a부터 z까지 알파벳 리스트를 만듭니다.
3. 입력받은 string의 알파벳을 분해한 후, 등장하는 순서를 알파벳 리스트에 적어줍니다.
4. 입력받은 string에 포함되지 않은 알파벳은 -1을 적습니다.
5. 중복되는 알파벳이 있으면, 첫 번째 이후로 등장하는 중복 요소는 전부 무시합니다.
정답 코드
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin").toString().trim().split("");
const alphabet = Array.from({ length: 26 }, (v, i) =>
String.fromCharCode(i + 97) // <utf-16 table> 97 : a | 122 : z
);
let result = "";
alphabet.forEach((e) => {
let find = input.findIndex((c) => c === e);
result += find + ' ';
});
console.log(result);
정답 코드 풀이
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin").toString().trim().split("");
fs모듈로 입력을 받은 후, split("")을 이용해서 철자 단위로 String을 분해합니다.
const alphabet = Array.from({ length: 26 }, (v, i) =>
String.fromCharCode(i + 97) // <utf-16 table> 97 : a | 122 : z
);
[a부터 z까지] 리스트가 담긴 alphabet array를 만듭니다.
이때, String.fromCharCode()를 이용해서 간단하게 알파벳 리스트를 제작합니다.
String.fromCharCode()는 UTF-16 기반으로 작동을 합니다.
UTF-16에서 'a'는 97이기에, 97부터 차례대로 알파벳이 Array에 담기게 끔, (i + 97)을 인수로 넣어줍니다.
let result = "";
alphabet.forEach((e) => {
let find = input.findIndex((c) => c === e);
result += find + ' ';
});
console.log(result);
forEach()를 이용해서 알파벳 리스트를 접근합니다.
Array.prototype.findIndex()를 이용해서, '반복문에서 접근한 알파벳'이 '입력받은 String'의 몇 번째 인덱스에 위치하는 지를 알아냅니다.
findIndex()는 0부터 시작해서 차례대로 값을 비교하는데, 한 번 조건에 맞는 요소를 찾으면 그대로 실행을 종료합니다. 따라서, 중복되는 요소가 존재할 경우 맨 처음 등장한 요소의 인덱스만을 return합니다.
이 문제를 풀기 위해서는 중복되는 요소의 가장 맨 처음 인덱스를 알아야 하기에 아주 적합한 기능입니다.
게다가 findIndex()는 만약 조건에 맞는 요소를 찾지 못할 경우 -1을 return합니다. 이 문제 또한 포함되지 않는 알파벳은 -1을 출력하도록 되어 있어 아주 적합한 기능입니다.
모든 알파벳을 findIndex()를 이용해서 확인한 후, 적절한 방법으로 출력합니다.
'JS > 백준' 카테고리의 다른 글
[백준JS] 1316. 그룹 단어 체커 (0) | 2023.03.24 |
---|---|
[백준JS] 10812. 바구니 순서 바꾸기 (0) | 2023.03.18 |
[백준JS] 1152. 단어의 개수 (반례 설명 포함) (0) | 2023.03.15 |
[백준JS] 11654. 자바스크립트 아스키 코드 출력하기 (ASCII) (0) | 2023.03.14 |
[백준JS] 10811. 바구니 뒤집기 (0) | 2023.03.12 |