문제
https://school.programmers.co.kr/learn/courses/30/lessons/155652?language=python3#
🐍파이썬
❌실패
def solution(s, skip, index):
answer = ''
for i in s:
add = 0
arr = [chr(96+(ord(i)+j+1) % ord("z")) if ord(i)+j+1 > ord("z") else chr((ord(i)+j+1)) for j in range(index)]
for w in skip:
add += arr.count(w)
st = ord(i) + index + add
if st > ord("z"):
answer += chr(96 + st % ord("z"))
else:
answer += chr(st)
return answer
테스트는 통과했으나 히든 케이스 테스트에서 1, 2 제외하고 모두 실패가 뜬 코드...
%로 z를 넘어갔을 때를 처리하려 했는데 실패했다.
def solution(s, skip, index):
answer = ''
for alp in s:
loop = index
while loop:
alp = chr(ord(alp)+1)
if ord(alp) > ord("z"):
alp = "a"
if alp in skip:
loop += 1
loop -= 1
answer += alp
return answer
1️⃣ s의 한 글자마다 while문 반복
2️⃣ while문에서는 글자의 아스키 코드를 통해 다음 글자를 차례대로 확인한다. 만약 글자가 z를 넘어간다면 a로 다시 세팅해줌으로써 소문자 범위를 벗어나는 것을 방지한다.
3️⃣ 글자가 skip에 포함되어 있다면 주어진 index 범위 밖의 글자를 더 확인해야 하므로 loop의 값을 1 증가시켜 반복횟수를 증가시켜 준다.
4️⃣ while문은 loop의 수만큼 반복되는데, 매번 while문에 들어가기 전 loop를 index값으로 세팅해 기본적으로 index번의 반복을 시행하도록 해준다.
5️⃣ for문의 각 반복이 끝날 때마다 연산을 통해 구한 글자를 answer에 추가한다.
6️⃣ 마지막으로 answer을 리턴한다.
다른 풀이 방법
from string import ascii_lowercase
def solution(s, skip, index):
result = ''
a_to_z = set(ascii_lowercase)
a_to_z -= set(skip)
a_to_z = sorted(a_to_z)
l = len(a_to_z)
dic_alpha = {alpha:idx for idx, alpha in enumerate(a_to_z)}
for i in s:
result += a_to_z[(dic_alpha[i] + index) % l]
return result
❗참고
string.ascii_lowercase
- output: abcdefghijklmnopqrstuvwxyz
1️⃣ abcdefghijklmnopqrstuvwxyz에서 skip의 값을 빼고 정렬한다.
2️⃣ dic_alpha에 {알파벳: 인덱스}의 형태로 1️⃣의 결과를 삽입한다.
3️⃣ s의 각 글자를 이용해 1️⃣의 인덱스를 구해 result에 삽입한다. 이때 순회를 위해 나머지 연산자로 전체 배열의 길이를 나눈 값을 사용한다.
def solution(s, skip, index):
atoz = ['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']
for i in skip:
atoz.remove(i)
ans = ''
for i in s:
ans += atoz[(atoz.index(i)+index)%len(atoz)]
return ans
위의 풀이방법과 유사한 방식
def solution(s, skip, index):
alphas = [chr(a) for a in range(ord("a"), ord("z")+1) if chr(a) not in skip]
return "".join([alphas[(alphas.index(a) + index) % len(alphas)] for a in s])
1️⃣ alphas에 skip의 원소를 제외한 모든 소문자를 담는다.
2️⃣ s의 각 글자를 이용해 인덱스를 구해 배열에 넣는다. 이때 순회를 위해 나머지 연산자로 전체 배열의 길이를 나눈 값을 사용한다.
🐥자바스크립트
function solution(s, skip, index) {
let answer = "";
let alp = 'abcdefghijklmnopqrstuvwxyz';
for(let i of skip){
alp = alp.replace(i, "");
}
let arr = alp.split("");
for(let j of s){
answer += arr[(arr.indexOf(j) + index) % arr.length];
}
return answer;
}
1️⃣ skip에 포함된 모든 문자를 제거해 배열 arr를 생성
2️⃣ arr에서 s의 각 문자와 동일한 문자의 인덱스를 찾는다. 이 인덱스에 index 값를 더한 뒤 arr의 길이만큼 순회하도록 나머지 연산을 진행하여 arr의 인덱스 지정
3️⃣ 2️⃣에서 찾은 인덱스의 문자를 answer에 추가
다른 풀이 방법
function solution(s, skip, index) {
const alphabet = ["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"].filter(c => !skip.includes(c));
return s.split("").map(c => alphabet[(alphabet.indexOf(c) + index) % alphabet.length]).join("");
}
filter()와 map() 사용한 풀이
const solution = (s, skip, index) => {
let ans = '';
const matched = 'abcdefghijklmnopqrstuvwxyz'.match(
new RegExp(`[^${skip}]`, 'g'),
);
for (const c of s) {
const newIdx = matched.indexOf(c) + index;
ans += matched[newIdx % matched.length];
}
return ans;
};
정규식 이용한 풀이
❗참고
match()
문자열이 정규식과 매치되는 부분을 검색하는 함수. str.match() 형태로 사용한다.
일치하는 것이 있으면 일치하는 전체 문자열을 첫 번째 요소로 포함하는 Array와 캡처결과(index, input)를 반환, 없으면 null을 반환한다.
var str = 'For more information, see Chapter 3.4.5.1'; var re = /see (chapter \d+(\.\d)*)/i; var found = str.match(re); console.log(found); // 결과: [ 'see Chapter 3.4.5.1', // 'Chapter 3.4.5.1', // '.1', // index: 22, // input: 'For more information, see Chapter 3.4.5.1' ]
위의 풀이코드에 사용된 match()의 실행결과는 아래와 같다.
... const matched = 'abcdefghijklmnopqrstuvwxyz'.match( new RegExp(`[^${skip}]`, 'g'), ); console.log(matched); /* 실행결과 ['a', 'c', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'v', 'x', 'y', 'z'] */ ...
'Problem Solving > 프로그래머스' 카테고리의 다른 글
[프로그래머스 | 파이썬 / 자바스크립트] 배열 뒤집기(코딩테스트 입문/ level 0) (0) | 2023.02.23 |
---|---|
[프로그래머스 | 파이썬 / 자바스크립트] 삼각형의 완성조건 (2)(코딩테스트 입문/ level 0) (0) | 2023.02.23 |
[프로그래머스 | 파이썬 / 자바스크립트] 모음제거(코딩테스트 입문/ level 0) (0) | 2023.02.22 |
[프로그래머스 | 파이썬 / 자바스크립트] 순서쌍의 개수(코딩테스트 입문/ level 0) (0) | 2023.02.22 |
[프로그래머스 | 파이썬 / 자바스크립트] 안전지대(코딩테스트 입문/ level 0) (0) | 2023.02.22 |
[프로그래머스 | 파이썬 / 자바스크립트] 자릿수 더하기(코딩테스트 입문/ level 0) (0) | 2023.02.21 |