
내가 생각했을때 문제에서 원하는부분
첫째 줄에 문자열의 길이 N이 주어진다. (4 ≤ N ≤ 10)
둘째 줄에 길이 N의 문자열 S가 주어진다.
문자열은 알파벳 소문자만으로 이루어져 있다.
gori가 주어진 문자열에서 유래되었다면 YES를 아니면 NO를 출력한다.
내가 이 문제를 보고 생각해본 부분
초기 설정 및 입력 준비:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));: System.in이라는 표준 입력(키보드)을 받아서, BufferedReader 객체를 생성한다.
이 객체를 통해 입력값을 한 줄씩 편리하게 읽어들일 수 있다.
입력값 읽기:
int N = Integer.parseInt(br.readLine());: 첫 번째 입력으로 들어오는 문자열의 길이를 나타내는 정수 N을 읽어들인다.
br.readLine()으로 한 줄을 문자열로 읽은 다음, Integer.parseInt()를 이용해 정수형으로 변환한다.
이 N 값은 이후 루프의 범위를 설정하는 데 활용된다.
String S = br.readLine();: 두 번째 입력으로 들어오는, 길이가 N인 실제 문자열 S를 읽어들인다.
이 문자열이 우리가 "gori"를 찾을 대상이 된다.
탐색을 위한 준비:
boolean foundGori = false;: foundGori라는 이름의 boolean 타입 변수를 선언하고 초기값을 false로 설정한다.
이 변수는 문자열 S를 탐색하는 과정에서 "gori"를 찾았는지 여부를 표시하는 플래그(Flag) 역할을 한다.
만약 "gori"를 찾으면 이 값을 true로 바뀐다.
"gori" 문자열 탐색:
for(int i = 0; i <= N - 4; i++) { ... }: 이 for 반복문은 문자열 S의 모든 가능한 위치를 확인하여 "gori"가 존재하는지 탐색해준다.
i는 "gori"가 시작될 수 있는 문자열 S 내의 시작 인덱스를 의미한다.
"gori"는 4개의 문자로 이루어져 있기 때문에, i가 S의 끝에서 4칸을 확보할 수 있는 마지막 인덱스까지만 반복해야 한다.
즉, i + 4가 문자열 S의 길이를 넘어서면 안 되므로, i는 최대 N - 4까지 증가할 수 있다.
예를 들어, N이 4이면 i는 0일 때만 실행된다.
String sub = S.substring(i, i + 4);: 현재 반복 i의 값에 따라, S 문자열에서 i 인덱스부터 i + 4 인덱스 직전까지(즉, i부터 4개의 문자)를 잘라내어 새로운 부분 문자열 sub를 만든다.
예를 들어, i가 2라면 S.substring(2, 6)이 된다.
if(sub.equals("gori")) { ... }: 잘라낸 부분 문자열 sub가 정확히 "gori"와 같은지 비교한다.
자바에서 문자열 내용 비교는 반드시 equals() 메서드를 사용해야 한다.
foundGori = true;: 만약 sub가 "gori"와 일치한다면, foundGori 플래그를 true로 변경한다.
이는 우리가 찾는 문자열을 발견했다는 의미이다.
break;: "gori"를 이미 찾았기 때문에 더 이상 문자열의 나머지 부분을 탐색할 필요가 없다.
결과 출력:
if(foundGori) { System.out.println("YES"); } else { System.out.println("NO"); }: for 반복문이 끝난 후, foundGori 변수의 최종 값을 확인한다.
만약 foundGori가 true라면 (즉, "gori"를 찾았다면) "YES"를 출력하고, false라면 (찾지 못했다면) "NO"를 출력한다.
자원 해제:
br.close();: BufferedReader 객체가 사용하던 시스템 자원을 반환하여 종료한다.
코드로 구현
package baekjoon.baekjoon_31;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
// 백준 32297번 문제
public class Main1208 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine()); // 문자열의 길이 N을 읽습니다.
String S = br.readLine(); // 길이가 N인 문자열 S를 읽습니다.
boolean foundGori = false; // "gori"를 찾았는지 여부를 나타내는 플래그
// N을 활용하여 "gori"가 시작될 수 있는 모든 위치를 순회합니다.
// "gori"는 4글자이므로, 문자열 S의 끝에서 4글자를 남길 수 있는 마지막 인덱스(N-4)까지 반복합니다.
for(int i = 0; i <= N - 4; i++) {
// 현재 위치(i)부터 4글자를 잘라내어 부분 문자열을 만듭니다.
String sub = S.substring(i, i + 4);
// 잘라낸 부분 문자열이 "gori"와 같은지 확인합니다.
if(sub.equals("gori")) {
foundGori = true; // "gori"를 찾았으면 플래그를 true로 설정
break; // 더 이상 찾을 필요 없으므로 반복문을 종료합니다.
}
}
// 플래그 값에 따라 "YES" 또는 "NO"를 출력합니다.
if(foundGori) {
System.out.println("YES");
} else {
System.out.println("NO");
}
br.close(); // BufferedReader를 닫아 자원을 해제합니다.
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.