문제
문제 설명
휴대폰 자판을 만들고자 한다고 한다. 이 휴대폰 자판은 하나의 키에 여러 개의 문자가 할당될 수 있고, 키 하나에 여러 문자가 할당된 경우, 동일한 키를 연속해서 빠르게 누르면 할당된 순서대로 문자가 바뀐다고 한다.
이 휴대폰 자판은 키의 개수가 1개부터 최대 100개까지 있을 수 있으며, 특정 키를 눌렀을 때 입력되는 문자들로 무작위로 배열되어 있다. 또한 같은 문자가 자판 전체에 여러 번 할당된 경우도 있고, 키 하나에 같은 문자가 여러 번 할당된 경우도 있으며, 아예 할당되지 않은 경우도 있다고 한다.
이 휴대폰 자판을 이용해 특정 문자열을 작성할 때, 키를 최소 몇 번 눌러야 그 문자열을 작성할 수 있는지 구하는 문제이다.
주어지는 변수로는 1번 키부터 차례대로 할당된 문자들이 순서대로 담긴 문자열배열 keymap과 입력하려는 문자열들이 담긴 문자열 배열 targets가 주어진다.
단, 목표 문자열을 작성할 수 없을 때는 -1을 저장한다고 한다.
※제한사항
- 1 <= keymap의 길이 <= 100
- 1 <= keymap의 원소의 길이 <= 100
- keymap의 원소의 길이는 서로 다를 수 있다.
- keymap의 원소는 알파벳 대문자로만 이루어져 있다.
- 1 <= targets의 길이 <= 100
- 1 <= targets의 원소의 길이 <= 100
- targets의 원소는 알파벳 대문자로만 이루어져 있다.
풀이
문제에서 최소한의 키 입력을 통해 정답을 구하라고 나와 있는 부분이 있다. 그래서 최소한의 키 입력을 받기 위해
key라는 객체를 생성해 준 다음 keymap의 요소 중 가장 작은 인덱스를 가진 알파벳을 key[keyData] = index + 1의 형태로 저장해 주었다. 그리고 targets의 각 요소들을 반복문을 돌려주어 key안에 있는 요소이면 눌린 횟수를 저장하는 변수 count 값을 증가시켜 주고 다 더한 값을 정답을 반환하는 변수 answer에 저장해 주었고, 그렇지 않은 경우 -1을 반환해 주었다.
아래는 풀이에 사용한 코드이다.
function solution(keymap, targets) {
var answer = []; // 정답을 반환할 배열
var key = {}; // 키 입력을 최소화 하는 횟수를 담을 배열
// keymap의 각 요소를 돌며 키 입력이 최소화 되는 값을 key에 저장한다.
keymap.map((data) => {
data.split('').map((keyData,index) => {
if(keyData in key)
if(key[keyData] > index+1 ){
key[keyData] = index+1
}
}else{
key[keyData] = index+1
}
})
})
// targets의 각 요소를 돌며 key값이 존재하는지 확인 후
// 존재할 경우 눌린 키 횟수를 answer에 저장
// 한 번이라도 존재하지 않을 경우 -1를 answer에 저장
targets.map((target) => {
var count = 0;
var noKey = 0;
target.split('').map((targetData) => {
if(!(targetData in key)){
noKey = -1
}
if(key[targetData] !== undefined){
count += key[targetData]
}
})
if(noKey == -1 || count == 0) {
answer.push(-1)
}else{
answer.push(count)
}
})
return answer;
}
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] Lv.02 스킬트리 (JavaScript) (1) | 2024.06.05 |
---|---|
[프로그래머스] Lv.03 연습문제 [1차] 셔틀버스 (JavaScript) (1) | 2024.06.03 |
[프로그래머스] Lv.01 연습문제 둘만의 암호 (JavaScript) (0) | 2024.05.14 |
[프로그래머스] Lv.01 연습문제 명예의 전당(1) (JavaScript) (0) | 2024.05.10 |
[프로그래머스] Lv.01 연습문제 개인정보 수집 유효기간 (JavaScript) (0) | 2024.05.05 |