[백준 | Javascript] 5622

박기영·2022년 5월 19일
0

백준

목록 보기
51/127
post-custom-banner

문자열 8단계
5622번. 다이얼

문제

상근이의 할머니는 아래 그림과 같이 오래된 다이얼 전화기를 사용한다.
이미지
전화를 걸고 싶은 번호가 있다면, 숫자를 하나를 누른 다음에 금속 핀이 있는 곳 까지 시계방향으로 돌려야 한다. 숫자를 하나 누르면 다이얼이 처음 위치로 돌아가고, 다음 숫자를 누르려면 다이얼을 처음 위치에서 다시 돌려야 한다.
숫자 1을 걸려면 총 2초가 필요하다. 1보다 큰 수를 거는데 걸리는 시간은 이보다 더 걸리며, 한 칸 옆에 있는 숫자를 걸기 위해선 1초씩 더 걸린다.
상근이의 할머니는 전화 번호를 각 숫자에 해당하는 문자로 외운다. 즉, 어떤 단어를 걸 때, 각 알파벳에 해당하는 숫자를 걸면 된다. 예를 들어, UNUCIC는 868242와 같다.
할머니가 외운 단어가 주어졌을 때, 이 전화를 걸기 위해서 필요한 최소 시간을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 알파벳 대문자로 이루어진 단어가 주어진다. 단어의 길이는 2보다 크거나 같고, 15보다 작거나 같다.

출력

첫째 줄에 다이얼을 걸기 위해서 필요한 최소 시간을 출력한다.

예제 입출력

예제 입력 1

WA

예제 출력 1

13

예제 입력 2

UNUCIC

예제 출력 2

36

solution

const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().split('');

// 객체의 key가 3부터 시작하는 이유?
// 2번 다이얼은 3초, 3번 다이얼은 4초...
// 우리가 원하는건 다이얼을 돌리는데 걸리는 시간이므로 +1씩 해놓은 것
const dialObj = {
  3: "ABC",
  4: "DEF",
  5: "GHI",
  6: "JKL",
  7: "MNO",
  8: "PQRS",
  9: "TUV",
  10: "WXYZ",
};

let count = 0;

for(let i = 0; i < input.length; i++){
  for(let j = 3; j <= 10; j++){
    if(dialObj[j].includes(input[i])){
      count += j;
    }
  }
}

console.log(count);

런타임 에러

const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().split('');

let asciiNumArr = [];
let count = 0;

for(let i = 0; i < input.length; i++){
  asciiNumArr.push(input.charCodeAt(i));
}

for(let i = 0; i < input.length; i++){
  let num = asciiNumArr[i];
  
  if(num >= 65 && num <= 67){
    count += 3;
  } else if(num >= 68 && num <= 70){
    count += 4;
  } else if(num >= 71 && num <= 73){
    count += 5;
  } else if(num >= 74 && num <= 76){
    count += 6;
  } else if(num >= 77 && num <= 79){
    count += 7;
  } else if(num >= 80 && num <= 83){
    count += 8;
  } else if(num >= 84 && num <= 86){
    count += 9;
  } else if(num >= 87 && num <= 90){
    count += 10;
  } else {
   	count += 2; 
  }
}

console.log(count);

해설

처음에는 무식하게 다이얼에 적혀있는 알파벳을 아스키 코드 번호로 전환한 뒤 해당 번호에 따라 count를 증가시키는 방법을 사용했는데, 쓰면서도 너무 비효율적이라 생각했지만, 역시나 런타임 오류가 발생했다.(정확히 어떤 에러였는지는 기억이 나지않는다..)
그래서 객체를 생성하는 방법을 사용했다. 다이얼 번호마다 포함되어 있는 문자들을 하나의 문자열로 만들어놓고, 다이얼 번호만큼 반복하면서(3~10) 해당 문자를 포함하고 있는지 체크한다. 포함하고 있다면 그 때의 key가 다이얼을 돌리는데 걸리는 시간이 되므로, 그들의 누적합을 구해서 출력한다.

profile
나를 믿는 사람들을, 실망시키지 않도록
post-custom-banner

0개의 댓글