[백준/BOJ] 1157번_단어 공부 (C++/Java)

JIMIN·2023년 2월 3일

BOJ_Bronze

목록 보기
57/75

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

문제


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


입력


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


출력


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



💻 예제 입력

Mississipi
zZa

💻 예제 출력

?
Z

풀이


아스키코드로 ‘A’~’Z’는 65~90, ‘a’~’z’는 97~122이기 때문에, 여기에 ‘A’, 즉 65를 빼서 ‘A’~’Z’는 0~25, ‘a’~’z’는 32~57로 만듦.

그리고 여기서 소문자일 경우를 생각해 32로 나눈 나머지를 구한 후 인덱스로 사용하면 ‘A&a’ ~ ‘Z&z’ = 0~25가 됨.

그 후 최댓값을 찾고 최댓값의 인덱스도 함께 얻은 뒤, 최댓값을 제외한 다른 원소들과 비교하여 최댓값과 같은 원소가 있는지 찾음.

출력할 때는 ‘A’에 index를 더해서 해당 알파벳을 만들어 출력하고, 중복값이 있는 경우에는 ? 를 출력함.


C++ 소스코드


#include <iostream>
using namespace std;

int main(void)
{
    string word;
    cin >> word;
    int max = 0, index = 0, count[30] = {0};
    
    // 알파벳 수 카운트 하기
    for (int i = 0; i < word.length(); i++)
        count[(word[i] - 'A') % 32] += 1;
    
    // 최댓값 찾기
    for (int j = 0; j < 26; j++)
    {
        if (count[j] > max) {
            max = count[j];
            index = j;
        }
    }
    
    // 최댓값 중복 찾기
    for (int j = 0; j < 26; j++)
    {
        if (j != index && count[j] == max) {
            cout << "?\n";
            return 0;
        }
    }
    
    // 출력
    cout << (char)('A' + index) << "\n";
}

Java 소스코드


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));
        String word = br.readLine();

        int max = 0, index = 0;
        int[] count = new int[26];  // 알파벳 카운트

        // 알파벳 수 카운트 하기
        for (int i = 0; i < word.length(); i++)
            count[(word.charAt(i) - 'A') % 32] += 1;

        // 최댓값 찾기
        for (int j = 0; j < 26; j++)
        {
            if (count[j] > max) {
                max = count[j];
                index = j;
            }
        }

        // 최댓값 중복 찾기
        for (int j = 0; j < 26; j++)
        {
            if (j != index && count[j] == max) {
                System.out.println("?");
                return;
            }
        }

        // 출력
        System.out.println((char)('A' + index));
    }
}
profile
잘못된 코드나 정보가 있다면 알려주세요! 👋🏻

0개의 댓글