[ Baekjoon ] 1157번 ( Bronze I ) : 단어 공부 (Java)

ma.caron_g·2021년 12월 8일
0
post-thumbnail

1. Problem 📃

[ 단어 공부 ]

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


[ 문제 ]

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

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

2. Input 📇

[ 입력 ]

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


3. Output 📠

[ 출력 ]

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


4. Example 📚

[ 입출력 예시 ]

예제 입력예제 출력
Mississipi?
zZaZ
zZ

5. Solution 🔑

  1. 입력 받은 문자열을 문자열.toUpperCase()를 이용하여 대문자로 변경해주고
    (문자를 검사했을 때 소문자와 대문자를 구분하면 아스키 코드를 값을 구분해서 빼주어야하므로 하나로 통일.)
    문자열.toCharArray();를 이용하여 문자 배열(input)에 문자 하나씩 배열에 저장해준다.

  2. 알파벳의 개수를 세어줄 정수형 배열(Alphabet)을 알파벳 A~Z의 개수만큼 선언.

  3. 배열에 존재하는 문자를 하나씩 확인하며
    해당 문자에 - 'A'(A의 아스키코드 값(65))을 빼주면 몇 번째 문자(알파벳)가 있는지 알 수 있으며
    그에 해당하는 인덱스 값을 증가(++)시키며 단어들의 개수를 세어준다.

  4. 증가 시킬 때, 개수의 최대값(max)보다 크다면 해당 문자의 개수로 max값을 변경하여주고, 인덱스를 해당 문자 인덱스로 지정해준다.

  5. 다시 알파벳 개수를 나타내는 배열(Alphabet)을 확인하면서 가장 많았던 본인 인덱스가 아니고, 최댓값이 같은 배열이 있으면 똑같은 개수의 알파벳이 있는 것이므로 "?"를 출력하고 종료한다.

  6. 그렇지 않다면 가장 많이 있는 알파벳을 출력해준다. (n번 째 인덱스 + 'A'(65))
알파벳(아스키코드 값)A(65)B(66)C(67)D(68)...Z(90)
순서0123...26

6. Code 💻

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));
		char[] input = br.readLine().toUpperCase().toCharArray();
		int[] Alphabet = new int[26];
		
		int max = 0;
		int index = 0;
		
		for(int i=0; i<input.length; i++) {
			Alphabet[input[i]-65]++;
			if(Alphabet[input[i]-65] > max) {
				max = Alphabet[input[i]-65];
				index = input[i]-65;
			}
		}
		for(int i=0; i<Alphabet.length; i++) {
			if(i != index && Alphabet[i] == max) {
				System.out.println("?");
				System.exit(0);
			}
		}
		System.out.println((char)(index+65));
	}

}
profile
다른 사람이 만든 것을 소비하는 활동보다, 내가 생산적인 활동을 하는 시간이 더 많도록 생활화 하자.

0개의 댓글