티스토리 뷰

 

문제 풀러가기✍🏻

 


문제

알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.

 

입력

첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.

출력

첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.

시행착오(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];

 

단, 대문자와 소문자를 구분하지 않는다.

대소문자를 구분하지 않고 계산하는 방법은 두 가지가 있을 수 있다.

  1. toUpperCase() (또는 toLowerCase()) 사용
  2. 조건문을 사용하여 소문자인 경우와 대문자인 경우를 분기

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) {}
    }
}
댓글
공지사항