코딩테스트 문제

[프로그래머스/Python] 둘만의 암호

왕초보코딩러 2024. 1. 10. 23:57
728x90

문제

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

 

프로그래머스

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

programmers.co.kr

 

스킵할 알파벳 제외 인덱스만큼 뒤의 알파벳으로 바꿔서 문자열로 리턴


 

chr() ord() 사용

chr(정수) -> 아스키코드 문자로 바꿔줌

ord(문자) -> 아스키코드 숫자로 바꿔줌

 

ord('a') #97
ord('z') #122
ord('A') #65
ord('Z') #90
#26개가 있음

a~z까지 아스키코드 숫자를 넣은 리스트 만들기

 

set() - set() 를 이용한 차집합

+ set를 이용한 집합 연산(and or 불가능)

합집합(세트1, 세트2에 있는 것 모두):  |

교집합(세트1, 세트2 둘 다에 있는 것):  &

차집합:  - 혹은 세트1.difference(세트2)

 

set([a~z까지 아스키코드 숫자를 넣은 리스트]) - set([skip에 있는 문자를 숫자로 바꾼 리스트])

 

def solution(s, skip, index):
    answer = ''
    
    # a~z까지 아스키코드 숫자로 바꾼 값을 리스트 al에 저장
    al = set([c for c in range(ord('a'), ord('z')+1)])
    skip = set([ord(c) for c in skip])
    al = list(al-skip) 	#차집합 이용
    
    for i in s:
        #인덱스 찾기
        idx = al.index(ord(i)) + index
        if idx >= len(al):
            #idx % len(al)
            idx = idx % (len(al))
        answer+=chr(al[idx])
    return answer