
내가 생각했을때 문제에서 원하는부분
입력은 여러 개의 테스트 케이스로 이루어져 있고, 첫째 줄에 테스트 케이스의 개수가 주어진다.
각 테스트 케이스의 첫째 줄에는 단어의 개수 1 ≤ m ≤ 50이 주어진다.
다음 m개 줄에는 단어가 한 줄에 하나씩 주어진다.
각 단어의 길이는 최대 5글자이고, 공백을 포함하지 않는다.
다음 줄에는 참가자의 수 1 ≤ n ≤ 200이 주어지며, 다음 n개 줄에는 각 참가자의 비밀번호 정보가 주어진다.
비밀번호 정보는 정수 1 ≤ k ≤ 10 로 시작하며, 비밀번호를 이루고 있는 단어의 개수이다.
다음 k개 숫자는 단어의 인덱스를 나타내며, 순서대로 해당하는 단어를 연결한 문자열이 비밀번호이다.
각 테스트 케이스마다 첫째 줄에는 "Scenario #i:"를 출력하고, 다음 줄부터 순서대로 각 참가자의 비밀번호를 출력한다.
테스트 케이스 사이에 빈 줄을 출력한다.
내가 이 문제를 보고 생각해본 부분
초기 설정 및 입력 준비:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
많은 양의 데이터를 효율적으로 읽어들이기 위해 BufferedReader를 사용한다.
키보드 입력(System.in)을 InputStreamReader를 통해 문자로 변환하여 BufferedReader에 연결한다.
StringTokenizer st;
한 줄에 여러 값이 공백으로 구분되어 주어지는 경우(k와 단어 인덱스들)를 파싱하기 위해 StringTokenizer를 사용할 변수를 미리 선언한다.
int T = Integer.parseInt(br.readLine());
가장 먼저 주어지는 테스트 케이스의 개수 T를 읽어들인다.
br.readLine()은 한 줄을 통째로 읽어오므로, Integer.parseInt()를 이용해 정수형으로 변환한다.
테스트 케이스 반복 처리:
for (int t = 1; t <= T; t++) { ... }
T개의 테스트 케이스를 처리하기 위한 반복문이다.
시나리오 번호가 1부터 시작하므로 t도 1부터 시작하도록 설정한다.
System.out.println("Scenario #" + t + ":");
각 테스트 케이스 시작 시, 문제에서 요구하는 형식(Scenario #i:)으로 시나리오 번호를 출력한다.
단어 목록 읽기 및 저장:
int m = Integer.parseInt(br.readLine());
현재 테스트 케이스에서 사용할 단어의 개수 m을 읽어온다.
ArrayList<String> words = new ArrayList<>();
m개의 단어를 저장할 ArrayList를 생성한다.
ArrayList는 가변 크기 배열이므로 단어 개수가 동적으로 변해도 유연하게 대응할 수 있다.
for (int i = 0; i < m; i++) { words.add(br.readLine()); }
m번 반복하면서 각 단어를 한 줄씩 읽어 words ArrayList에 순서대로 추가한다.
이로써 words.get(0)은 첫 번째 단어, words.get(1)은 두 번째 단어가 되는 식이다.
참가자 비밀번호 생성:
int n = Integer.parseInt(br.readLine());
현재 테스트 케이스에 참가하는 사람의 수 n을 읽어온다.
for (int i = 0; i < n; i++) { ... }
n명의 참가자 각각의 비밀번호를 생성하기 위한 반복문이다.
st = new StringTokenizer(br.readLine());
각 참가자의 비밀번호 정보를 담은 한 줄을 읽어 StringTokenizer에 넣어준다.
이 줄에는 k와 k개의 인덱스가 공백으로 구분되어 있다.
int k = Integer.parseInt(st.nextToken());
StringTokenizer에서 첫 번째 토큰(k값)을 가져와 Integer.parseInt()로 정수형으로 변환한다.
k는 비밀번호를 구성할 단어의 개수이다.
StringBuilder password = new StringBuilder();
비밀번호를 효율적으로 만들기 위해 StringBuilder를 사용한다.
String 객체를 + 연산자로 연결하는 것보다 StringBuilder의 append() 메서드를 사용하는 것이 문자열 변경이 많을 때 성능상 이점이 크다.
for (int j = 0; j < k; j++) { ... }
k번 반복하면서 비밀번호를 구성할 단어들을 가져온다.
int index = Integer.parseInt(st.nextToken());
StringTokenizer에서 다음 토큰(단어의 인덱스)을 가져와 정수형으로 변환한다.
password.append(words.get(index));
위에서 얻은 index를 사용하여 words ArrayList에서 해당하는 단어를 가져와 password StringBuilder에 추가한다.
System.out.println(password.toString());
k개의 단어가 모두 연결되어 비밀번호가 완성되면, StringBuilder의 toString() 메서드를 호출하여 String 타입으로 변환 후 출력한다.
테스트 케이스 사이 빈 줄 처리:
if (t < T) { System.out.println(); }
문제에서 "테스트 케이스 사이에 빈 줄을 출력한다"고 명시되어 있으므로, 마지막 테스트 케이스를 제외하고 각 테스트 케이스 출력 후 빈 줄을 하나 출력한다.
자원 반납:
br.close();
BufferedReader 사용이 끝났으면 스트림을 닫아 자원을 해제한다.
코드로 구현
package baekjoon.baekjoon_32;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
// 백준 7513번 문제
public class Main1258 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int T = Integer.parseInt(br.readLine()); // 테스트 케이스의 개수
for (int t = 1; t <= T; t++) {
// 시나리오 번호 출력
System.out.println("Scenario #" + t + ":");
int m = Integer.parseInt(br.readLine()); // 단어의 개수
ArrayList<String> words = new ArrayList<>();
for (int i = 0; i < m; i++) {
words.add(br.readLine()); // m개의 단어 읽어서 저장
}
int n = Integer.parseInt(br.readLine()); // 참가자의 수
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
int k = Integer.parseInt(st.nextToken()); // 비밀번호를 이루는 단어의 개수
StringBuilder password = new StringBuilder();
for (int j = 0; j < k; j++) {
int index = Integer.parseInt(st.nextToken()); // 단어 인덱스
password.append(words.get(index)); // 해당 단어를 비밀번호에 추가
}
System.out.println(password.toString()); // 완성된 비밀번호 출력
}
// 각 테스트 케이스 사이에 빈 줄 출력 (마지막 테스트 케이스 다음에는 출력하지 않아도 되지만, 문제에서 "사이에"라는 언급이 없어 안전하게 항상 출력합니다.)
// 보통 채점 서버에서 마지막 빈 줄은 허용하거나 무시합니다.
if (t < T) { // 마지막 테스트 케이스 다음에는 빈 줄을 출력하지 않도록 조건을 추가했습니다.
System.out.println();
}
}
br.close();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.