티스토리 뷰

문제
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.
입력
출력
첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.
시행착오(Trial&Error)

51580503 - 컴파일 에러
Main.java:25: error: cannot find symbol
Arrays.sort(arr);
^
symbol: variable Arrays
location: class Main
1 error
해석 : 컴파일러가 symbol을 이해하지 못한다.
여기서 symbol은 보통 우리가 선언한 변수 등을 가르킨다.
Arrays클래스의 sort메서드를 호출하려면, java.util.Arrays클래스를 import해야 한다.
51635938 - 틀렸습니다
출력할 값을 저장할 변수 result를 char타입으로 초기화할 때 0으로 초기화하지 말고 '?'으로 초기화하자.
51636416, 51636573 - 출력 초과
혼자 값을 출력하려고 작성했던 코드 System.out.println(arr); 코드를 답으로 인식해서 출력 초과가 발생했다. 지워주자.
풀이(Solution)
BufferedReader로 입력을 받는 방법과 Scanner로 입력을 받는 방법 중 성능 차이를 제외하면 무엇을 써도 상관 없을거라 생각한다.
char형 리터럴 'A'가 65라는 것과 'Z'가 90이라는 것을 이해할 수 있어야 한다.
특정 알파벳이 몇번 사용됐는지를 계산하기 위해 int형 배열을 선언하고 0으로 초기화한다. 알파벳은 총 26개이다.
int[] arr = new int[26];
단, 대문자와 소문자를 구분하지 않는다.
대소문자를 구분하지 않고 계산하는 방법은 두 가지가 있을 수 있다.
- toUpperCase() (또는 toLowerCase()) 사용
- 조건문을 사용하여 소문자인 경우와 대문자인 경우를 분기
toUpperCase() (또는 toLowerCase()) 사용
String s = br.readLine().toUpperCase();
위 메서드를 사용하면 대, 소문자를 따로 경우의 수를 나눠서 생각할 필요가 없어진다.
조건문을 사용하여 소문자인 경우와 대문자인 경우를 분기
for(int i = 0; i < s.length(); i++) {
if('a' <= s.charAt(i) && s.charAt(i) <= 'z') {
arr[s.charAt(i) - 97]++;
} else {
arr[s.charAt(i) - 65]++;
}
}
이렇게 char 리터럴의 범위에 따라 나눠서 생각하는 방법도 있다.
예를 들어, m은 26개의 알파벳 중 13번째이다.
m이라는 값을 셀 때, m도 arr[12], M도 arr[12]로 간주해야 한다.
'a'가 97이고, 'A'가 65라는 것을 알고 있다면, 두 가지 경우 arr['m' - 'a']를 다음과 같이 계산할 수 있다.
arr['M' - 'A']
-> arr[77 - 65]
-> arr[12]
arr['m' - 'a']
-> arr[109 - 97]
-> arr[12]
코드
1. toUpperCase() 사용
// 대문자 or 소문자 하나로 통일
// 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.
import java.io.*;
import java.util.Arrays;
class Main {
public static void main(String[] args) {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine().toUpperCase(); // 소문자로 통일
int[] arr = new int[26]; // arr[0] ==65 arr[25] == 0=90
for(int i = 0; i < s.length(); i++) {
arr[s.charAt(i) - 65]++;
}
char result = '?';
int max = -1;
for(int i = 0; i < 26; i++) {
if(max < arr[i]) {
max = arr[i];
result = (char)(i + 65);
} else if(max == arr[i]) {
result = '?';
}
}
System.out.println(result);
} catch(IOException e) {}
}
}
2. toUpperCase() 사용
import java.io.*;
import java.util.Arrays;
class Main {
public static void main(String[] args) {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine(); // 소문자로 통일
int[] arr = new int[26]; // arr[0] ==65 arr[25] == 90
for(int i = 0; i < s.length(); i++) {
if('a' <= s.charAt(i) && s.charAt(i) <= 'z') {
arr[s.charAt(i) - 97]++;
} else {
arr[s.charAt(i) - 65]++;
}
}
char result = '?';
int max = -1;
for(int i = 0; i < 26; i++) {
if(max < arr[i]) {
max = arr[i];
result = (char)(i + 65);
} else if(max == arr[i]) {
result = '?';
}
}
System.out.println(result);
} catch(IOException e) {}
}
}'알고리즘 > 문제풀이 - 백준' 카테고리의 다른 글
| [백준 2908번] 상수(JAVA) (0) | 2022.11.14 |
|---|---|
| [백준 1152번] 단어의 개수(JAVA) (0) | 2022.11.13 |
| [백준 2675번] 문자열 반복(JAVA) (0) | 2022.11.11 |
| [백준 10809번] 알파벳 찾기(JAVA) (0) | 2022.11.10 |
| [백준 11720번] 숫자의 합(JAVA) (0) | 2022.11.09 |

