백준 알고리즘/문자열

[JAVA 자바] 백준 1157번 : 단어 공부

Sun720 2022. 6. 4. 12:01

▶ 문제

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

 

1157번: 단어 공부

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

www.acmicpc.net

 

 

 

 설명

입력으로 대소문자가 모두 들어오지만 출력은 대문자로 해야하기 때문에 대문자로 입력문자를 모두 변환해 주는 과정이 먼저 필요하다. 

입력된 단어에서 가장 많이 쓰인 알파벳을 찾으려면 몇 개가 쓰였는지를 체크해주어야 한다. 

그러기 위해서는 알파벳 카운트를 할 수 있는 배열을 만들어 주도록 한다.

알파벳 길이는 26이므로 26크기의 정수형 배열을 선언/초기화 한다.

 

Mississipi 이라는 단어가 입력되었다면 알파벳 배열로 카운트하는 매커니즘은 다음과 같다.

(1) Mississipi 입력

(2) MISSISSIPI 대문자로 변환

(3) 한 글자마다 해당 알파벳 위치에 1 더하기

       M : index 12 인 곳에 +1

        I  : index 8 인 곳에 +1

       S : index 18 인 곳에 +1

       S : index 18 인 곳에 +1

        I  : index 8 인 곳에 +1

       S : index 18 인 곳에 +1

       S : index 18 인 곳에 +1

        I  : index 8 인 곳에 +1

       P : index 15 인 곳에 +1

        I  : index 8 인 곳에 +1

 

이렇게 되면 누적되는 곳이 생기고 누적된 값의 합을 구해 최대값을 구해주면 정답을 출력할 수 있게 된다.

배열로 표시해보자면 다음과 같다.

zZa 단어도 추가해 보았다.

 

 

 

문제 풀이

🌱 풀이. 

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));
		int alph[] = new int[26];

		String s = br.readLine().toUpperCase();

		int max = 0;
		char ch = ' ';
		
		for (int i = 0; i < s.length(); i++) {
			int idx = s.charAt(i) - 'A';
			alph[idx]++;
			if (max < alph[idx]) {
				max = alph[idx];
				ch = s.charAt(i);
			} else if (max == alph[idx]) {
				ch = '?';
			}
		}
		System.out.println(ch);

	}
}

 


입력된 단어를 대문자로 변환해주기 위한 메소드로 toUpperCase()를 사용하였다.

 

 

 'A'  대신 65를 써 줘도 된다. character 에서 'A' 를 빼면 ABCD ... 알파벳 순서대로 0부터 번호를 가지게 할 수 있다.

s.charAt(i) 가 M 이라면 변수 idx 에는 12가 들어가게 되는 것 처럼 말이다.

 

char 형에 null 값을 주기 위해서는 작은 따움표를 이용하였다.

정수형 변수를 0으로 초기화 해주는 것 과 같다고 볼 수 있다. 

 

최대값을 구한 다음에 

최대값이 1개일 때 최대값을 가진 인덱스를 이용해 해당 알파벳을 반환하고, 최대값이 여러개일 경우 '?' 문자를 반환한다.

 

Log

728x90
반응형