본문 바로가기

Algorithm

[JAVA]백준 1157 - 단어 공부

 

백준의 1157번 문제 단어 공부이다.

 

문제는 문자열이 주어지는데, 가장 많이 사용되는 알파벳이 무엇인지 알아내면 되겠다.

그 중 가장 눈에 띄는 부분은 "단, 대문자와 소문자를 구분하지 않는다."이다. 

이를 보고 모든 문자를 대문자나 소문자로 변경하여 푼다면 쉽게 풀리지 않을까? 라는 생각을 했다.

 

문자의 코드값을 안다면 충분히 쉽게 풀릴 문제이다.

 

 

문자 코드 값

시작해보자.

 

1. 가장 먼저 알파벳들의 인덱스의 갯수가 추가될 int형 배열 arr을 추가한다. 

어차피 가장 많은 값을 출력시키기 때문에 초기화는 0으로 해주었다.

 

2. 입력받은 모든 문자를 대문자화 시켜주었다.

소문자와 대문자는 구분하지 않고 알파벳의 갯수만 센다 했으니 대소문자는 굳이 필요가 없어 모두 대문자로 진행했다.

충분히 소문자로도 진행 가능하지만, 대문자로 해보고 싶었다.

 

3. 대문자로 변경한 문자열을 알파벳 하나하나 알파벳 배열(arr)의 인덱스에 추가한다.

for문을 사용해 문자열 전체 길이를 하나하나 스캔했고, 각 알파벳의 코드값에서 대문자 중 코드값이 가장 작은 'A'를 빼준 index에 1씩 더해준다.

 

4. 입력받은 문자열이 모두 스캔되어 카운팅된 arr의 max값을 구해 가장 많이 이용된 알파벳을 추출한다.

for문을 사용해 arr을 모두 스캔하고, 가장 많은 값을 max 변수에 담는다. 그리고, 가장 많이 카운팅된 index와 'A'의 코드값을 더해 대문자로 출력할 수 있도록 한다.

만약 max값이 여러개 있을 경우에는 ?를 출력할 수 있도록 else if문을 사용했다.

 

여기서 주의할 점은 한 단어를 사용해야 할 때는 String이 아닌  char을 사용해야 한다. 그래야 문자의 코드값을 추출할 수 있다.

또한, char은 ""를 사용하지 못하고, ' '만 사용할 수 있다.

char a = "A" (X) / char a = 'A' (O)

 

 

전체 코드

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

public class problem1157 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int[] arr = new int[26];
        for(int i = 0; i < arr.length; i++) {
            arr[i] = 0;
        }

        String n = br.readLine().toUpperCase();
        int max = 0;
        char ch = '?';

        for(int i = 0; i < n.length(); i++) {
            arr[n.charAt(i) - 'A']++;
        }

        for(int i = 0; i < 26; i++) {
            if(arr[i] > max) {
                max = arr[i];
                ch = (char)(i + 65);
            } else if(arr[i] == max) {
                ch = '?';
            }
        }
        System.out.println(ch);
    }
}