[Python] BOJ 9081 - 단어 맞추기

728x90
반응형

https://www.acmicpc.net/problem/9081

 

9081번: 단어 맞추기

입력의 첫 줄에는 테스트 케이스의 개수 T (1 ≤ T ≤ 10)가 주어진다. 각 테스트 케이스는 하나의 단어가 한 줄로 주어진다. 단어는 알파벳 A~Z 대문자로만 이루어지며 항상 공백이 없는 연속된 알

www.acmicpc.net

# C++ STL에는 next_permutation 메소드가 있지만, java나 Python에는 존재하지 않아

   직접 구현을 해주었다.

 

# https://hanil0623.tistory.com/2 <- 구현은 이 블로그를 참조했다.

 

[C++ STL] next_permutation의 내부 구현 방법

백준 문제 중 다음 순열(https://www.acmicpc.net/problem/10972) 문제를 풀던 중 생긴 의문이다. dfs로 구현한 순열의 순서와 문제가 요구하는 순열의 순서가 다른 것이였다. 그래서 문제의 순서를 만족시키

hanil0623.tistory.com

 

* next_permutation함수

    1. k = -1로 설정하고 반복문을 돌며 s[i] < s[i+1]를 만족하는 최대 i를 찾아 k에 넣어준다.

        마지막까지 k가 -1이라면 문자열s가 오름차순이므로 사전순으로 정렬했을때 마지막 단어이다.

        따라서 False를 return해준다.

 

    2. k를 찾아주고 이번에는 마지막 인덱스부터 0번째 인덱스까지 반복문을 돌며 s[k]보다 큰 값(s[i])를

        찾아준다. s[k] < s[i]를 만족하는 i를 발견했으면 m에 i를 넣어주고 바로 break를 해준다.

 

    3. s[k]와 s[m]의 위치를 바꿔준 뒤, L에 s[0 : k+1]까지 넣어준다.

       그 뒤에 s[k+1: ]을 reverse해준 list를 extend해준뒤 L을 return해준다.

 

* 테스트케이스마다 문자열 s를 받아 next_permutaion(list(s))를 실행해준다.

   answer가 True이면 사전순으로 정렬한 다음 단어인 answer를 출력해주고

   False이면 마지막 단어이므로 s를 그대로 출력해준다.

 

import sys
input = sys.stdin.readline
def next_permutation(s):
k = -1
for i in range(len(s) - 1):
if s[i] < s[i+1]:
k = i
if k == -1:
return False
for i in range(len(s)-1, -1, -1):
if s[k] < s[i]:
m = i
break
s[k], s[m] = s[m], s[k]
L = s[ :k+1]
L.extend(list(reversed(s[k+1: ])))
return L
N = int(input())
for _ in range(N):
s = input().rstrip()
answer = next_permutation(list(s))
if answer:
print(''.join(answer))
else:
print(s)
728x90
반응형

문제풀이 | 카테고리의 다른 글

  • [Python] BOJ 16571 - 알파 틱택토  (1)
  • 2021.09.25
  • [Python] BOJ 15998 - 카카오머니  (0)
  • 2021.09.23
  • [Python] BOJ 14675 - 단절점과 단절선  (0)
  • 2021.09.17
  • [Python] BOJ 1913 - 달팽이  (0)
  • 2021.09.16
  • [Python] BOJ 1068 - 트리  (0)
  • 2021.09.15
    TAGS.

    Comments