일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- export changeLog
- 두 스티커
- Codility
- 백준1461
- generateChangeLog
- 백준 타일코드
- Frog River One
- 백준1720
- 백준 시간초과
- 백준2098
- 백준
- 백준13417
- streamlit
- streaming chat
- 백준1802
- java
- 백준20126
- 백준17124
- 백준16937
- liquibse
- 백준3078 풀이
- 외판원순회
- BaseCallbackHandler
- 백준11332
- 백준 도서관
- 두 개의 배열
- 백준3078
- LangChain
- ChatOpenAI
- 교수님의 기말고사풀이
- Today
- Total
tempcru 삽질기록
백준13417 카드문자열 풀이 - java 본문
백준13417 카드문자열 풀이
https://www.acmicpc.net/problem/13417
카드 문자열 성공
문제
N장의 카드가 일렬로 놓여있다. 각 카드에는 알파벳이 하나씩 적혀있다. 태욱이는 가장 왼쪽에 있는 카드부터 차례대로 한 장씩 가져올 수 있다. 가장 처음에 가져온 카드는 자신의 앞에 놓는다. 그다음부터는 가져온 카드를 자신의 앞에 놓인 카드들의 가장 왼쪽, 또는 가장 오른쪽에 놓는다. 태욱이는 모든 카드를 다 가져온 후에 자신의 앞에 놓인 카드를 순서대로 이어 붙여 카드 문자열을 만들려고 한다.
예를 들어 3장의 카드가 [M, K, U] 순으로 놓여있다고 하자. 태욱이는 먼저 가장 왼쪽에 있는 “M”이 적힌 카드를 가져와서 자신의 앞에 놓는다. 다음으로 남은 카드 중 가장 왼쪽에 있는 “K”가 적힌 카드를 가져와서 가장 왼쪽에 두고, 이어서 “U”가 적힌 카드를 가져와서 다시 가장 왼쪽에 두면 “UKM”이라는 문자열을 만들 수 있다. 만약 “K”가 적힌 카드를 가져와서 가장 왼쪽에 두고, 이어서 “U”가 적힌 카드를 가져와서 가장 오른쪽에 두면 “KMU”라는 문자열을 만들 수 있다. 이때, 태욱이가 만들 수 있는 문자열 중 사전 순으로 가장 빠른 문자열은 “KMU”이다.
N장의 카드에 적혀있는 알파벳의 처음 순서가 주어질 때, 태욱이가 만들 수 있는 카드 문자열 중 사전 순으로 가장 빠른 문자열을 출력하는 프로그램을 작성하시오.
입력
입력 데이터는 표준 입력을 사용한다. 입력은 T개의 테스트 데이터로 구성된다. 입력의 첫째 줄에 테스트 케이스의 개수를 나타내는 자연수 T가 주어진다. 각각의 테스트 케이스의 첫째 줄에 처음에 놓여있는 카드의 개수 N(1 ≤ N ≤ 1,000)이 주어진다. 두 번째 줄에는 N장의 카드에 적힌 알파벳의 초기 순서가 주어진다. 가장 왼쪽에 있는 카드에 적혀있는 알파벳부터 순서대로 N개가 공백으로 구분되어 주어진다. 모든 카드에는 한 개씩의 알파벳이 적혀있으며, 모두 대문자이다.
출력
출력은 표준 출력을 사용한다. 입력받은 데이터에 대해, 한 줄에 1개씩 태욱이가 만들 수 있는 문자열 중에서 사전 순으로 가장 빠른 문자열을 출력한다.
풀이
- M K U 를 예로 생각해보면
- M 다음 가능한 문자는 MK 혹은 KM 이다
- 그런데 만들 수 있는 문자열 중 사전순으로 가장 빠른 문자열을 찾아야하므로 (MK는 KM 보다 사전순으로 늦다) MK는 구지 연산할 필요가 없다
- 따라서 간단하게 기존 문자열의 가장 앞 글자와 새로 추가할 문자만 비교하여 문자열 앞에 붙일지 뒤에 붙일지만 계산하면된다.
package B13417;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
/**
* https://www.acmicpc.net/problem/13417
* title : 카드 문자열 Silver III
* @author tempcru
*/
public class Main {
static int T;
// Count of card [1, 1000]
static int N;
static String result;
static char word;
public static void main(String[] args) throws Exception {
// System.setIn(new FileInputStream("./src/B13417/sample_data"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
T = Integer.parseInt(br.readLine().trim());
for (int tc = 0; tc < T; tc++) {
N = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine().trim());
word = st.nextToken().charAt(0);
result = Character.toString(word);
char new_word;
for(int i = 1; i < N; i++) {
new_word = st.nextToken().charAt(0);
if(word >= new_word) {
word = new_word;
result = Character.toString(new_word) + result;
} else {
result = result + Character.toString(new_word);
}
}
System.out.println(result);
}
}
}
'Coding Test > 백준' 카테고리의 다른 글
[백준1720] 타일코드 문제 풀이 - JAVA (0) | 2022.06.14 |
---|---|
백준3078 좋은 친구 문제 풀이 - JAVA (0) | 2022.06.09 |
백준1461 도서관 문제 풀이 - java (0) | 2022.06.02 |
백준17124-두 개의 배열, java (0) | 2022.05.26 |
백준20126-교수님의 기말고사 풀이, java (0) | 2022.05.26 |