문제
알파벳 소문자로 이루어진 단어를 가지고 아래와 같은 과정을 해 보려고 한다.
먼저 단어에서 임의의 두 부분을 골라서 단어를 쪼갠다. 즉, 주어진 단어를 세 개의 더 작은 단어로 나누는 것이다. 각각은 적어도 길이가 1 이상인 단어여야 한다. 이제 이렇게 나눈 세 개의 작은 단어들을 앞뒤를 뒤집고, 이를 다시 원래의 순서대로 합친다.
예를 들어,
- 단어 : arrested
- 세 단어로 나누기 : ar / rest / ed
- 각각 뒤집기 : ra / tser / de
- 합치기 : ratserde
단어가 주어지면, 이렇게 만들 수 있는 단어 중에서 사전순으로 가장 앞서는 단어를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 영어 소문자로 된 단어가 주어진다. 길이는 3 이상 50 이하이다.
출력
첫째 줄에 구하고자 하는 단어를 출력하면 된다.
예제 입력
mobitel
예제 출력
bometil
이 문제를 푸는데에는 문자열을 A/B/C형태로 쪼개되 한개 이상은 가지고 있어야 한다는 것을 생각하면서 접근했습니다.
for문이 3중으로 구성된 것 같지만 for문 첫번째인 i는 0 하나의 경우에만 돌기 때문에 사실상 2중 for문 입니다.
처음에 구현할 때 i도 순회를 해야한다고 생각했지만 그렇게 되면 i가 뒷 인덱스로 가면서 i 앞 인덱스에 해당하는 값들을 버리고 연산을 하게 된다는 것을 주석처리한 출력값을 보면서 알게 되었습니다. 그래서 첫번째 시작지점은 고정되어서 변하면 안 되는 것을 인지하고서 기존에 작성한 코드에서 i에 대한 for 문을 유지하고자 (0,1)로 하였습니다. 이 부분은 i를 변수로 0의 값을 할당해도 됩니다.
풀이
sentence = list(input())
solution = []
for i in range(0,1):
for j in range(1, len(sentence) - 1):
for k in range(j+1, len(sentence)):
# print(f'i,j,k는 {i},{j},{k} 이고 {sentence[i:j]}, {sentence[j:k]}, {sentence[k:]}')
part1 = list(reversed(sentence[i:j]))
part2 = list(reversed(sentence[j:k]))
part3 = list(reversed(sentence[k:]))
# print(part1, part2, part3)
newSentence = part1+part2+part3
solution.append(newSentence)
solution.sort()
print("".join(solution[0]))
'알고리즘 > 문제풀이' 카테고리의 다른 글
백준 2292번 벌집문제 - Python (0) | 2023.02.27 |
---|---|
백준 1018번 체스판 다시 칠하기 - Python (0) | 2023.02.27 |
백준 9012번 괄호문제 - Python (0) | 2023.02.24 |
백준 2164번 카드2 - Python (0) | 2023.02.24 |
백준 10816번 숫자카드 2 - Python (0) | 2023.02.23 |