일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- SWEA
- 구현
- 백준
- 조합
- 우선순위큐
- 플로이드 와샬
- 투 포인터
- 투포인터
- 이분탐색
- 2019 KAKAO BLIND RECRUITMENT
- 트라이
- 2020 KAKAO BLIND RECRUITMENT
- Spring
- BFS
- 최소 신장 트리
- 로봇 청소기
- 스택
- 2020 카카오 인턴십
- 백트래킹
- 2018 KAKAO BLIND RECRUITMENT
- 크루스칼
- 파이썬
- 시뮬레이션
- 비트마스킹
- 브루트포스
- 플로이드와샬
- 다익스트라
- GIT
- 2021 KAKAO BLIND RECRUITMENT
- 프로그래머스
- Today
- Total
개발조아
[BOJ/백준] 16719 ZOAC 파이썬 본문
문제 링크 : https://www.acmicpc.net/problem/16719
16719번: ZOAC
2018년 12월, 처음 시작하게 된 ZOAC의 오프닝을 맡은 성우는 누구보다 화려하게 ZOAC를 알리려 한다. 앞 글자부터 하나씩 보여주는 방식은 너무 식상하다고 생각한 성우는 문자열을 보여주는 새로
www.acmicpc.net
나는 진행을 거꾸로했다.
완성된 문자열에서 하나씩 지워가면서 체크했다.
문자를 중간에 끼워넣고 하는 아이디어가 잘안떠올라서 그냥 거꾸로 진행했다.
처음에는 입력으로 들어온 문자열을 가지고 시작하며 정답 배열에 입력 문자열을 저장해놓자.
다음부터는 결과의 마지막 문자열을 가지고 수행한다.
우선 현재 문자열을 리스트로 바꿔서 두개의 리스트에 저장했다.
하나는 현재 기준으로 문자 하나를 뺐을 때 사전순으로 가장 먼저오는 단어를 저장한 것이다. 이를 가지고 비교를 해서 갱신한다.
두번째는 위의 배열과 비교할 배열이다.
첫번째를 A 두번째를 B라고 해보자
입력이 ABC가 들어왔다고 해보자.
처음에는 가장 앞의 단어를 지운다.
그래서 A는 ['',B,C], B는 [A,B,C]가 된다.
다음 두번째부터는 B에서 문자를 지우고 A와 비교한다.
두번째 문자를 지워보자
A : ['',B,C] -> BC
B : [A,'',C] -> AC
B의 문자가 A보다 사전순으로 앞서니 A를 B의 형태로 바꾸고 B는 원래대로 돌려놓자.
그럼 A는 [A,'',C]가 된다.
다음은 세번째 문자를 지워보자
A : [A,'',C] -> AC
B : [A,B,''] -> AB
B의 문자가 A보다 사전순으로 앞서니 A를 B의 형태로 바꾸고 B는 원래대로 돌려놓자.
그럼 A는 [A,B,'']가 된다.
끝에 까지 도달했다면
A 배열을 문자열로 바꿔서 정답 배열에 저장하자.
그럼 다음 문자열은 AB가 되고 위의 과정을 다시 수행하면 된다.
그럼 정답 배열에는 [ABC,AB,A]가 저장될 것이다.
이를 역으로 출력하면 정답이 된다.
그리고 맨 마지막에는 공백 문자가 들어가게 되므로 반복문 길이를 하나 줄이던가 출력시 하나 건너띄고 출력하면 된다.
alpha = input().strip()
def solv():
answer_list = [alpha]
answer = alpha
for _ in range(len(answer)):
tmp1 = list(answer)
tmp2 = list(answer)
target_idx = -1
for idx in range(len(answer)):
if target_idx == -1:
tmp1[idx] = ''
target_idx = idx
else:
tmp2[idx] = ''
str_tmp1,str_tmp2 = ''.join(tmp1),''.join(tmp2)
if sorted((str_tmp1, str_tmp2))[0] == str_tmp2:
tmp1[target_idx] = answer[target_idx]
tmp1[idx] = ''
target_idx = idx
tmp2[idx] = answer[idx]
answer = ''.join(tmp1)
answer_list.append(answer)
answer_list.reverse()
for ans in answer_list[1:]:
print(ans)
solv()