[Baekjoon] 16923/다음 다양한 단어/Python/파이썬/구현

·2025년 2월 26일
0

문제풀이

목록 보기
40/56
post-thumbnail

💡문제

다양한 단어란 모두 다른 알파벳 소문자로만 이루어진 단어를 의미한다. 예를 들어, "codeplus", "coding", "algorithm"은 다양한 단어, "baekjoon", "startlink"는 다양한 단어가 아니다.

다양한 단어 S가 주어졌을 때, 사전 순으로 S의 바로 다음에 오는 다양한 단어를 구해보자.

입력

첫째 줄에 길이가 26보다 작거나 같은 다양한 단어 S가 주어진다.

출력

사전 순으로 S의 바로 다음에 오는 다양한 단어를 출력한다. 바로 다음에 오는 단어가 없는 경우에는 -1을 출력한다.

예제입력

codeplus

예제출력

codeplusa

📖내가 작성한 Code

import sys

"""
모두 다른 알파벳 소문자로만 이루어진 단어.
26자리 이하
"""


def make_next_sentence(word):
    if len(word) < 26:
        for ch in 'abcdefghijklmnopqrstuvwxyz':
            if ch not in word:
                return word + ch

    for i in range(25, -1, -1):
        prefix = word[:i]
        for ch in "abcdefghijklmnopqrstuvwxyz":
            if ch > word[i] and ch not in prefix:
                return prefix + ch

    return '-1'


def main():
    inputs = sys.stdin.read().rstrip()
    sys.stdout.write(make_next_sentence(inputs))


if __name__ == "__main__":
    main()


✍️풀이과정

26자리 이하는 쉬운데 26자리에서 해맸다. 난 이렇게 구현 했지만, c++에는 다음 순열(next permutation) 알고리즘이 있다고 한다. 참고 바람

next permutation 관련 c++ 공식 문서

4등했는데도 먼가 찝찝함.


🧠 코드 리뷰

  1. 하드코딩된 인덱스 대신 동적 길이 사용 : 현재 26자리인 경우에 대해 range(25, -1, -1)와 같이 하드코딩되어 있습니다.
    입력 단어의 길이를 활용하면 코드가 더 일반적이고 읽기 쉬워집니다.
  2. 멤버십 검사 최적화 : 단어에 포함된 문자를 매번 if ch not in word 또는 if ch not in prefix로 확인하는데, 길이가 최대 26이므로 성능에는 큰 문제가 없지만, set으로 미리 변환해두면 의도를 명확하게 할 수 있습니다.
  3. 명확한 함수명 및 타입 힌트 추가 : 함수 이름과 변수명을 조금 더 직관적으로 바꾸고, 타입 힌트를 추가하면 가독성이 좋아집니다.

🛠️AI 개선 코드

import sys

ALPHABET = "abcdefghijklmnopqrstuvwxyz"

def next_diverse_word(word: str) -> str:
    """
    주어진 단어(word)가 모두 다른 알파벳 소문자로 이루어져 있을 때,
    사전 순으로 바로 다음에 오는 '다양한 단어'를 반환한다.
    만약 다음 단어가 존재하지 않으면 '-1'을 반환한다.
    """
    # 단어 길이가 26자리 미만이면, 사용하지 않은 가장 작은 문자를 뒤에 붙인다.
    if len(word) < 26:
        used = set(word)
        for ch in ALPHABET:
            if ch not in used:
                return word + ch

    # 단어가 26자리인 경우, 뒤에서부터 문자를 변경할 수 있는 위치를 찾는다.
    for i in range(len(word) - 1, -1, -1):
        prefix = word[:i]
        used_prefix = set(prefix)
        # 현재 위치의 문자보다 큰 문자 중, prefix에 없는 가장 작은 문자를 찾는다.
        for ch in ALPHABET:
            if ch > word[i] and ch not in used_prefix:
                return prefix + ch

    return "-1"


def main():
    word = sys.stdin.read().rstrip()
    result = next_diverse_word(word)
    sys.stdout.write(result)


if __name__ == "__main__":
    main()


💻결과

백준문제 보러가기


🖱️참고 링크

파이썬 문자열 자료형 참고

next permutation 관련 c++ 공식 문서

profile
우물 안에서 무언가 만드는 사람

0개의 댓글