백준 5622번을 풀어보았다.
let words = require('fs').readFileSync('/dev/stdin').toString().trim()
let time = 0
for (const word of words) {
if (word < 'P') {
time += 2 + parseInt((word.charCodeAt() - 65) / 3) + 1
} else if (word < 'T') {
time += 8
} else if (word < 'W') {
time += 9
} else {
time += 10
}
}
console.log(time)
이 문제의 핵심은 알파벳별로 소요 시간을 구분해야 한다는 것이다.
O까지는 3개의 알파벳이 하나의 소요 시간으로 매핑되므로
알파벳의 유니코드값과의 관계를 찾아 소요 시간을 구하였고
그 이후로는 각각 소요 시간이 8, 9, 10인 경우로 처리해주었다.
처음에는 words를 입력받는 문장에 trim 메소드를 사용하지 않았는데 이상하게 계속 틀렸다고 나와서
혹시 몰라 trim 메소드를 사용해보니 그제서야 정답으로 처리되었다.
종종 백준에서 실행 시 입력값 뒤에 \n 등이 끼어들어오는 경우가 있는 것 같다.
참고) 백준 10951번
참고) 백준 2743번, 9086번
위 풀이가 if문을 사용해 알파벳별로 소요 시간을 구분한 것이라면, switch문과 객체를 사용할 수도 있다.
1. switch문
let words = require('fs').readFileSync('/dev/stdin').toString()
let time = 0
for (const word of words) {
switch(word) {
case 'A': case 'B': case 'C':
time += 3
break
case 'D': case 'E': case 'F':
time += 4
break
case 'G': case 'H': case 'I':
time += 5
break
case 'J': case 'K': case 'L':
time += 6
break
case 'M': case 'N': case 'O':
time += 7
break
case 'P': case 'Q': case 'R': case 'S':
time += 8
break
case 'T': case 'U': case 'V':
time += 9
break
case 'W': case 'X': case 'Y': case 'Z':
time += 10
break
}
}
console.log(time)
2. 객체
let words = require('fs').readFileSync('/dev/stdin').toString().trim()
let time = 0
let dial = {
2: "ABC",
3: "DEF",
4: "GHI",
5: "JKL",
6: "MNO",
7: "PQRS",
8: "TUV",
9: "WXYZ"
}
for (const word of words) {
for (let i = 2; i <= 9; i++) {
if (dial[i].includes(word)) {
time += i + 1
break
}
}
}
console.log(time)
다이얼을 키로, 알파벳을 값으로 가지는 객체를 정의하여 알파벳별 소요 시간을 구분하고
includes 메소드로 특정 다이얼을 키로 가지는 속성의 값에 word가 포함되는지 확인하여 소요 시간을 구하였다.
참고) 백준 5597번
💫 이 문제를 통해 배운 것
• 객체의 키와 값을 사용해 케이스를 구분할 수도 있다.
• includes 메소드를 사용하면 배열, 문자열이 특정 요소, 문자를 포함하는지 확인할 수 있다.