문제 링크

문제 설명

atcoder 나 abcde는 diverse word이다. 하지만, hello는 아니다. 왜냐하면 l이 두번 쓰였기 때문이다. 한 문장에 딱 알파벳 하나씩만 쓰인게 diverse word이다. atcoder라는 diverse word가 주어졌을때 사전적 순서로 바로 다음에 올거는 atcoderb이다.abcde다음에는 abcdef가 온다. 아무튼, 주어진 diverse word다음에 사전적 순서로 오게될 string을 출력하면된다.

예시

[input]
atcoder

[output]
atcoderb

[input]
abc

[output]
abcd


[input]
zyxwvutsrqponmlkjihgfedcba

[output]
-1

[input]
abcdefghijklmnopqrstuvwzyx

[output]
abcdefghijklmnopqrstuvx

사고의 흐름

그 s의 len이 26보다 작으면 그냥 안쓴 알파벳중에 제일 큰거(a > b)를 뒤에 붙여서 출력하면 되는데,, len이 26이면 모든 알파벳을 다 쓴거니까 좀 복잡해진다. 모든 알파벳을 순서로 바꿔서 a가 제일 크고 z가 제일 작도록 하면, 26 ~ 1이 된다. zyxwvutsrqponmlkjihgfedcba 와 같은 경우에는 모든게 오름차순이니까 -1을 출력. 아 그러면 이 경우만 특별하게 쳐주자. abcdefghijklmnopqrstuvwzyx 같은 경우에도 w이후에 더이상 섞어서 작게 만들 수 없기 때문에 abcdefghijklmnopqrstuvx 가 온건데, 이런 경우도 특별하게 쳐주자. 세상에 알파벳이 5개만 있다고 가정했을때, a b c d e 다음에는 a b c e d이다. 인즉, 알파벳을 숫자로 바꿔서 5 4 3 2 1로 만들고, 이거를 루프 돌려서 모든게 내림차순이면 맨 마지막이랑 그 전마지막이랑 swap을 해줘야겠다…라고 생각을 했는데 이런식이면 매우 복잡해진다. 그래서 몇가지 경우를 더 고려하다가 결국 답을 봤다.

——(답을 보고 내생각인척 적는 글)——

모범답안

1. 여기를 누르면 답이 보입니다
if len(S) == 26:
        # abc = [chr(i) for i in range(97, 123)]
        # print(S)
        for i in range(25, -1, -1):
            for j in range(25, i, -1):
                # print(i, j, S[i], S[j])
                if S[i] < S[j]:
                    ans = S[:i] + [S[j]]
                    printlist(ans, '')
                    return
 
        print(-1)
2. 여기를 누르면 답이 보입니다