백준 줄임말 만들기

KIMYEONGJUN·2025년 9월 8일
0
post-thumbnail

문제

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

입력은 유일하게 한 줄만 주어지며 하려는 말이 포함되어 있다.
문장은 알파벳 소문자와 공백으로만 이루어져 있다.
문장의 최대길이는 100이다.

만들어진 줄임말을 출력하라.

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

uselessWords (HashSet 사용):
가장 먼저, 문제에서 "쓸모없는 단어"라고 명시된 단어들을 HashSet이라는 자료구조에 저장했다.
HashSet은 데이터를 저장할 때 내부적으로 해시 테이블을 사용하여 단어가 이 집합 안에 있는지(contains 메소드)를 매우 빠르게 확인할 수 있다.
입력 읽기:
BufferedReader를 사용하여 사용자로부터 한 줄의 문장을 입력받는다.
이 방식은 대량의 입력을 처리할 때 Scanner보다 빠르다.
단어 분리 (split(" ")):
입력받은 문장을 split(" ") 메소드를 사용하여 공백을 기준으로 여러 개의 단어(문자열)로 분리합니다. 이렇게 분리된 단어들은 String 배열 words에 저장됩니다.
abbreviation (StringBuilder 사용):
줄임말을 하나씩 만들어나갈 때, String 객체를 계속해서 더하기(+) 연산자로 합치면 성능이 저하될 수 있습니다. StringBuilder는 문자열을 효율적으로 추가하거나 수정할 수 있도록 설계된 클래스이므로, 이러한 작업에 매우 적합합니다. 최종적인 줄임말은 여기에 쌓이게 됩니다.
단어 순회 및 규칙 적용 (for 루프):
for 루프를 사용하여 words 배열의 각 단어를 순서대로 검사합니다.
i 변수는 현재 단어의 인덱스를 나타냅니다. i가 0이면 해당 단어가 문장의 첫 번째 단어라는 의미입니다.
if (uselessWords.contains(word) && (i != 0)) 조건문이 가장 중요합니다.
uselessWords.contains(word): 현재 단어가 "쓸모없는 단어" 목록에 있는지 확인합니다.
i != 0: 현재 단어가 문장의 첫 번째 단어가 아닌지 확인합니다.
이 두 조건이 모두 true일 경우에만 (&& 연산자) 해당 단어는 "쓸모없어서 무시해야 하는" 단어가 됩니다. 이럴 때는 continue 키워드를 사용하여 abbreviation에 아무것도 추가하지 않고 다음 단어로 넘어갑니다.
위 if 문에 해당하지 않는 모든 경우 (즉, "쓸모없는 단어"가 아니거나, "쓸모없는 단어"이지만 첫 번째 단어인 경우)에는 abbreviation.append(word.charAt(0)); 코드를 통해 해당 단어의 첫 번째 문자(charAt(0))를 abbreviation에 추가합니다.
최종 출력 (toUpperCase()):
모든 단어 처리가 끝나면, StringBuilder에 저장된 줄임말을 toString() 메소드로 String 타입으로 변환합니다.
그 후, toUpperCase() 메소드를 사용하여 변환된 문자열의 모든 글자를 대문자로 바꾼 뒤, System.out.println()으로 최종 결과를 출력합니다.
br.close();: BufferedReader 자원을 닫아준다.

코드로 구현

package baekjoon.baekjoon_30;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set;

// 백준 3181번 문제
public class Main1139 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        // 1. "쓸모없는 단어"들을 저장할 HashSet을 선언하고 초기화합니다.
        // HashSet은 검색 속도가 빨라 단어가 쓸모없는 단어인지 빠르게 확인할 수 있습니다.
        Set<String> uselessWords = new HashSet<>();
        uselessWords.add("i");
        uselessWords.add("pa");
        uselessWords.add("te");
        uselessWords.add("ni");
        uselessWords.add("niti");
        uselessWords.add("a");
        uselessWords.add("ali");
        uselessWords.add("nego");
        uselessWords.add("no");
        uselessWords.add("ili");

        // 2. 한 줄로 주어진 문장을 입력받습니다.
        String sentence = br.readLine();

        // 3. 입력받은 문장을 공백을 기준으로 단어들로 분리합니다.
        // split(" ") 메소드는 공백 하나를 기준으로 문자열을 분리하여 String 배열로 반환합니다.
        String[] words = sentence.split(" ");

        // 4. 줄임말을 저장할 StringBuilder를 선언합니다.
        // StringBuilder는 문자열을 효율적으로 추가하고 수정할 수 있게 해줍니다.
        StringBuilder abbreviation = new StringBuilder();

        // 5. 분리된 단어들을 순회하면서 줄임말 규칙을 적용합니다.
        for(int i = 0; i < words.length; i++) {
            String word = words[i]; // 현재 단어
            // 현재 단어가 "쓸모없는 단어" 목록에 포함되는지 확인합니다.
            // && (논리 AND) 연산자를 사용하여 두 조건이 모두 참일 때만 무시할지 결정합니다.
            // 괄호를 사용하여 조건의 우선순위를 명확히 합니다.
            if(uselessWords.contains(word) && (i != 0)) { // (조건 1)쓸모없는 단어이고 (조건 2)첫 번째 단어가 아니라면
                // 이 경우는 무시해야 하는 단어이므로 아무것도 하지 않고 다음 단어로 넘어갑니다.
                continue; // 현재 반복을 건너뛰고 다음 반복으로 넘어갑니다.
            }
            // 그 외의 모든 경우 (쓸모없는 단어가 아니거나, 쓸모없는 단어이지만 첫 번째 단어인 경우)에는
            // 해당 단어의 첫 글자를 줄임말에 추가합니다.
            // charAt(0)은 문자열의 첫 번째 문자를 반환합니다.
            abbreviation.append(word.charAt(0));
        }

        // 6. 완성된 줄임말을 모두 대문자로 변환하여 출력합니다.
        // toString() 메소드로 StringBuilder 내용을 String으로 변환한 후,
        // toUpperCase() 메소드로 모든 문자를 대문자로 변경합니다.
        System.out.println(abbreviation.toString().toUpperCase());
        br.close(); // BufferedReader를 사용했으면 닫아주는 것이 좋습니다.
    }
}

마무리

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

profile
Junior backend developer

0개의 댓글