만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

신용카드 번호 복원

면접 대비

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

요약
16자리 암호화된 수가 주어질 때, 최솟값을 1 올리고 최댓값을 1 내린 뒤 자리를 바꾸는 규칙으로 이 수를 만들 수 있는 원래 카드 번호를 모두 사전순으로 출력하고, 없으면 banana를 출력한다.
난이도

보통10점 중 5점

유형
완전 탐색, 구현, 문자열, 시뮬레이션
정답자
아직 제출이 없습니다

문제

마르코는 상용 고객 클럽 회원으로 마일리지를 많이 모아, 마침내 호주 여행을 가기로 했다. 그런데 흔히 그렇듯 마일리지로 여행 경비를 전부 낼 수는 없었고, 항공사 직원이 전화를 걸어 신용카드 번호(숫자 16개로 이루어진 문자열)를 이메일로 보내 달라고 부탁했다.

마르코는 이것이 말도 안 되는 요구라고 생각했지만 직원이 계속 고집을 부리자, 절충안으로 다음 알고리즘으로 카드 번호를 암호화해서 보내겠다고 제안했다.

  • 번호에서 가장 작은 숫자를 찾는다. 같은 값이 여러 개면 그중 가장 왼쪽에 있는 것을 고른다. 이 숫자를 A라고 하자.
  • 번호에서 가장 큰 숫자를 찾는다. 같은 값이 여러 개면 그중 가장 오른쪽에 있는 것을 고른다. 이 숫자를 B라고 하자.
  • A가 9가 아니면 A를 1 늘린다. 이미 9이면 그대로 둔다.
  • B가 0이 아니면 B를 1 줄인다. 이미 0이면 그대로 둔다.
  • 마지막으로 A와 B의 자리를 서로 바꾼다.

예를 들어 카드 번호가 7691002779603269이면, 마르코가 이메일로 보내는 번호는 7691802779603261이다.

항공사 직원이 마르코의 신용카드 번호를 알아낼 수 있도록 도와주는 프로그램을 작성하시오.

입력

첫째 줄에 마르코가 이메일로 보낸 번호가 주어진다. 이 번호는 0부터 9까지의 숫자 16개로 이루어진 문자열이다.

카드 번호는 숫자 0으로 시작할 수 있다.

출력

마르코의 신용카드 번호로 가능한 번호를 모두 한 줄에 하나씩, 사전순으로 오름차순 정렬해 출력한다. 같은 번호를 두 번 출력하지 않는다.

가능한 번호가 하나도 없으면 banana를 출력한다.

예제3

  1. 예제 1

    입력
    7691802779603261
    
    예상 출력
    7691002779603269
    
  2. 예제 2

    입력
    8381950005575690
    
    예상 출력
    banana
    
  3. 예제 3

    입력
    8446462287549826
    
    예상 출력
    1446462287549896
    8446462217549896
    8446462287549196