thumbnail

[lv.1] 대충 만든 자판 | 프로그래머스

[lv.1] 대충 만든 자판 | 프로그래머스

📋 [ 프로그래머스 ] 시리즈 몰아보기 (17)

✏️ (lv.1) : 대충 만든 자판

휴대폰의 자판은 일반적인 키보드와는 다르게 키캡 하나에 여러개의 문자가 할당될 수 있다. 이러한 경우 동일한 키를 연속으로 n번 입력하여 n번쨰 문자를 출력할 수 있다.

사용자가 직접 커스텀한 휴대폰 자판을 개발하였다. 이 자판은 키캡이 최대 100개까지 존재할 수 있으며 키캡에 할당된 문자 또한 사용자가 직접 할당하였다. 같은 문자가 서로 다른 키캡에 할당된 경우가 존재하며 같은 문자가 하나의 키캡에 여러번 할당된 경우도 존재한다. 또한 특정 문자가 자판에 할당되지 않은 경우도 있어 특정 문자열을 출력하지 못하는 경우도 있다.

1번 키부터 차례대로 할당된 문자들이 순서대로 담긴 문자배열 keymap과 입력하고자 하는 문자열들이 담긴 문자배열 targets가 주어질 때 targets의 각 문자열을 출력하기 위해 키를 최소 몇 번씩 눌러야 하는지 순서대로 배열에 담아 return하는 solution을 작성하라.

만약 목표한 문자열을 작성할 수 없는 경우 -1을 배열에 담는다.


  • 1 <= keymap.length <= 100
    • keymap의 원소의 길이는 서로 다를 수 있다.
    • keymap은 알파벳 대문자로만 이루어져 있다. keymap[i]i+1번 키를 눌렀을 때 출력되는 문자를 뜻한다.
  • 1 <= targets.length <= 100
    • targets는 알파벳 대문자로만 이루어져 있다.
    • 1 <= targets의 각 원소의 길이 <= 100

객체를 이용해 keymap에 존재하는 알파벳의 index를 기록하되 가장 최단거리에 해당하는 키캡의 index를 기록하여 통합된 newKeyboard를 선언하여 문제를 해결한다.

  • 새로운 객체 newKeyboard를 선언한다.
  • keymap의 각 원소 esplit("")을 이용해 배열의 형태로 변환한다.
    • e의 각 원소 item을 순회하며 다음의 로직을 수행한다.
      • newKeyboard[item]이 존재하지 않을 경우 item의 index값을 기록한다.
      • 존재할 경우 기존의 newKeyboard[item]의 값과 현재 item의 index값 중 더 작은 값을 기록한다.
  • 키를 누르는 횟수 sum을 선언, 0으로 초기화한다.
  • targets의 각 원소 target을 순회하며 다음 로직을 수행한다.
    • target의 각 원소 item을 순회하며 newKeyboard[item]의 값을 sum에 더한다.
    • sum이 그대로 0이거나 NaN일 경우 -1을, 그렇지 않은 경우 sumanswer에 push한다.
  • answer를 반환한다.
          
1 // sudo code
2 /*
3 keymap = [{ A:0, B:1, C:3, D:4 }, { B:0, C:1, E:2, F:3, D:4 }]
4 keyboard = { ...keymap }
5
6 int result = []
7 int sum = 0
8 for target of targets
9 if element of target exists at keyboard then
10 sum += value of keyboard[element]
11 push sum to result
12 sum = 0
13 */
14
15 function solution(keymap, targets) {
16 let answer = [];
17 const newKeyboard = {};
18
19 keymap.forEach(e => {
20 e.split("").forEach((item, i) => {
21 !newKeyboard[item]
22 ? (newKeyboard[item] = i + 1)
23 : (newKeyboard[item] = Math.min(newKeyboard[item], i + 1));
24 });
25 });
26
27 for (let target of targets) {
28 let sum = 0;
29 for (item of target) {
30 sum += newKeyboard[item];
31 }
32
33 !sum ? answer.push(-1) : answer.push(sum);
34 }
35
36 return answer;
37 }
38
# 프로그래머스
# JS
# javascript
# 코딩테스트
# 알고리즘
# 구현

💡 로그인 하지 않아도 댓글을 등록할 수 있습니다!

👨‍💻 관련 포스트