문제 개요
전통적인 QWERTY 자판 배열 대신, 키가 단순히 영어 알파벳 순서(a, b, c, d...)대로 배치된 키보드가 있다고 가정해 보겠습니다.
본격적으로 문제를 풀기 전에 다음 두 가지 조건을 먼저 정리하겠습니다.
- 현재 손가락은 인덱스 0, 즉 'a' 키 위에 위치해 있습니다.
- 한 키에서 다른 키로 이동하는 데 걸리는 시간은 두 키 인덱스 차이의 절댓값입니다. 예를 들어 'a'에서 'k'로 이동하는 데 걸리는 시간은 |0 − 10| = 10입니다.
즉, 우리는 영어 소문자 알파벳으로 이루어진 문자열을 입력받아, 해당 문자열을 모두 입력하는 데 필요한 총 시간을 계산해 반환하는 JavaScript 함수를 작성해야 합니다.
입력 및 출력 예시
입력 문자열이 다음과 같다고 가정해 봅시다.
const str = 'dab';출력
const output = 7;결과가 7이 되는 이유는 다음과 같은 이동이 순차적으로 발생하기 때문입니다.
'a' -> 'd' = 3
'd' -> 'a' = 3
'a' -> 'b' = 1각 이동 시간(3 + 3 + 1)을 모두 더하면 총 7이 됩니다.
구현 코드
이 문제를 해결하는 코드는 다음과 같습니다.
const str = 'dab';
const findTimeTaken = (str = '') => {
let timeSpent = 0;
const keyboard = 'abcdefghijklmnopqrstuvwxyz';
let curr = 'a';
for(let i = 0; i < str.length; i++){
const el = str[i];
const fromIndex = keyboard.indexOf(curr);
const toIndex = keyboard.indexOf(el);
const time = Math.abs(fromIndex - toIndex);
curr = el;
timeSpent += time;
};
return timeSpent;
};
console.log(findTimeTaken(str));코드 동작 원리
이 함수의 핵심 로직은 다음과 같습니다.
- 키보드 참조 문자열 생성: 알파벳 순서 그대로 나열된 문자열을 기준 좌표계로 사용합니다. 각 문자의 인덱스가 곧 키보드상의 위치가 됩니다.
- 현재 위치 추적: 변수
curr로 현재 손가락이 놓인 키를 저장하며, 처음에는 시작점인 'a'로 초기화합니다. - 문자별 이동 시간 누적: 반복문으로 입력 문자열의 각 문자를 순회하면서, 현재 키와 다음 키의 인덱스를
indexOf()로 구한 뒤 그 차이의 절댓값을 계산합니다. - 위치 갱신 및 합산: 매 문자를 처리한 후
curr를 해당 문자로 갱신하고, 계산된 시간을timeSpent에 더합니다.
모든 문자를 처리하면 누적된 timeSpent가 곧 전체 입력에 걸리는 총 시간이므로 이를 반환합니다.
실행 결과
콘솔에 출력되는 결과는 다음과 같습니다.
7이 알고리즘은 문자열 길이에 비례하여 한 번씩만 순회하므로 시간 복잡도는 O(n)이며, 추가 메모리 사용 없이 효율적으로 동작합니다.