본문 바로가기
Problem Solving/프로그래머스

[프로그래머스 | 파이썬 / 자바스크립트] 대충 만든 자판(연습문제/ level 1)

by 청량리 물냉면 2023. 2. 28.
반응형
문제

https://school.programmers.co.kr/learn/courses/30/lessons/160586

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

🐍파이썬
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 한다.

반응형