백준 빅데이터 vs 정보보호 vs 인공지능

KIMYEONGJUN·2025년 11월 12일
0
post-thumbnail

문제

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

첫 번째 줄에 물어본 학생의 수 N이 주어진다. (1 ≤ N ≤ 10^5)
두 번째 줄에 메모장에 적힌 답들이 한 줄의 문자열로 주어진다.
문자열은 B, S, A로만 구성되어 있다.

첫 번째 줄에 가장 많은 학생의 관심을 받는 분야의 문자를 출력한다.
만약 가장 많은 학생의 관심을 받는 분야가 2개라면, B, S, A의 순서로 모두 출력한다.
만약 세 분야의 관심이 동일하면, SCU를 출력한다. (SCU는 Seoul Cyber University의 약자이다.)

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

입력값 읽기:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));: 콘솔(표준 입력)로부터 데이터를 한 줄씩 읽기 위한 BufferedReader 객체를 생성한다. 
System.in은 바이트 단위 입력이므로, 이를 InputStreamReader를 통해 문자 단위로 변환한 뒤 BufferedReader에 연결하는 것이다.
int N = Integer.parseInt(br.readLine());: br.readLine()을 통해 첫 번째 줄에 입력된 문자열을 읽어온다. 
이 문자열은 학생 수 N을 나타내므로, Integer.parseInt() 메서드를 사용하여 정수형으로 변환한 후 N 변수에 저장한다.
String preferences = br.readLine();: br.readLine()을 다시 호출하여 두 번째 줄에 입력된 학생들의 선호도 문자열(예: "SBSBA")을 읽어와 preferences 변수에 저장한다.
선호도 횟수 초기화 및 계산:
int countB = 0; int countS = 0; int countA = 0;: 'B'(빅데이터), 'S'(정보보호), 'A'(인공지능)를 선택한 학생 수를 세기 위한 세 개의 정수 변수를 0으로 초기화한다.
for(int i = 0; i < N; i++): 이 for 반복문은 N 변수를 직접 사용하여 0부터 N-1까지 정확히 N번 반복합니다. 이는 N명의 학생 각각의 선호도를 한 명씩 확인하는 과정이다.
char c = preferences.charAt(i);: preferences 문자열에서 i번째 위치에 있는 문자(학생의 선호 분야)를 가져와 char 타입의 c 변수에 저장한다. 
예를 들어, preferences가 "SBSBA"이고 i가 0이면 c는 'S', i가 1이면 'B'가 된다.
if(c == 'B') { countB++; } else if (c == 'S') { countS++; } else if (c == 'A') { countA++; }: c에 저장된 문자가 'B', 'S', 'A' 중 어느 것인지 확인하여, 해당하는 분야의 count 변수 값을 1 증가시킨다. 
이 반복문이 끝나면 각 count 변수에는 해당 분야를 선택한 총 학생 수가 들어있게 된다.
최대 선택 횟수 찾기:
int maxCount = Math.max(countB, Math.max(countS, countA));
Math.max(a, b): 두 개의 숫자 a와 b 중에서 더 큰 값을 반환하는 자바의 유용한 수학 함수이다.
이 라인은 countB, countS, countA 세 분야의 선택 횟수 중에서 가장 큰 값을 찾아 maxCount 변수에 저장한다. 
이 maxCount는 가장 많은 학생들이 선택한 분야의 '횟수'를 나타낸다.
결과 생성 및 출력:
StringBuilder sb = new StringBuilder();: 최종적으로 출력할 문자열을 만들기 위한 StringBuilder 객체를 생성한다.
StringBuilder는 여러 문자를 효율적으로 조합하고 수정할 수 있어서 문자열을 자주 변경하는 경우에 String 객체보다 성능이 좋다.
가장 우선적인 조건 확인: if(countB == countS && countS == countA)
이 조건문은 countB, countS, countA 세 변수의 값이 모두 같은지 확인한다. 
문제에서 세 분야의 관심이 동일하면 "SCU"를 출력하라고 명시했기 때문에 가장 먼저 이 조건을 검사한다.
조건이 참(true)이면 System.out.println("SCU");를 실행하여 "SCU"를 출력한다.
그 외의 경우 (else 블록):
세 분야의 횟수가 모두 같지 않을 때 실행되는 블록입니다. 이때는 한 분야만 maxCount이거나, 두 분야가 maxCount일 수 있다.
if(countB == maxCount) { sb.append('B'); }: countB 값이 maxCount와 같으면 sb에 'B' 문자를 추가한다.
if(countS == maxCount) { sb.append('S'); }: countS 값이 maxCount와 같으면 sb에 'S' 문자를 추가한다.
if(countA == maxCount) { sb.append('A'); }: countA 값이 maxCount와 같으면 sb에 'A' 문자를 추가한다.
이 세 if 문은 독립적으로 순서대로 실행된다. 
따라서, 'B'와 'S'가 maxCount와 같으면 sb에는 "BS"가 추가되는 식으로, 문제에서 요구하는 'B, S, A 순서'의 문자열이 만들어진다.
System.out.println(sb.toString());: StringBuilder에 최종적으로 만들어진 문자열을 toString() 메서드를 통해 String으로 변환한 후 콘솔에 출력한다.
자원 해제:
br.close();: 더 이상 사용하지 않는 BufferedReader 객체의 자원을 시스템에 반환하여 해제한다.

코드로 구현

package baekjoon.baekjoon_31;

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

// 백준 30957번 문제
public class Main1204 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine()); // 학생 수 N 읽기
        String preferences = br.readLine();      // 선호도 문자열 읽기

        // 각 분야별 선택 횟수를 저장할 변수 초기화
        int countB = 0;
        int countS = 0;
        int countA = 0;

        // 선호도 문자열을 순회하며 각 분야의 횟수를 계산
        // N을 직접 사용하여 루프를 돕니다.
        for(int i = 0; i < N; i++) { // N번 반복
            char c = preferences.charAt(i); // preferences 문자열에서 i번째 문자 가져오기
            if(c == 'B') {
                countB++;
            } else if (c == 'S') {
                countS++;
            } else if (c == 'A') {
                countA++;
            }
        }

        // 가장 높은 선택 횟수(최대값) 찾기
        int maxCount = Math.max(countB, Math.max(countS, countA));

        // 결과를 저장할 StringBuilder 생성
        StringBuilder sb = new StringBuilder();

        // 1. 세 분야 모두 관심도가 같을 경우 "SCU" 출력
        if(countB == countS && countS == countA) {
            System.out.println("SCU");
        }
        // 2. 그 외의 경우 (한 분야 또는 두 분야가 최대값일 경우)
        else {
            // 'B'가 최대값과 같으면 결과에 'B' 추가
            if(countB == maxCount) {
                sb.append('B');
            }
            // 'S'가 최대값과 같으면 결과에 'S' 추가
            if(countS == maxCount) {
                sb.append('S');
            }
            // 'A'가 최대값과 같으면 결과에 'A' 추가
            if(countA == maxCount) {
                sb.append('A');
            }
            // 최종 결과 출력
            System.out.println(sb.toString());
        }

        br.close(); // BufferedReader 닫기
    }
}

마무리

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

profile
Junior backend developer

0개의 댓글