
내가 생각했을때 문제에서 원하는부분
첫 번째 줄에 물어본 학생의 수 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 닫기
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.