▶ 문제
https://www.acmicpc.net/problem/1157
1157번: 단어 공부
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.
www.acmicpc.net
▶ 설명
입력으로 대소문자가 모두 들어오지만 출력은 대문자로 해야하기 때문에 대문자로 입력문자를 모두 변환해 주는 과정이 먼저 필요하다.
입력된 단어에서 가장 많이 쓰인 알파벳을 찾으려면 몇 개가 쓰였는지를 체크해주어야 한다.
그러기 위해서는 알파벳 카운트를 할 수 있는 배열을 만들어 주도록 한다.
알파벳 길이는 26이므로 26크기의 정수형 배열을 선언/초기화 한다.
Mississipi 이라는 단어가 입력되었다면 알파벳 배열로 카운트하는 매커니즘은 다음과 같다.
(1) Mississipi 입력
(2) MISSISSIPI 대문자로 변환
(3) 한 글자마다 해당 알파벳 위치에 1 더하기
M : index 12 인 곳에 +1
I : index 8 인 곳에 +1
S : index 18 인 곳에 +1
S : index 18 인 곳에 +1
I : index 8 인 곳에 +1
S : index 18 인 곳에 +1
S : index 18 인 곳에 +1
I : index 8 인 곳에 +1
P : index 15 인 곳에 +1
I : index 8 인 곳에 +1
이렇게 되면 누적되는 곳이 생기고 누적된 값의 합을 구해 최대값을 구해주면 정답을 출력할 수 있게 된다.
배열로 표시해보자면 다음과 같다.
zZa 단어도 추가해 보았다.
▶ 문제 풀이
🌱 풀이.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int alph[] = new int[26];
String s = br.readLine().toUpperCase();
int max = 0;
char ch = ' ';
for (int i = 0; i < s.length(); i++) {
int idx = s.charAt(i) - 'A';
alph[idx]++;
if (max < alph[idx]) {
max = alph[idx];
ch = s.charAt(i);
} else if (max == alph[idx]) {
ch = '?';
}
}
System.out.println(ch);
}
}
입력된 단어를 대문자로 변환해주기 위한 메소드로 toUpperCase()를 사용하였다.
'A' 대신 65를 써 줘도 된다. character 에서 'A' 를 빼면 ABCD ... 알파벳 순서대로 0부터 번호를 가지게 할 수 있다.
s.charAt(i) 가 M 이라면 변수 idx 에는 12가 들어가게 되는 것 처럼 말이다.
char 형에 null 값을 주기 위해서는 작은 따움표를 이용하였다.
정수형 변수를 0으로 초기화 해주는 것 과 같다고 볼 수 있다.
최대값을 구한 다음에
최대값이 1개일 때 최대값을 가진 인덱스를 이용해 해당 알파벳을 반환하고, 최대값이 여러개일 경우 '?' 문자를 반환한다.
▶ Log
'백준 알고리즘 > 문자열' 카테고리의 다른 글
[JAVA 자바] 백준 2908번 : 상수 (0) | 2022.06.06 |
---|---|
[JAVA 자바] 백준 1152번 : 단어의 개수 (0) | 2022.06.05 |
[JAVA 자바] 백준 2675번 : 문자열 반복 (0) | 2022.06.03 |
[JAVA 자바] 백준 10809번 : 알파벳 찾기 (0) | 2022.06.02 |
[JAVA 자바] 백준 11720번 : 숫자의 합 (0) | 2022.06.01 |