본문 바로가기

코딩테스트 준비/프로그래머스

[프로그래머스] 시저 암호

반응형

 

 

 

안녕하세요~

27년차 진로탐색꾼 조녁입니다!!

1일 1코테 12일차!!!  오늘은 낼모레 SQLD 시험공부가 발에 불똥처럼 떨어져서.. 이제야 풀었다.

 

· 문제명 : 시저 암호

· 사용 언어 : Python3

· 난이도 : Level1 

· 문제 설명 

어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀면 "a"가 됩니다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.

 

· 제한 조건

  • 공백은 아무리 밀어도 공백입니다.
  • s는 알파벳 소문자, 대문자, 공백으로만 이루어져 있습니다.
  • s의 길이는 8000이하입니다.
  • n은 1 이상, 25이하인 자연수입니다.

· 입출력 예

s n result
"AB" 1 "BC"
"z" 1 "a"
"a B z" 4 "e F d"

 

오늘의 내 코드는 .. 정말 숨고 싶을 정도로 생각의 흐름대로 풀었다... 

그래도 어찌저찌 푼것에 만족하며, 밑에 다른분 코드를 통해 3가지나 배울 수 있었다. 

 

내가 푼 방법은 주어진 s를 딕셔너리를 통해 숫자로 바꾼 후 n만큼 더해줬다.

그리고나서 앞서 사용한 딕셔너리와 키-벨류값이 반대인 딕셔너리를 통해 다시 알파벳으로 바꿔줬다.

진짜 .. 초등학교때 "여러가지 문제푸는 방법"이라는 단원에서 어찌저찌 방정식안세우고 방정식과 비슷한 방식으로 푼 느낌이다.

(이것이 구몬의 힘인가?)

 

정답 코드(?)

def solution(s, n):
    answer=""
    
    #알파벳 -> 숫자로 변환할 딕셔너리
    alphabet = {"a":1,"b":2,"c":3,"d":4,"e":5,"f":6,"g":7,"h":8,"i":9,"j":10,"k":11,"l":12,"m":13,"n":14,"o":15,"p":16,"q":17,"r":18,"s":19,"t":20,"u":21,"v":22,"w":23,"x":24,"y":25,"z":0}
    ALPHABET = {"A":1,"B":2,"C":3,"D":4,"E":5,"F":6,"G":7,"H":8,"I":9,"J":10,"K":11,"L":12,"M":13,"N":14,"O":15,"P":16,"Q":17,"R":18,"S":19,"T":20,"U":21,"V":22,"W":23,"X":24,"Y":25,"Z":0}
    
    #숫자 -> 알파벳으로 변환할 딕셔너리
    alphabets = {1:"a",2:"b",3:"c",4:"d",5:"e",6:"f",7:"g",8:"h",9:"i",10:"j",11:"k",12:"l",13:"m",14:"n",15:"o",16:"p",17:"q",18:"r",19:"s",20:"t",21:"u",22:"v",23:"w",24:"x",25:"y",0:"z"}
    ALPHABETs = {1:"A",2:"B",3:"C",4:"D",5:"E",6:"F",7:"G",8:"H",9:"I",10:"J",11:"K",12:"L",13:"M",14:"N",15:"O",16:"P",17:"Q",18:"R",19:"S",20:"T",21:"U",22:"V",23:"W",24:"X",25:"Y",0:"Z"}
    
    
    for i in range(len(s)): 
    	#소문자
        if s[i] in alphabet:
            answer += alphabets[(alphabet[s[i]]+n)%26]
            
        #대문자
        elif s[i] in ALPHABET:
            answer += ALPHABETs[(ALPHABET[s[i]]+n)%26] 
            
        #공백  
        else:
            answer += s[i] 
            continue
            
    return answer

 

 

 

다른 분 코드

def solution(s, n):
   s = list(s)
   for i in range(len(s)):
        if s[i].isupper():
            s[i]=chr((ord(s[i])-ord('A')+ n)%26+ord('A'))
        elif s[i].islower():
            s[i]=chr((ord(s[i])-ord('a')+ n)%26+ord('a'))

   return "".join(s)

 

배운점 3가지

 

1. 문자열에 리스트 씌우면 리스트 된다.

eg)  list("str")  >>>  ["s","t","r"] 

 

2. 문자열 뒤에 .isupper() or .islower() 로 대문자 소문자가 맞는 지 Boolen 값으로 출력할 수 있다.

eg) "s".isupper >>> False 

 

3. 알파벳, 자음, 모음과 같은 character 에 대해서 ord() , chr() 로 순서 <-> 알파벳으로 상호 변환할 수 있다. (이걸 알았더라면 ,...)

eg) ord('a') >>> 97  ;  chr(97) >>> 'a'

 

 

https://link.coupang.com/a/rGILU

 

[한빛미디어]이것이 취업을 위한 코딩 테스트다 with 파이썬

COUPANG

www.coupang.com

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

반응형