
내가 생각했을때 문제에서 원하는부분
첫째 줄에 소리의 개수 Q가 주어진다. (1 ≤ Q ≤ 100)
둘째 줄부터 Q개의 줄에 걸쳐 분석할 소리 S가 주어진다. (1 ≤ S의 길이 ≤ 1000, S는 W 혹은 O로만 이루어져 있다.)
분석할 소리마다 주어진 소리에서 분석한 와우의 귀여움을 한 줄에 하나씩 순서대로 출력한다.
내가 이 문제를 보고 생각해본 부분
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));:
System.in을 통해 콘솔로부터 입력을 받을 준비를 한다.
BufferedReader를 InputStreamReader로 감싸서 문자 단위로 읽을 수 있게 한다.
int Q = Integer.parseInt(br.readLine());:
br.readLine()을 이용해 첫 번째 줄을 읽어 문자열로 가져온다.
이 문자열은 쿼리의 개수 Q이다.
Integer.parseInt()를 이용해 이 문자열을 정수(int)로 변환하여 Q 변수에 저장한다.
for(int i = 0; i < Q; i++) { ... }:
Q개의 쿼리(소리 문자열)를 각각 처리하기 위한 반복문이다.
이 루프는 Q번 실행된다.
String S = br.readLine();:
각 반복마다 다음 줄에 있는 소리 문자열 S를 읽어온다.
int count = 0;:
현재 소리 S에서 "WOW" 부분 문자열이 발견될 때마다 그 횟수를 저장할 변수 count를 0으로 초기화한다.
for(int j = 0; j <= S.length() - 3; j++) { ... }:
이것이 "WOW" 부분 문자열을 찾는 핵심 로직이다.
j는 S 문자열을 탐색할 시작 인덱스를 나타낸다.
j <= S.length() - 3 조건: 이 조건이 중요한데요. "WOW"는 3글자이므로, j를 기준으로 3글자를 추출할 수 있어야 한다.
만약 S의 길이가 5라면, S.length() - 3은 2가 됩니다. j는 0, 1, 2까지 실행된다.
j=0일 때 S[0], S[1], S[2] (3글자)
j=1일 때 S[1], S[2], S[3] (3글자)
j=2일 때 S[2], S[3], S[4] (3글자) 이렇게 j가 문자열의 끝에서 3글자 이상 남은 곳까지만 탐색하도록 하여 IndexOutOfBoundsException을 방지하고 "WOW"를 만들 수 있는 유효한 범위 내에서만 확인한다.
String sub = S.substring(j, j + 3);:
S.substring(startIndex, endIndex) 메서드를 사용하여 S에서 j 인덱스부터 j + 3 인덱스 바로 앞(j + 2 인덱스)까지의 부분 문자열을 추출한다.
즉, 3글자의 부분 문자열을 얻는다.
if(sub.equals("WOW")) { ... }:
추출된 부분 문자열 sub가 대소문자를 구분하여 정확히 "WOW"와 같은지 비교한다.
== 연산자는 문자열 내용 비교에 사용하지 않는다 (equals를 사용해야 한다).
count++;:
만약 부분 문자열이 "WOW"와 일치한다면 count 값을 1 증가시킨다.
System.out.println(count);:
현재 S 문자열에 대한 모든 "WOW" 찾기가 끝나면, 최종 count 값을 한 줄에 출력한다.
br.close();:
br.close()를 호출하여 BufferedReader와 연결된 시스템 자원을 해제한다.
코드로 구현
package baekjoon.baekjoon_31;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
// 백준 32342번 문제
public class Main1213 {
public static void main(String[] args) throws IOException {
// BufferedReader를 사용하여 입력을 효율적으로 읽습니다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 첫째 줄에서 쿼리(소리의 개수) Q를 읽고 정수로 변환합니다.
int Q = Integer.parseInt(br.readLine());
// Q번 반복하여 각 소리를 분석합니다.
for(int i = 0; i < Q; i++) {
// 현재 쿼리에 해당하는 소리 S를 읽습니다.
String S = br.readLine();
// 각 소리 S에 대해 "WOW" 부분 문자열의 개수를 세는 변수입니다.
int count = 0;
// 문자열 S를 순회하며 "WOW" 부분 문자열을 찾습니다.
// S.length() - 3은 부분 문자열이 항상 3글자를 가질 수 있도록 인덱스 범위를 제한합니다.
// 예를 들어, 길이가 3인 문자열(ABC)의 경우 S.length() - 3 = 0 이므로 j=0일 때 한번 실행됩니다.
for(int j = 0; j <= S.length() - 3; j++) {
// 현재 위치 j부터 3글자를 추출하여 부분 문자열을 만듭니다.
// substring(시작 인덱스, 끝 인덱스)에서 끝 인덱스는 포함되지 않습니다.
String sub = S.substring(j, j + 3);
// 추출된 부분 문자열이 "WOW"와 같은지 비교합니다.
if(sub.equals("WOW")) {
// 같다면 count를 증가시킵니다.
count++;
}
}
// 현재 소리 S에서 찾은 "WOW"의 개수를 출력합니다.
System.out.println(count);
}
// 모든 입력을 처리했으므로 BufferedReader를 닫아 자원을 해제합니다.
br.close();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.