아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

문자열 생성 2

면접 대비

시간 제한1초메모리 제한128 MB

요약
남은 문자열의 맨 앞이나 맨 뒤 문자를 하나씩 골라 이어 붙일 때 만들 수 있는 가장 사전순으로 작은 문자열을 구한다. 양 끝이 같으면 안쪽을 비교해 결정한다.
난이도

보통10점 중 5점

유형
그리디, 투 포인터, 문자열, 구현
정답자
아직 제출이 없습니다

문제

NN개의 문자로 이루어진 문자열 SS가 주어진다. 이 문자열을 이루는 문자들을 사용하여 새로운 문자열 TT를 만들려고 한다.

TT는 SS가 빌 때까지 다음 두 가지 연산 중 하나를 반복하여 만든다.

  • SS의 맨 앞(왼쪽 끝) 문자 하나를 꺼내 TT의 맨 뒤에 붙인다.
  • SS의 맨 뒤(오른쪽 끝) 문자 하나를 꺼내 TT의 맨 뒤에 붙인다.

즉, 매 단계마다 아직 남아 있는 SS의 맨 앞 또는 맨 뒤에서 문자 하나를 골라 TT의 끝에 이어 붙인다. 이렇게 만들 수 있는 모든 TT 중에서 사전순으로 가장 앞서는(가장 작은) 문자열을 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 문자열 SS의 길이 NN이 주어진다. (N≤30000N \le 30000)

다음 NN개의 줄에 걸쳐 SS를 이루는 문자가 한 줄에 하나씩 순서대로 주어진다.

출력

만들 수 있는 문자열 중 사전순으로 가장 작은 문자열 TT를 출력한다.

단, 한 줄에 최대 80글자씩 출력한다. 즉 80글자를 출력할 때마다 줄을 바꾼다.

힌트

예를 들어 S=S= ACDBCB인 경우를 살펴보자. 매 단계에서 남아 있는 SS의 맨 앞 문자와 맨 뒤 문자를 비교하여, 더 작은 문자열을 만드는 쪽의 문자를 TT에 붙인다. 두 문자가 같으면 안쪽으로 한 글자씩 들어가며 처음으로 달라지는 위치를 비교해 더 작은 쪽 끝을 고른다.

  • 맨 앞 A < 맨 뒤 B 이므로 앞의 A를 붙인다. (남은 S=S= CDBCB, T=T= A)
  • 맨 뒤 B < 맨 앞 C 이므로 뒤의 B를 붙인다. (남은 S=S= CDBC, T=T= AB)
  • 양 끝이 모두 C이므로 안쪽 D와 B를 비교하면 뒤쪽이 작다. 뒤의 C를 붙인다. (남은 S=S= CDB, T=T= ABC)
  • 맨 뒤 B < 맨 앞 C 이므로 뒤의 B를 붙인다. (남은 S=S= CD, T=T= ABCB)
  • 맨 앞 C < 맨 뒤 D 이므로 앞의 C를 붙인다. (남은 S=S= D, T=T= ABCBC)
  • 남은 문자 D를 붙인다. (남은 SS 없음, T=T= ABCBCD)

따라서 답은 ABCBCD이다.

예제1

  1. 예제 1

    입력
    6
    A
    C
    D
    B
    C
    B
    
    예상 출력
    ABCBCD