백준 Tautogram

KIMYEONGJUN·6일 전
post-thumbnail

문제

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

각 테스트 케이스는 한 줄로 이루어져 있고, 선영이 편지의 한 문장에 해당한다.
문장은 최대 50개의 단어로 이루어져 있으며, 공백으로 구분되어져 있다.
단어는 알파벳 대문자와 소문자로 이루어져 있고, 길이는 최대 20이다.
단어는 적어도 한 글자를 포함하며, 문장은 적어도 한 단어를 포함한다.
마지막 테스트 케이스의 다음 줄에는 *이 하나 주어진다.

각 테스트 케이스에 대해서, 입력으로 주어진 문장이 Tautogram이라면 'Y'를, 아니라면 'N'을 출력한다.

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

초기 설정 및 입력 준비:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedReader는 대량의 입력을 빠르게 읽어올 때 사용하는 자바 클래스이다. 
System.in은 표준 입력을 의미하며, InputStreamReader를 통해 바이트 형태의 입력을 문자 형태로 변환하여 BufferedReader가 읽을 수 있도록 준비한다.
StringBuilder sb = new StringBuilder();
StringBuilder는 문자열을 여러 번 수정하거나 추가해야 할 때 String보다 훨씬 효율적인 객체이다. 
결과를 바로 출력하지 않고 여기에 먼저 모아둔 뒤, 프로그램이 끝날 때 한 번에 출력하기 위해 사용한다.
이렇게 하면 System.out.println()을 여러 번 호출하는 것보다 입출력 성능을 높일 수 있다.
문장 반복 처리:
while((line = br.readLine()) != null && !line.equals("*")) { ... }
line = br.readLine(): BufferedReader를 통해 한 줄씩 입력을 읽어 line 변수에 저장한다.
line != null: 입력의 끝(EOF, End Of File)에 도달했는지 확인한다.
!line.equals("*"): 현재 읽어온 줄이 "*" 문자인지 확인한다. 
문제 조건에 따라 "*" 문자가 입력되면 더 이상 처리할 문장이 없다는 뜻이므로 반복을 종료한다.
이 두 조건이 모두 참인 동안 while 루프가 계속 실행된다.
단어 전처리:
String lowerCaseLine = line.toLowerCase();
'Tautogram'의 정의에 따르면 대소문자를 구분하지 않으므로, 입력받은 line의 모든 알파벳을 소문자로 변환한다. 
예를 들어, "Peter"와 "pePPers"의 첫 글자가 모두 'p'로 동일하게 처리된다.
String[] words = lowerCaseLine.split(" ");
소문자로 변환된 문장을 공백(" ")을 기준으로 여러 개의 단어로 분리하여 words라는 문자열 배열에 저장한다.
Tautogram 여부 판별:
char firstChar = words[0].charAt(0);
분리된 단어들 중 첫 번째 단어(words[0])의 첫 번째 문자(charAt(0))를 가져와 firstChar에 저장한다. 
이 문자가 현재 문장이 'Tautogram'인지 아닌지를 판단하는 기준이 된다.
boolean isTautogram = true;
현재 문장이 'Tautogram'인지를 나타내는 플래그 변수를 true로 초기화한다. 
일단 'Tautogram'이라고 가정한 뒤, 조건에 맞지 않으면 false로 변경할 것이다.
for(String word : words) { ... }
words 배열에 있는 각 단어에 대해 반복한다.
if(word.charAt(0) != firstChar) { isTautogram = false; break; }
반복문 안에서 현재 단어(word)의 첫 글자가 firstChar (기준 첫 글자)와 다른지 확인한다.
만약 다르다면, 이 문장은 'Tautogram'이 아니므로 isTautogram 플래그를 false로 바꾸고, break를 사용하여 더 이상 다른 단어들을 확인할 필요 없이 for 루프를 즉시 종료한다.
결과 저장:
if(isTautogram) { sb.append("Y").append("\n"); } else { sb.append("N").append("\n"); }
'Tautogram' 여부 판별이 끝나면, isTautogram 플래그 값에 따라 StringBuilder(sb)에 "Y" 또는 "N"을 추가한다. 
이때 append("\n")을 통해 각 결과 뒤에 줄바꿈 문자를 넣어 다음 결과가 새로운 줄에 출력되도록 한다.
최종 결과 출력 및 자원 해제:
System.out.print(sb.toString());
while 반복문이 모두 끝나고 모든 문장에 대한 처리가 완료되면, sb.toString()을 호출하여 StringBuilder에 모아둔 모든 결과를 하나의 큰 문자열로 변환하고 System.out.print()를 통해 한 번에 출력한다.
br.close();
BufferedReader는 시스템 자원을 사용하므로, 사용을 마친 후에는 반드시 close() 메서드를 호출하여 자원을 반환해야 한다.

코드로 구현

package baekjoon.baekjoon_31;

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

// 백준 5698번 문제
public class Main1244 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line; // 한 줄씩 읽어올 문자열 변수
        StringBuilder sb = new StringBuilder(); // 결과를 효율적으로 모으기 위한 StringBuilder

        // '*' 문자가 입력되기 전까지 반복하여 각 줄을 처리합니다.
        while ((line = br.readLine()) != null && !line.equals("*")) {
            // 1. 대소문자를 구분하지 않도록 모두 소문자로 변경합니다.
            String lowerCaseLine = line.toLowerCase();
            // 2. 공백을 기준으로 문자열을 단어 단위로 나눕니다.
            String[] words = lowerCaseLine.split(" ");

            // 3. 첫 단어의 첫 글자를 기준으로 설정합니다.
            char firstChar = words[0].charAt(0);

            // 4. 모든 단어가 첫 글자와 동일하게 시작하는지 확인하는 플래그 변수입니다.
            boolean isTautogram = true;
            for (String word : words) {
                // 현재 단어의 첫 글자가 기준 글자와 다르면 토토그램이 아닙니다.
                if (word.charAt(0) != firstChar) {
                    isTautogram = false; // 플래그를 false로 설정하고
                    break;             // 더 이상 확인할 필요가 없으므로 반복을 중단합니다.
                }
            }

            // 5. 판별 결과에 따라 'Y' 또는 'N'을 출력합니다.
            if (isTautogram) {
                sb.append("Y").append("\n"); // "Y"와 줄바꿈 문자를 추가
            } else {
                sb.append("N").append("\n"); // "N"와 줄바꿈 문자를 추가
            }
        }

        // 모든 처리가 끝난 후, 모아진 결과를 한 번에 출력합니다.
        System.out.print(sb.toString());
        br.close(); // BufferedReader 자원 해제
    }
}

마무리

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

profile
Junior backend developer

0개의 댓글