문제
알파벳 소문자로만 이루어진 단어 S가 주어진다. 각 알파벳이 단어에 몇 개가 포함되어 있는지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 단어 S가 주어진다. 단어의 길이는 100을 넘지 않으며, 알파벳 소문자로만 이루어져 있다.
출력
단어에 포함되어 있는 a의 개수, b의 개수, …, z의 개수를 공백으로 구분해서 출력한다.
풀이
알파벳 소문자로 이루어진 문자열에 a~z까지의 알파벳이 각각 몇개씩 들어있는지를 출력하는 문제로
가장 간단한 방식은 객체에 a~z까지를 선언한 다음 해당 문자열의 값에 ++처리를 하는 방식으로
obj[input[i]]++와 같은 느낌으로 할 수 있다.
하지만 초기 설정이 귀찮고 덜 알고리즘스럽기 때문에
배열을 이용해서 문제를 해결하면
맨 앞의 0번째 값은 a, 25번째 값은 z라고 할 수 있고
문자열을 숫자로 변경하는 것은 아스키코드를 사용해서 진행할 수 있다.
각각의 문자열을 아스키코드로 변경항 다음 a가 0이 될 수 있게 -97을 하면
a는 0, b는 1 ..... z는 25로 index값에 매칭이 된다.
new Array(26).fill(0)으로 길이가 26이고 내부는 0으로 차있는 배열을 생성한 다음
아스키코드로 변경된 index에 접근해 ++처리를 해주고
최종적으로는 join(' ')을 통해 요구하는 형태로 출력할 수 있다.
만약 배열 형태로 처리했다면 for(let key in obj){} 형태로 객체의 각 값을 순차적으로 접근할 수 있다.
주의할 점은 객체는 새로운 키가 추가될 때 마다 키를 정렬해버린다.
하지만 a~z까지의 문자열이기 때문에 이번 문제에서는 걱정할 필요가 없지만
key가 1, 3, 10, 100이 있다면 1, 10, 100, 3으로 정렬되기 때문에
for(let key in obj){}로 접근할 경우 어떤 순서로 키를 추가했다고 하더라도 1, 10 , 100, 3의 순서로 출력되는 것을 볼 수 있다.
const input = require('fs').readFileSync('/dev/stdin').toString().trim()
const alphabet = new Array(26).fill(0)
for(let i = 0 ; i < input.length ; i++){
alphabet[input[i].charCodeAt() -97]++
}
console.log(alphabet.join(' '))
const input = `baekjoon`
const alphabet = new Array(26).fill(0)
for(let i = 0 ; i < input.length ; i++){
alphabet[input[i].charCodeAt() -97]++
}
console.log(alphabet.join(' '))'알고리즘 > 백준' 카테고리의 다른 글
| [백준 JS] 11945번 뜨거운 붕어빵 (0) | 2023.03.09 |
|---|---|
| [백준 JS] 11720번 숫자의 합 (0) | 2023.03.09 |
| [백준 JS] 7595번 Triangles (1) | 2023.03.09 |
| [백준 JS] 3046번 R2 (0) | 2023.03.09 |
| [백준 JS] 2845번 파티가 끝나고 난 뒤 (0) | 2023.03.09 |
