⚡문제정보

나온지 얼마 안된 문제여서 흥미롭게 풀어봤습니다.

입출력 예시를 보면 직관적으로 감이 오는데
keymap과 target이 주어집니다.
키하나에 여러 문자가 할당된 경우에 동일한 키를 연속해서 누르면 할당순서대로 문자가 바뀐다는 것입니다.
ABACD 와 같은 형태의 키맵이있다면 한번 눌렀을때 A
두번은 B 세번은 A 이런식인거죠!
문제는 이렇게 키맵이 주어져있는데 최소한으로만 버튼을 눌러서 타겟값을 만들고싶다는 것입니다.
그리고 그와중에도 타겟값을 만들 수 없는 경우(모든 알파벳이 없으니 그런 경우도 있을 수 있겠죠?)
-1을 리턴해야하며 주어지는 키맵에 알파벳이 한개로 고유하지 않다는 조건이 있습니다.
이런 와중에 문제의 요구사항인 최소한의 클릭으로 값을 구하려면
1. 타겟값이 원하는 알파벳이 키맵에 있는지 빠르게 확인 가능해야한다.
2. 어떤 알파벳을 원할 때 그 알파벳에 접근할 수 있는 최단 거리를 알아야한다.
두 가지 조건을 만족시키는게 중요할거라 생각하고 Map 자료구조를 이용해
문제를 풀어줬습니다.
😑나의 풀이
function solution(keymap, targets) {
const map = new Map()
let answer = []
for(let i = 0 ; i < keymap.length ; i++) {
for(let j = 0 ; j < keymap[i].length ; j++) {
if(!map.has(keymap[i][j])) {
map.set(keymap[i][j] , j+1)
}
else {
map.set(keymap[i][j] , j < map.get(keymap[i][j]) ? j+1 : map.get(keymap[i][j]))
}
}
}
for(let i = 0 ; i<targets.length ; i++) {
let result = 0
for(let j = 0 ; j < targets[i].length ; j++) {
if(!map.has(targets[i][j]) ) {
result = -1
break
}
else {
result += map.get(targets[i][j])
}
}
answer.push(result)
}
return answer
}
간단한 논리로 제가 생각한 두 대전제를 만족하는 Map을 만들 수 있습니다.
우선 keymap을 순회하며 아직 한번도 만나지 않은 key라면 인덱스기준으로 매핑해줍니다.
이미 존재하는 키값이라면 현재 인덱스와 이전에 체크한 인덱스를 비교하여 더 작은 값으로 업데이트해줍니다.
그런 뒤 target배열을 순회하며
has메서드를 이용해 매치되는 키값이 없는 경우 -1을 할당하고 반복문에서 빠져나와줍니다.
만약 키값이 매치된다면 키값을 result에 더해주면 끝입니다.
'programmers' 카테고리의 다른 글
[Programmers Level 2] 모음사전 Javascript (0) | 2023.03.24 |
---|---|
[Programmers Level 2] 피로도 Javascript (0) | 2023.03.23 |
[Programmers Level 1] 덧칠하기 Javascript (0) | 2023.03.22 |
[Programmers Level 1] 바탕화면 정리 Javascript (0) | 2023.03.05 |
[Programmers Level 2 집합] [1차] 뉴스 클러스터링 Javascript (1) | 2023.01.19 |
⚡문제정보

나온지 얼마 안된 문제여서 흥미롭게 풀어봤습니다.

입출력 예시를 보면 직관적으로 감이 오는데
keymap과 target이 주어집니다.
키하나에 여러 문자가 할당된 경우에 동일한 키를 연속해서 누르면 할당순서대로 문자가 바뀐다는 것입니다.
ABACD 와 같은 형태의 키맵이있다면 한번 눌렀을때 A
두번은 B 세번은 A 이런식인거죠!
문제는 이렇게 키맵이 주어져있는데 최소한으로만 버튼을 눌러서 타겟값을 만들고싶다는 것입니다.
그리고 그와중에도 타겟값을 만들 수 없는 경우(모든 알파벳이 없으니 그런 경우도 있을 수 있겠죠?)
-1을 리턴해야하며 주어지는 키맵에 알파벳이 한개로 고유하지 않다는 조건이 있습니다.
이런 와중에 문제의 요구사항인 최소한의 클릭으로 값을 구하려면
1. 타겟값이 원하는 알파벳이 키맵에 있는지 빠르게 확인 가능해야한다.
2. 어떤 알파벳을 원할 때 그 알파벳에 접근할 수 있는 최단 거리를 알아야한다.
두 가지 조건을 만족시키는게 중요할거라 생각하고 Map 자료구조를 이용해
문제를 풀어줬습니다.
😑나의 풀이
function solution(keymap, targets) {
const map = new Map()
let answer = []
for(let i = 0 ; i < keymap.length ; i++) {
for(let j = 0 ; j < keymap[i].length ; j++) {
if(!map.has(keymap[i][j])) {
map.set(keymap[i][j] , j+1)
}
else {
map.set(keymap[i][j] , j < map.get(keymap[i][j]) ? j+1 : map.get(keymap[i][j]))
}
}
}
for(let i = 0 ; i<targets.length ; i++) {
let result = 0
for(let j = 0 ; j < targets[i].length ; j++) {
if(!map.has(targets[i][j]) ) {
result = -1
break
}
else {
result += map.get(targets[i][j])
}
}
answer.push(result)
}
return answer
}
간단한 논리로 제가 생각한 두 대전제를 만족하는 Map을 만들 수 있습니다.
우선 keymap을 순회하며 아직 한번도 만나지 않은 key라면 인덱스기준으로 매핑해줍니다.
이미 존재하는 키값이라면 현재 인덱스와 이전에 체크한 인덱스를 비교하여 더 작은 값으로 업데이트해줍니다.
그런 뒤 target배열을 순회하며
has메서드를 이용해 매치되는 키값이 없는 경우 -1을 할당하고 반복문에서 빠져나와줍니다.
만약 키값이 매치된다면 키값을 result에 더해주면 끝입니다.
'programmers' 카테고리의 다른 글
[Programmers Level 2] 모음사전 Javascript (0) | 2023.03.24 |
---|---|
[Programmers Level 2] 피로도 Javascript (0) | 2023.03.23 |
[Programmers Level 1] 덧칠하기 Javascript (0) | 2023.03.22 |
[Programmers Level 1] 바탕화면 정리 Javascript (0) | 2023.03.05 |
[Programmers Level 2 집합] [1차] 뉴스 클러스터링 Javascript (1) | 2023.01.19 |