백준 오렌지먹은지오랜지

KIMYEONGJUN·2025년 11월 24일
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

첫 번째 줄에 문자열의 길이 N이 주어진다. (2 ≤ N ≤ 2000)
두 번째 줄에 문자열이 주어진다.
문자열은 알파벳 소문자로만 이루어져 있다.

입력으로 주어진 문자열이 "비타민 문자열"이면 YES를, 아니면 NO를 출력한다.

내가 이 문제를 보고 생각해본 부분

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
표준 입력을 효율적으로 읽기 위해 BufferedReader를 사용한다.
int N = Integer.parseInt(br.readLine());
첫 번째 줄에서 문자열의 길이 N을 읽어 정수로 변환한다.
String S = br.readLine();
두 번째 줄에서 원본 문자열 S를 읽어온다.
BufferedReader 사용이 끝나면 닫아주어 자원을 해제한다.
isVitaminString 변수 초기화:
boolean isVitaminString = false;
결과를 저장할 boolean 타입의 변수이다. 
초기값은 false로 설정하고, '비타민 문자열' 조건을 만족하는 경우 true로 바꿀 것이다.
부분 문자열 길이 반복(for (int len = 1; len <= N; len++)):
이 반복문은 '비타민 문자열'의 핵심 조건 중 하나인 "동일한 길이"를 탐색한다.
len 변수는 두 부분 문자열의 길이가 될 수 있는 모든 경우(1부터 N까지)를 순회한다.
부분 문자열 추출(substring 사용):
String prefix = S.substring(0, len);
원본 문자열 S에서 인덱스 0부터 len-1까지의 문자를 추출하여 prefix (맨 앞에서 시작하는 부분 문자열)로 저장한다.
String suffix = S.substring(N - len, N);
원본 문자열 S에서 인덱스 N - len부터 N - 1까지의 문자를 추출하여 suffix (맨 뒤에서 끝나는 부분 문자열)로 저장란다.
예를 들어, N=15, len=6일 때, N-len = 9이므로 S.substring(9, 15)가 되어 orenge가 된다.
두 부분 문자열 비교 (for (int i = 0; i < len; i++)):
int diffCount = 0;
prefix와 suffix에서 다른 문자의 개수를 세기 위한 변수이다.
내부 반복문은 prefix와 suffix의 모든 문자 (i = 0부터 len-1까지)를 하나씩 비교한다.
if (prefix.charAt(i) != suffix.charAt(i))
charAt(i)를 사용하여 각 위치의 문자를 가져와 비교한다. 
문자가 다르면 diffCount를 1 증가시킨다.
'비타민 문자열' 조건 확인 및 종료:
if (diffCount == 1)
diffCount가 정확히 1이면, 이 len에서 '비타민 문자열' 조건을 만족하는 쌍을 찾았다는 뜻이다.
isVitaminString = true;
isVitaminString 변수를 true로 설정한다.
break;
하나라도 조건을 만족하는 쌍을 찾으면 더 이상 다른 길이를 탐색할 필요가 없으므로, 가장 바깥 for 반복문을 break하여 종료한다.
결과 출력:
모든 탐색이 끝난 후 isVitaminString의 값에 따라 "YES" 또는 "NO"를 출력한다.
br.close();: BufferedReader를 통해 사용한 시스템 자원(스트림)을 반환하고 닫는다.

코드로 구현

package baekjoon.baekjoon_31;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

// 백준 27962번 문제
public class Main1216 {
    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(); // 원본 문자열

        boolean isVitaminString = false; // 비타민 문자열인지 여부를 저장할 변수

        // 1. 모든 가능한 부분 문자열의 길이를 반복합니다.
        // 길이는 1부터 N까지 가능합니다.
        for(int len = 1; len <= N; len++) {
            // 2. 맨 앞에서 시작하는 부분 문자열 (prefix)
            String prefix = S.substring(0, len);

            // 3. 맨 뒤에서 끝나는 부분 문자열 (suffix)
            // substring(beginIndex, endIndex)에서 endIndex는 포함하지 않으므로 N-len부터 N까지
            String suffix = S.substring(N - len, N);

            int diffCount = 0; // 두 부분 문자열의 다른 문자 개수

            // 4. 두 부분 문자열을 한 문자씩 비교합니다.
            for(int i = 0; i < len; i++) {
                if(prefix.charAt(i) != suffix.charAt(i)) {
                    diffCount++; // 문자가 다르면 카운트 증가
                }
            }

            // 5. 정확히 한 문자만 다르면 비타민 문자열입니다.
            if(diffCount == 1) {
                isVitaminString = true; // 비타민 문자열임을 표시하고
                break; // 더 이상 탐색할 필요가 없으므로 반복을 종료합니다.
            }
        }

        // 결과 출력
        if(isVitaminString) {
            System.out.println("YES");
        } else {
            System.out.println("NO");
        }

        br.close();
    }
}

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글