내가 생각했을때 문제에서 원하는부분
Your program will be tested on one or more test cases.
The first line of the input will be a single integer T (1 ≤ T ≤ 100)
representing the number of test cases.
Followed by T test cases.
Each test case will consist of a single line, containing a non-empty string of at most 100 characters, and each character is either ‘U’ or ‘D’.
The characters from left to right represent Adam’s steps in the order he walks them.
For each test case print a single line containing the number of steps that Adam will walk before falling down, or the length of the string if he won’t fall down.
내가 이 문제를 보고 생각해본 부분
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));: 표준 입력(키보드)으로부터 데이터를 읽어오기 위한 BufferedReader 객체를 생성한다.
StringBuilder sb = new StringBuilder();: 여러 테스트 케이스의 결과를 저장하고 최종적으로 한 번에 출력하기 위해 StringBuilder를 사용한다.
System.out.println()을 반복해서 사용하면 성능 저하가 발생할 수 있는데, StringBuilder는 이를 방지하는 효과적인 방법이다.
int T = Integer.parseInt(br.readLine());: 첫 번째 줄에서 테스트 케이스의 개수 T를 읽어 정수형으로 변환하여 저장한다.
for(int i = 0; i < T; i++) { ... }: T번 반복하면서 각 테스트 케이스를 처리한다.
String s = br.readLine();: 각 반복마다 아담의 걸음 정보를 담고 있는 문자열(예: "UUUDU")을 한 줄 읽어온다.
int steps = 0;: 현재 테스트 케이스에서 아담이 넘어지기 전까지 걸은 걸음 수를 셀 steps 변수를 0으로 초기화한다.
for(char c : s.toCharArray()) { ... }: 문자열 s를 char 배열로 변환한 후, 이 배열의 각 문자(c)를 순서대로 하나씩 확인하는 향상된 for 루프이다.
if (c == 'U') { steps++; }: 만약 현재 문자가 'U'(손을 들고 걸음)라면, 넘어지지 않았으므로 steps 값을 1 증가시킨다.
else { break; }: 만약 현재 문자가 'U'가 아니라면, 즉 'D'(손을 내리고 넘어짐)라면, 아담이 넘어졌다는 의미이다.
문제에서 처음 넘어지기 전까지의 걸음 수를 세야 하므로, 더 이상 걸음을 셀 필요가 없다.
따라서 break 문을 사용하여 현재 for 루프(문자열 순회)를 즉시 종료한다.
sb.append(steps).append("\n");: for 루프가 종료되면 steps 변수에는 아담이 넘어지기 전까지 걸은 걸음 수가 저장되어 있다.
이 값을 StringBuilder에 추가하고, 다음 결과를 위해 줄 바꿈 문자(\n)도 추가한다.
System.out.print(sb.toString());: 모든 테스트 케이스의 처리가 끝나면, StringBuilder에 저장된 모든 결과 문자열을 한 번에 표준 출력(콘솔)으로 출력한다.
print를 사용하여 마지막에 \n이 한 번 더 추가되는 것을 방지한다.
br.close();: BufferedReader 사용이 끝났으므로 close() 메서드를 호출하여 열려 있던 입력 스트림을 닫고 자원을 해제한다.
코드로 구현
package baekjoon.baekjoon_30;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
// 백준 18698번 문제
public class Main1163 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder(); // 여러 테스트 케이스의 결과를 효율적으로 출력하기 위해 StringBuilder를 사용합니다.
int T = Integer.parseInt(br.readLine()); // 첫 줄에서 테스트 케이스의 개수 T를 읽어옵니다.
for(int i = 0; i < T; i++) { // T개의 테스트 케이스만큼 반복합니다.
String s = br.readLine(); // 각 테스트 케이스마다 아담의 걸음 정보를 담은 문자열을 읽어옵니다.
int steps = 0; // 아담이 넘어지기 전까지 걸은 걸음 수를 저장할 변수입니다.
// 문자열을 순회하며 'U' 또는 'D'를 확인합니다.
// Adam이 넘어지는 순간(즉, 'D'를 만나는 순간) 반복을 멈춥니다.
for(char c : s.toCharArray()) { // 문자열을 char 배열로 변환하여 각 문자를 순회합니다.
if(c == 'U') {
steps++; // 'U'이면 넘어지지 않고 한 걸음 더 걸었으므로 steps를 증가시킵니다.
} else { // c == 'D'인 경우
break; // 'D'이면 Adam이 넘어졌으므로, 더 이상 걸음을 세지 않고 반복을 종료합니다.
}
}
sb.append(steps).append("\n"); // 현재 테스트 케이스의 결과를 StringBuilder에 추가하고 줄 바꿈합니다.
}
System.out.print(sb.toString()); // 모든 테스트 케이스의 결과가 저장된 StringBuilder 내용을 한 번에 출력합니다.
br.close(); // BufferedReader를 닫아 자원을 해제합니다.
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.