반응형
문제
https://school.programmers.co.kr/learn/courses/30/lessons/160586
🐍파이썬
def solution(keymap, targets):
answer = [0] * len(targets)
dic = {}
for i in keymap:
for j in i:
if j in dic: #keymap의 알파벳을 key로 하는 dict 원소가 존재한다면
if dic[j] > i.index(j)+1: #현재 인덱스보다 멀리 있는 키라면
dic[j] = i.index(j)+1 #현재 인덱스로 값 변경
else:
dic[j] = i.index(j)+1
for i in range(len(targets)):
for j in targets[i]:
if j in dic: #targets의 알파벳을 key로 하는 dict 원소가 존재한다면
answer[i] += dic[j] #키의 value값을 더해 터치수 늘리기
else: #targets의 알파벳을 key로 하는 dict 원소가 존재하지 않는다면
answer[i] = -1 #-1을 넣어주고 종료
break
return answer
다른 풀이 방법
def solution(keymap, targets):
answer = []
#최솟값 저장
alpha = [101 for i in range(26)] #알파벳 개수만큼 배열 생성
for i in keymap:
for idx, j in enumerate(i):
k = ord(j)-ord('A') #알파벳 'A'와의 거리를 숫자로 저장
alpha[k] = min(alpha[k],idx+1) #현재 값, idx+1값 중 더 작은 값 저장(더 가까이 있는 키)
for i in targets:
total = 0
for j in i:
cnt = alpha[ord(j) - ord('A')] #j와 알파벳 'A'의 거리를 기반으로 alpha 배열 값을 변수 cnt에 저장
if cnt == 101: #keymap에 존재하지 않는 알파벳일 경우
answer.append(-1)
break
else:
total += cnt
else: #for-else문: for문이 break 등으로 중간에 빠져나오지 않고 끝까지 실행됐을 경우 else문 실행
answer.append(total)
return answer
💡 for-else문
for문이 break 등으로 중간에 빠져나오지 않고 끝까지 실행됐을 경우 else문 실행
🐥자바스크립트
function solution(keymap, targets) {
var answer = Array(targets.length).fill(0);
let dic = {};
for(let i of keymap){
for(let j of i){
if(j in dic){ //keymap의 알파벳을 key로 하는 dict 원소가 존재한다면
dic[j] = Math.min(dic[j], i.indexOf(j) + 1); //현재 값, idx+1값 중 더 작은 값 저장(더 가까이 있는 키)
} else {
dic[j] = i.indexOf(j) + 1;
}
}
}
for(let i = 0; i < targets.length; i++){
for(let j of targets[i]){
if(j in dic){ //targets의 알파벳을 key로 하는 dict 원소가 존재한다면
answer[i] += dic[j] //키의 value값을 더해 터치수 늘리기
} else { //targets의 알파벳을 key로 하는 dict 원소가 존재하지 않는다면
answer[i] = -1; //-1을 넣어주고 종료
break;
}
}
}
return answer;
}
다른 풀이 방법
function solution(keymap, targets) {
const answer = [];
const map = {}
for (const items of keymap) {
items.split('').map((item, index) => map[item] = (map[item] < index+1 ? map[item] : index+1))
}
for (const items of targets) {
answer.push(items.split('').reduce((cur, item) => cur += map[item], 0) || -1)
}
return answer;
}
1️⃣ keymap의 원소들을 split()하여 각 알파벳과 인덱스 값+1을 dic에 저장한다. value 저장 시 더 작은 수를 저장한다.
2️⃣ target의 원소들을 split()하여 각 알파벳에 해당하는 인덱스값을 cur에 누적해 더한다. 끝으로 이 값을 answer 배열에 push해주는데, 알파벳에 해당되는 key가 dic에 존재하지 않는다면 결과는 undefined가 되고 이는 false로 취급되어 or 뒤의 값인 -1을 push 한다.
반응형
'Problem Solving > 프로그래머스' 카테고리의 다른 글
[프로그래머스 | 파이썬 / 자바스크립트] 과일 장수(연습문제/ level 1) (0) | 2023.03.05 |
---|---|
[프로그래머스 | 파이썬] 더 맵게(힙(Heap)/ level 2) (0) | 2023.03.03 |
[프로그래머스 | 파이썬 / 자바스크립트] 주차 요금 계산(2022 KAKAO BLIND RECRUITMENT/ level 2) (0) | 2023.03.03 |
[프로그래머스 | 파이썬 / 자바스크립트] [1차] 뉴스 클러스터링(2018 KAKAO BLIND RECRUITMENT/ level 2) (0) | 2023.02.28 |
[프로그래머스 | 파이썬 / 자바스크립트] 연속 부분 수열 합의 개수(연습문제/ level 2) (0) | 2023.02.28 |
[프로그래머스 | 파이썬 / 자바스크립트] 이진수 더하기(코딩테스트 입문/ level 0) (0) | 2023.02.28 |