실습/백준
단어 공부 - 1157번 (Java 풀이)
chobyeonggyu03
2024. 7. 19. 23:03
반응형
문제
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.
입력
첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.
출력
첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.
예제 입력 1
Mississipi
예제 출력 1
?
예제 입력 2
zZa
예제 출력 2
Z
예제 입력 3
z
예제 출력 3
Z
예제 입력 4
baaa
예제 출력 4
A
나는 이 문제를 처음봤을 떄 가장 먼저 들었던 생각은 if문에 (대문자 || 소문자) 의 조건을 넣어 카운팅하여 카운팅 갯수가 가장 큰놈을 출력하고 중간중간 값이 동일한 문자가 있으면 가장최근에 동일했던 문자와 비교하여 ?를 출력하거나 가장 많이 카운팅 된 문자를 출력하는 형식의 문제풀이 방법을 떠올랐기에 해당 방법으로 풀이를 진행해보려 했으나 저번에 풀었던 아스키 코드를 활용해 그많던 if문을 한줄로 요약한 것이 생각나 이번에도 아스키 코드를 활용할 수 있지 않을까 곰곰히 생각해보게 되었고, Character 클래스의 toUpperCase() 메서드를 활용해 소문자를 모두 대문자로 바꿔 저번 알고리즘을 활용하면 될 것 같아 해당 방법으로풀이를 진행해보았다.
package BAEKJOON_1157;
/*
날짜: 2024.07.19.금
내용: 백준 1157번 문제 (단어 공부)
*/
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class BAEKJOON_1157 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader (new InputStreamReader(System.in));
String str = br.readLine();
int[] arr = new int[26]; // 문자마다 갯수 카운틸항 길이26짜리 배열선언
int maxCount = 0; // 가장 많은 카운팅 횟수 저장
int tempCount =0; // 카운팅 수가 같을 때 그 카운팅 횔수 저장할 변수
char maxChar = 'A'; // 가장 많이 중복된 문자저장
for(int i=0; i<26; i++) { // 배열의 각자리 카운팅 0으로 초기화
arr[i] = 0;
System.out.printf("arr"+i+": %d개 ", arr[i]);
}
System.out.println();
for(int i=0; i<str.length(); i++) { // 배열의 각자리에 해당 문자 중복 카운팅
char ch = Character.toUpperCase(str.charAt(i));
arr[ch - 'A'] += 1;
}
System.out.println("카운팅 테스트");
for(int i=0; i<26; i++) { // 배열의 각자리 카운팅 제대로 됐는지 테스트
System.out.printf("arr"+i+": %d개 ", arr[i]);
}
System.out.println();
for(int i=0; i<26; i++) { // 중복횟수 가장많은 문자 선별하는 for문
if( arr[i] > maxCount) { // maxCount보다 클경우 해당 문자 maxChar로 저장
maxCount = arr[i];
maxChar = (char)(i+ 'A');
}else if( arr[i] == maxCount) { // 카운팅 수가 같은적이 있다면 가장 최근에 중복된 카운팅 횟수 저장
tempCount = maxCount;
}
}
System.out.println("maxCount: " +maxCount);
System.out.println("tempCount: " +tempCount);
if(maxCount > tempCount) { // 단독으로 카운팅 젤 많은 문자 출력
System.out.println(maxChar);
}else if(maxCount == tempCount) { // 중복된 카운팅이 있을 경우 ? 문자 출력
System.out.println("?");
}
}
}
저번에 학습한 내용을 응용하여 이 문제를 혼자 힘으로 풀게 되어 너무 기쁘다 (찌야아아아아스~~)
반응형