[Java] Boj 13417: 카드 문자열

2025. 2. 22. 17:56·PS/Solve

문제

N장의 카드가 일렬로 놓여있다. 각 카드에는 알파벳이 하나씩 적혀있다. 태욱이는 가장 왼쪽에 있는 카드부터 차례대로 한 장씩 가져올 수 있다. 가장 처음에 가져온 카드는 자신의 앞에 놓는다. 그다음부터는 가져온 카드를 자신의 앞에 놓인 카드들의 가장 왼쪽, 또는 가장 오른쪽에 놓는다. 태욱이는 모든 카드를 다 가져온 후에 자신의 앞에 놓인 카드를 순서대로 이어 붙여 카드 문자열을 만들려고 한다.

예를 들어 3장의 카드가 [M, K, U] 순으로 놓여있다고 하자. 태욱이는 먼저 가장 왼쪽에 있는 “M”이 적힌 카드를 가져와서 자신의 앞에 놓는다. 다음으로 남은 카드 중 가장 왼쪽에 있는 “K”가 적힌 카드를 가져와서 가장 왼쪽에 두고, 이어서 “U”가 적힌 카드를 가져와서 다시 가장 왼쪽에 두면 “UKM”이라는 문자열을 만들 수 있다. 만약 “K”가 적힌 카드를 가져와서 가장 왼쪽에 두고, 이어서 “U”가 적힌 카드를 가져와서 가장 오른쪽에 두면 “KMU”라는 문자열을 만들 수 있다. 이때, 태욱이가 만들 수 있는 문자열 중 사전 순으로 가장 빠른 문자열은 “KMU”이다.

N장의 카드에 적혀있는 알파벳의 처음 순서가 주어질 때, 태욱이가 만들 수 있는 카드 문자열 중 사전 순으로 가장 빠른 문자열을 출력하는 프로그램을 작성하시오.

입력

입력 데이터는 표준 입력을 사용한다. 입력은 T개의 테스트 데이터로 구성된다. 입력의 첫째 줄에 테스트 케이스의 개수를 나타내는 자연수 T가 주어진다. 각각의 테스트 케이스의 첫째 줄에 처음에 놓여있는 카드의 개수 N(1 ≤ N ≤ 1,000)이 주어진다. 두 번째 줄에는 N장의 카드에 적힌 알파벳의 초기 순서가 주어진다. 가장 왼쪽에 있는 카드에 적혀있는 알파벳부터 순서대로 N개가 공백으로 구분되어 주어진다. 모든 카드에는 한 개씩의 알파벳이 적혀있으며, 모두 대문자이다. 

출력

출력은 표준 출력을 사용한다. 입력받은 데이터에 대해, 한 줄에 1개씩 태욱이가 만들 수 있는 문자열 중에서 사전 순으로 가장 빠른 문자열을 출력한다.


풀이

처음에 문제를 제대로 이해하지 못했는데, 입력으로 받는 문자 카드의 순서를 바꾸지 않고 가장 처음 받은 문자 카드의 앞, 뒤에 입력받은 문자 카드를 연결시켜 만들 수 있는 사전순으로 가장 빠른 문자열을 출력하면 된다.

처음 입력받은 문자가 가장 왼쪽에 있는 문자 카드가 되므로 먼저 빼준다.

이제 문자 카드를 계속 빼 주는데, 결과로 출력할 단어의 가장 첫 글자와 큐에서 빼낸 글자의 아스키 코드 값을 비교하여 큐에서 빼낸 글자의 아스키 코드 값이 더 크다면 결과 문자열의 뒤에 붙이고, 반대의 경우에는 문자열의 앞에 붙여주면 된다.

 

문제에 덱 자료구조의 태그가 존재하는데 본의아니게 덱을 사용하지 않고 풀어버렸다.

 

코드

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
29
30
31
32
33
34
35
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
 
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        int k = Integer.parseInt(bf.readLine());
        Queue<String> queue;
        String res;
        for (int i=0; i<k; i++) {
            int n = Integer.parseInt(bf.readLine());
            st = new StringTokenizer(bf.readLine());
            queue = new LinkedList<>();
            res = "";
            for (int z = 0; z<n; z++) {
                String str = st.nextToken();
                queue.add(str);
            }
            res = res.concat(queue.poll());
            for (int z=0; z<n-1; z++) {
                String tmp = queue.poll();
                if (res.charAt(0) >= tmp.charAt(0)) {
                    res = tmp + res;
                } else {
                    res = res + tmp;
                }
            }
            System.out.println(res);
        }
 
    }
}
Colored by Color Scripter
cs

'PS > Solve' 카테고리의 다른 글

[Java] Boj 23969: 알고리즘 수업 - 버블 정렬 2  (1) 2025.03.10
[Java] Boj 23968: 알고리즘 수업 - 버블 정렬 1  (1) 2025.03.04
[Java] Boj 1895: 필터  (0) 2025.02.22
[Java] Boj 11899: 괄호 끼워넣기  (0) 2025.02.22
[Java] Boj 1531: 투명  (0) 2025.02.22
'PS/Solve' 카테고리의 다른 글
  • [Java] Boj 23969: 알고리즘 수업 - 버블 정렬 2
  • [Java] Boj 23968: 알고리즘 수업 - 버블 정렬 1
  • [Java] Boj 1895: 필터
  • [Java] Boj 11899: 괄호 끼워넣기
hyeon0117
hyeon0117
컴공으로 살아남기
  • hyeon0117
    컴공 생활기
    hyeon0117
  • 전체
    오늘
    어제
    • 분류 전체보기 (36) N
      • Algorithm (2)
      • PS (15)
        • Solve (15)
      • CS (19) N
        • 객체지향설계 & 패턴 (12)
        • COLMAP (2)
        • 머신러닝 (1)
        • 프로그래밍 언어론 (4) N
        • 형식언어 (0)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    백준 6825
    soild 패턴
    알고리즘
    플로이드 - 워셜
    PS
    디자인 패턴
    BOJ
    백준13417
    플로이드-워셜 알고리즘
    Colmap
    다이나믹 프로그래밍
    자료구조
    백준 10867
    백준1531
    백준 11899
    누적 합 알고리즘
    백준 11659
    백준 23969
    백준 11006
    디자인패턴
    객체지향
    백준 24051
    최단 경로
    플로이드 워셜 알고리즘
    백준1895
    백준
    백준 23881
    백준23882
    선택 정렬
    객체지향설계
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
hyeon0117
[Java] Boj 13417: 카드 문자열
상단으로

티스토리툴바