[lv.1] 대충 만든 자판 | 프로그래머스
[lv.1] 대충 만든 자판 | 프로그래머스
📋 [ 프로그래머스 ] 시리즈 몰아보기 (17)
✏️ (lv.1) : 대충 만든 자판
휴대폰의 자판은 일반적인 키보드와는 다르게 키캡 하나에 여러개의 문자가 할당될 수 있다. 이러한 경우 동일한 키를 연속으로 n번 입력하여 n번쨰 문자를 출력할 수 있다.
사용자가 직접 커스텀한 휴대폰 자판을 개발하였다. 이 자판은 키캡이 최대 100개까지 존재할 수 있으며 키캡에 할당된 문자 또한 사용자가 직접 할당하였다. 같은 문자가 서로 다른 키캡에 할당된 경우가 존재하며 같은 문자가 하나의 키캡에 여러번 할당된 경우도 존재한다. 또한 특정 문자가 자판에 할당되지 않은 경우도 있어 특정 문자열을 출력하지 못하는 경우도 있다.
1번 키부터 차례대로 할당된 문자들이 순서대로 담긴 문자배열 keymap
과 입력하고자 하는 문자열들이 담긴 문자배열 targets
가 주어질 때 targets
의 각 문자열을 출력하기 위해 키를 최소 몇 번씩 눌러야 하는지 순서대로 배열에 담아 return하는 solution을 작성하라.
만약 목표한 문자열을 작성할 수 없는 경우 -1
을 배열에 담는다.
- 1 <=
keymap.length
<= 100keymap
의 원소의 길이는 서로 다를 수 있다.keymap
은 알파벳 대문자로만 이루어져 있다.keymap[i]
는i+1
번 키를 눌렀을 때 출력되는 문자를 뜻한다.
- 1 <=
targets.length
<= 100targets
는 알파벳 대문자로만 이루어져 있다.- 1 <=
targets
의 각 원소의 길이 <= 100
객체
를 이용해 keymap
에 존재하는 알파벳의 index를 기록하되 가장 최단거리에 해당하는 키캡의 index를 기록하여 통합된 newKeyboard
를 선언하여 문제를 해결한다.
- 새로운 객체
newKeyboard
를 선언한다. keymap
의 각 원소e
를split("")
을 이용해 배열의 형태로 변환한다.- e의 각 원소
item
을 순회하며 다음의 로직을 수행한다.newKeyboard[item]
이 존재하지 않을 경우item
의 index값을 기록한다.- 존재할 경우 기존의
newKeyboard[item]
의 값과 현재item
의 index값 중 더 작은 값을 기록한다.
- e의 각 원소
- 키를 누르는 횟수
sum
을 선언, 0으로 초기화한다. targets
의 각 원소target
을 순회하며 다음 로직을 수행한다.target
의 각 원소item
을 순회하며newKeyboard[item]
의 값을sum
에 더한다.sum
이 그대로 0이거나 NaN일 경우-1
을, 그렇지 않은 경우sum
을answer
에 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 |
👨💻 관련 포스트
[lv.1] 개인정보 수집 유효기간
[lv.1] 개인정보 수집 유효기간
프로그래머스 lv.1 개인정보 수집 유효기간 풀이 with javascript. 해당 문제에서 한달은 28일로 고정이다. 따라서 today와 privacies 각 원소(개인정보)의 날짜를 년, 월, 일에 각 단위에 해당하는 수 * 28을 수행하여 일 단위로 변환한 후 terms에 해당하는 수를 더해 문제를 해결한다.
2023-05-30
[lv.1] 성격 유형 검사하기 | 프로그래머스
[lv.1] 성격 유형 검사하기 | 프로그래머스
프로그래머스 lv.1 성격 유형 검사하기 풀이 with javascript. javascript의 객체를 이용해 성격 유형(이하 MBTI)별 획득 점수를 기록하고 MBTI의 value를 비교해 문제를 해결한다.
2023-06-01
[lv.2] 주차 요금 계산 | 프로그래머스
[lv.2] 주차 요금 계산 | 프로그래머스
프로그래머스 lv.2 주차 요금 계산 풀이 with javascript. javascript의 객체를 이용해 차량의 입/출차 시간을 기록, 해당 객체를 순회하며 주차시간을 주어진 요금표에 맞게 정산하는 것으로 문제를 해결한다.
2023-06-04
💡 로그인 하지 않아도 댓글을 등록할 수 있습니다!