728x90

https://www.acmicpc.net/problem/1157

 

1157번: 단어 공부

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

www.acmicpc.net

문제

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

 

풀이

대소문자 상관없이 가장 많이 사용된 알파벳을 대문자로 출력하는 문제이다.

 

알파벳의 개수를 세기 위해 크기가 26인 배열을 만든다.

문자열을 입력받아 알파벳에 따라 0 ~ 25의 수로 변경하여 개수를 체크한다.

이후 개수가 가장 큰 알파벳을 대문자로 출력하고, 여러 개일 경우 "?"를 출력한다.


🔔 자세한 코드 설명은 더보기 란에 작성하였습니다.

더보기

1. 문자열을 입력받고, 크기가 26인 배열을 생성한다.

String S = br.readLine();
int[] alphabet = new int[26];

 

2. 문자열의 길이만큼 반복한다.

2-1. charAt() 메서드를 사용하여 아스키코드값을 입력받는다.

2-2. 아스키코드값이 'a'와 'z' 사이일 경우, 'a'를 빼서 0 ~ 25 사이의 숫자로 만들어 배열의 값에 1을 더한다.

2-3. 아스키코드값이 'A'와 'Z' 사이일 경우, 'A'를 빼서 0 ~ 25 사이의 숫자로 만들어 배열의 값에 1을 더한다.

for(int i = 0; i < S.length(); i++) {
    int ASCII = S.charAt(i);
    if(ASCII >= 'a' && ASCII <= 'z') alphabet[ASCII - 'a']++;
    else if(ASCII >= 'A' && ASCII <= 'Z') alphabet[ASCII - 'A']++;
}

 

3. 최댓값을 찾는데 필요한 변수들을 선언한다.(max : 최댓값, maxIndex : 최댓값을 갖는 알파벳, dup : 중복 여부)

int max = 0;
int maxIndex = -1;
boolean dup = false;

 

4. 배열의 크기인 26만큼 반복문을 돌린다.

4-1. i번째 알파벳이 나온 빈도가 max보다 큰 경우, max에는 i번째 알파벳의 빈도수를, maxIndex에는 i + 'A'을, dup에는 false를 저장한다. (i + 'A'를 저장하는 이유 : 해당 알파벳을 대문자로 출력하기 위함, dup에 false를 저장하는 이유 : max보다 크기 때문에 값이 중복되지 않는다는 의미)

4-2. i번째 알파벳이 나온 빈도가 max와 같은 경우, dup에 true를 저장한다.(이미 저장되어 있던 max와 같다는 것은 최대 빈도수를 가진 알파벳이 최소 2개 이상이라는 뜻)

for(int i = 0; i < 26; i++) {
    if(alphabet[i] > max) {
        max = alphabet[i];
        maxIndex = i + 'A';
        dup = false;
    } else if(alphabet[i] == max) dup = true;
}

 

5. 반복문이 종료되었을 때, dup이 true일 경우(최대 빈도 숫자가 여러 개일 경우), "?"를 출력하고, 아닐 경우 maxIndex를 char 형으로 변환하여 출력한다.

if(dup) System.out.println("?");
else System.out.println((char)(maxIndex));

코드

BufferedReader 클래스를 이용한 코드

import java.io.*;

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

        String S = br.readLine();
        int[] alphabet = new int[26];

        for(int i = 0; i < S.length(); i++) {
            int ASCII = S.charAt(i);
            if(ASCII >= 'a' && ASCII <= 'z') alphabet[ASCII - 'a']++;
            else if(ASCII >= 'A' && ASCII <= 'Z') alphabet[ASCII - 'A']++;
        }

        int max = 0;
        int maxIndex = -1;
        boolean dup = false;

        for(int i = 0; i < 26; i++) {
            if(alphabet[i] > max) {
                max = alphabet[i];
                maxIndex = i + 'A';
                dup = false;
            } else if(alphabet[i] == max) dup = true;
        }

        if(dup) System.out.println("?");
        else System.out.println((char)(maxIndex));
    }
}

틀린 부분이 있다면 정정해 주시면 감사하겠습니다.
궁금한 부분이 있거나, 다른 아이디어가 있으시면 자유롭게 댓글 남겨주세요!

728x90

+ Recent posts