본문 바로가기
코딩테스트/프로그래머스

프로그래머스 | Python | 단순구현 | 둘만의 암호 (Lv.1)

by RuntimeSimple 2025. 2. 27.

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

코드

def solution(s, skip, index):
    answer = ''

    # 1. 사용 가능한 알파벳 리스트 생성
    alphabets = [chr(i) for i in range(ord('a'), ord('z') + 1)]  # 알파벳 a-z
    available = [char for char in alphabets if char not in skip]  # skip 제외

    # 2. 각 문자 변환
    for char in s:
        current_pos = available.index(char)  # 현재 문자 위치
        new_pos = (current_pos + index) % len(available)  # index 만큼 이동 후 순환 처리
        answer += available[new_pos]  # 변환된 문자 추가

    return answer

 


코드 해설

1. 알파벳 리스트 생성

alphabets = [chr(i) for i in range(ord('a'), ord('z') + 1)]
  • ord('a')부터 ord('z')까지의 정수 값을 이용하여 'a'에서 'z'까지의 알파벳 리스트를 생성합니다.
    •   예: ['a', 'b', 'c', ..., 'z']

2. skip에 포함된 알파벳 제외

available = [char for char in alphabets if char not in skip]
  • alphabets에서 skip에 포함되지 않은 알파벳만 선택하여 available 리스트를 생성합니다.
    •   예: alphabets = ['a', 'b', 'c', ..., 'z']
    •   skip = "wbqd"
    •   available = ['a', 'c', 'e', ..., 'z'] (w, b, q, d가 제외됨)

3. 문자 변환

for char in s:
    current_pos = available.index(char)  # 현재 위치
    new_pos = (current_pos + index) % len(available)  # index만큼 이동
    answer += available[new_pos]  # 변환된 문자 추가
  • 문자열 s의 각 문자를 처리:
    1. 현재 문자 위치:
      •   available.index(char): char의 현재 위치를 구함.
    2. 새로운 위치 계산:
      •   (current_pos + index) % len(available): 알파벳을 index만큼 뒤로 이동, z를 넘어가면 다시 a로 돌아감.
    3. 변환된 문자 추가:
      •   새로운 위치의 문자를 answer에 추가.

4. 최종 결과 반환

return answer
  • 변환이 완료된 문자열을 반환.

입출력 예제 분석

예제 1

  • 입력: s = "aukks", skip = "wbqd", index = 5
  • 과정:
    1. available = ['a', 'c', 'e', 'f', 'g', 'h', ..., 'z']
    2. s의 각 문자 변환:
      •   'a' → 'h' (a에서 5번째 → h)
      •   'u' → 'a' (u에서 5번째 → a)
      •   'k' → 'p' (k에서 5번째 → p)
      •   'k' → 'p' (k에서 5번째 → p)
      •   's' → 'y' (s에서 5번째 → y)
    3. 결과: "happy"
  • 출력: "happy"

핵심 포인트

  1. 알파벳 리스트 생성 및 변환:
    •   ord와 chr를 활용하여 알파벳 리스트를 생성하고, skip에 포함되지 않은 알파벳만 사용.
  2. 순환 이동:
    •   (current_pos + index) % len(available)로 알파벳이 끝을 넘어갈 경우 순환 처리.
  3. 알고리즘:
    •   문자열 순회 및 변환에 O(n) (n: 문자열 길이).
    •   available.index는 O(1)로, 전체 시간 복잡도는 O(n).

문제의 출제 의도

  • 문자열 처리와 반복 이동:
    •   주어진 규칙에 따라 문자열을 변환하는 문제로, Python의 문자열 관련 함수를 잘 활용하는 것이 중요.
  • 리스트 활용 및 효율성 고려:
    •   알파벳 리스트 생성, 순환 이동, 특정 조건에 따른 제외 처리 등 리스트 조작 능력을 테스트.

관련 문법

  1. ord, chr:
    •   문자를 아스키 코드와 정수 값으로 상호 변환.
  2. 리스트 내포:
    •   [char for char in alphabets if char not in skip]
  3. 모듈 연산:
    •   (current_pos + index) % len(available)로 순환 이동 처리.