cording test

LV.1 둘만의 암호

JM Lee 2023. 5. 3. 15:49
728x90

코딩테스트 연습 - 둘만의 암호 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

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

programmers.co.kr

 

이번 문제는 정말 배울 게 많은 문제였다.

 

팀원에게 설명하면서 스스로도 생각을 많이 해보고, 다른 사람의 코드를 보면서도 많이 배운 문제였다.

# 네비게이터로 참여한 문제

# 팀원 분의 문제 접근 방식
    # 문자열skip에 포함되어 있는 알파벳은 순서에서 제외
    # 문자열s의 각 알파벳 판별 for문
    # index만큼의 뒷순서 알파벳으로 반환
    # z를 넘어가면 다시 a부터 시작
    # 결과값 리턴

def solution(s, skip, index):
    alphabet = 'abcdefghijklmnopqrstuvwxyz'
    answer = ''
    # 빈 문자열에 정답을 하나씩 덧붙이는 형식! 자주 써먹었지
    
    for j in skip:
        if j in alphabet:
            alphabet = alphabet.replace(j,'')
    # 스킵 안에 있는 알파벳들을 점프시키기 위해
    # alphabet 문자열에서 스킵 문자열을 제거해주는 과정(for문을 이용한 replace 함수)
    
    for i in s:
        # alphabet[alphabet.index(i)]  = i
        n = alphabet[(alphabet.index(i) + index)%len(alphabet)]
        answer += n
    # s 안의 알파벳들을 index만큼 더해주는 작업
    # 문자열 index를 이용해서 더해주는 작업
    # + 그러나 alphabet 문자열은 범위 한계가 존재
    # (index) 나누기 (alphabet 문자열 길이) 식을 통해서
    # 몫은 몇 바퀴를 돌았다는 뜻이니까 몫은 버리고
    # 나머지 값이 제대로 된 index를 의미하기 때문에 % 연산자 사용
    
    return answer

 

아스키코드라는 것이 있다는 것을 이번에 알았다.

그래서 이 참에 공부하려고 켰는데.. 생각보다 내용이 많아서 금방 정리가 안 될 것 같다.

# ascii 함수를 이용한 작업

import string

def solution(s, skip, index):
    alphabet = string.ascii_lowercase
    # alphabet = 'abcdefghijklmnopqrstuvwxyz'
    answer = ''
    for j in skip:
        if j in alphabet:
            alphabet = alphabet.replace(j,'')
    for i in s:
        # alphabet[alphabet.index(i)]  = i
        n = alphabet[(alphabet.index(i) + index)%len(alphabet)]
        answer += n
    return 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)}
    # dic_alpha라는 dic 생성
    # alpha 라는 key값, idx라는 value값 생성
    # a_to_z 리스트에서 alpha(key)와 index(value)를 동시에 순차적으로 꺼내오기(enumerate 함수)

    for i in s:
        result += a_to_z[(dic_alpha[i] + index) % l]
    # s에서 문자를 하나씩 빼내어 자연수(index)를 더해주는 작업. 마찬가지로 나누기 len(a_to_z)

    return result

 

'cording test' 카테고리의 다른 글

LV.2 괄호 회전하기  (0) 2023.05.07
LV.1 예산  (0) 2023.05.07
LV.1 비밀지도/ 파이썬 bin함수 / zfill 함수  (0) 2023.05.02
LV.2 최댓값과 최솟값  (4) 2023.04.28
LV.1 피보나치 수  (2) 2023.04.27