문제
https://school.programmers.co.kr/learn/courses/30/lessons/17684
🐍파이썬
def solution(msg):
answer = []
dic = {chr(i+ord("A")-1):i for i in range(1, 27)}
idx = 27
checkMsg = "" #w
for i in msg:
checkMsg += i #w+c
if checkMsg not in dic:
answer.append(dic[checkMsg[:-1]])
dic[checkMsg] = idx
idx += 1
checkMsg = checkMsg[-1]
answer.append(dic[checkMsg])
return answer
1️⃣ 컴프리헨션을 통해 {"A":1, "B":2, ..., "Z":26} 의 dictionary를 생성한다.
2️⃣ checkMsg에 msg의 글자 하나를 추가한다. checkMsg가 dic에 존재하면 바로 다음 글자를 checkMsg에 덧붙인다.
3️⃣ checkMsg가 dic에 존재하지 않으면 글자를 추가하기 이전까지의 단어 인덱스(현재 입력된 문자열과 일치하는 가장 긴 문자열)를 dic에서 찾아 추가한다.
4️⃣ checkMsg+추가한 글자가 사전에 존재하지 않는 상태이기 때문에, 이 문자열을 사전에 추가하고 다음에 올 원소를 위해 인덱스를 하나 늘린다.
5️⃣ checkMsg값은 checkMsg의 마지막 글자로 초기화한다.
6️⃣ for문이 종료된 후 checkMsg에 저장된 마지막 글자의 인덱스를 dic에서 찾아 answer에 추가한다.
(참고한 풀이: https://e-you.tistory.com/123)
다른 풀이 방법
def solution(msg):
alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
d = {k:v for (k,v) in zip(alphabet, list(range(1,27)))}
answer = []
while True:
if msg in d: #처리되지 않은 글자 처리
answer.append(d[msg])
break
for i in range(1, len(msg)+1):
if msg[0:i] not in d: #msg[0:i]가 사전에 없다면
answer.append(d[msg[0:i-1]]) #한 글자 이전의 문자열을 answer에 추가
d[msg[0:i]] = len(d)+1 #msg[0:i]를 사전에 등록
msg = msg[i-1:] #answer에 등록된 문자열은 입력에서 삭제
break
return answer
🐥자바스크립트
function solution(msg) {
var answer = [];
let dic = {};
for(let i = 1; i <= 26; i++){
dic[String.fromCodePoint(64+i)] = i
}
let checkMsg = "";
let idx = 27;
for(let i of msg){
checkMsg += i;
if(Object.keys(dic).includes(checkMsg) === false){
answer.push(dic[checkMsg.slice(0, checkMsg.length -1)]);
dic[checkMsg] = idx
idx += 1
checkMsg = checkMsg[checkMsg.length-1];
}
}
answer.push(dic[checkMsg]);
return answer;
}
파이썬 풀이와 동일하게 풀었다.
1️⃣ {"A":1, "B":2, ..., "Z":26} 의 dictionary를 생성한다.
2️⃣ checkMsg에 msg의 글자 하나를 추가한다. checkMsg가 dic에 존재하면 바로 다음 글자를 checkMsg에 덧붙인다.
3️⃣ checkMsg가 dic에 존재하지 않으면 글자를 추가하기 이전까지의 단어 인덱스(현재 입력된 문자열과 일치하는 가장 긴 문자열)를 dic에서 찾아 추가한다.
4️⃣ checkMsg+추가한 글자가 사전에 존재하지 않는 상태이기 때문에, 이 문자열을 사전에 추가하고 다음에 올 원소를 위해 인덱스를 하나 늘린다.
5️⃣ checkMsg값은 checkMsg의 마지막 글자로 초기화한다.
6️⃣ for문이 종료된 후 처리되지 않은 마지막 글자의 인덱스를 dic에서 찾아 answer에 추가한다.
💡 참고
자바스크립트 아스키코드➡문자 변환
2. 객체에 특정 키(속성)가 존재하는지 확인하는 방법
https://leftday.tistory.com/81
3. 문자열 자르기
다른 풀이 방법
function solution(msg) {
var list = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
var dic = list.reduce((d, a, i) => (d[a] = i + 1, d), {})
var result = [];
var maxLen = 1;
for (var i = 0; i < msg.length; i++) {
var w = msg[i]; //현재 입력
var c = msg[i+1]; //다음 글자
//w+c가 존재하고 i가 msg길이-1보다 작을 때(msg[i+1]이 인덱스 범위를 벗어나지 않게 처리)
while (dic[w+c] && i < msg.length - 1) {
i++;
w = w+c; //일치하는 가장 긴 문자열
c = msg[i+1]; //현재 글자의 다음 글자를 가리킴
}
result.push(dic[w]); //정답 배열에 문자열 인덱스 추가
list.push(dic[w+c]);
dic[w+c] = list.length; //사전에 새로운 문자열 추가
}
return result;
}
var dic = list.reduce((d, a, i) => (d[a] = i + 1, d), {})
초기값을 dictionary로 만들고 사전에 (현재 원소값:인덱스+1)을 저장하여 {"A":1, "B":2, ..., "Z":26} 형태의 dictionary를 생성한다.
💡 참고
reduce 활용(https://www.zerocho.com/category/JavaScript/post/5acafb05f24445001b8d796d)
'Problem Solving > 프로그래머스' 카테고리의 다른 글
[프로그래머스 | 파이썬 / 자바스크립트] [3차] 파일명 정렬(2018 KAKAO BLIND RECRUITMENT / level 2) (0) | 2023.03.15 |
---|---|
[프로그래머스 | 파이썬 / 자바스크립트] 덧칠하기(연습문제 / level 2) (0) | 2023.03.12 |
[프로그래머스 | 파이썬 / 자바스크립트] 겹치는 선분의 길이(코딩테스트 입문/ level 0) (0) | 2023.03.12 |
[프로그래머스 | 파이썬 / 자바스크립트] 롤케이크 자르기(연습문제/ level 2) (0) | 2023.03.11 |
[프로그래머스 | 파이썬 / 자바스크립트] 영어가 싫어요(코딩테스트 입문/ level 0) (0) | 2023.03.10 |
[프로그래머스 | 파이썬 / 자바스크립트] 오픈채팅방(2019 KAKAO BLIND RECRUITMENT/ level 2) (2) | 2023.03.06 |