Java/백준알고리즘

[Java] 백준알고리즘 #1157 단어 공부

Sehyeok20 2021. 3. 23. 21:03
반응형

백준알고리즘 #1157 단어 공부 문제

입력받은 단어에서 가장 많이 사용된 알파벳을 구하는 문제이다.

 

 

먼저 대소문자를 구분하지 않으므로 입력받은 문자열을 toUpperCase() 함수를 이용해 대문자로 바꿔준다.

이후 각 알파벳이 얼마나 쓰였는지 확인할 배열 count[] 를 생성해주고 크기를 26(알파벳 수)로 잡는다.

그리고 for문을 이용해 각 charAt() 함수로 입력받은 문자열을 하나 하나 잘라서 count[a.charAt(i)-65] 를 증가시킨다.

여기서 a.charAt(i)-65 는 입력받은 알파벳을 아스키코드로 변환하여 65를 빼면 A의 경우 0, B의 경우 1 .. 이 나온다.

즉 ABCD를 입력받았다면 

a.charAt(0) - 65 는 0

a.charAt(1) - 65 는 1

a.charAt(2) - 65 는 2

a.charAt(3) - 65 는 3

이 되는 것이다.

이처럼 count[ (알파벳 순서) ] 를 문자열이 끝날때 까지 반복시켜 증가시킨 후 이 중 최대값을 max 변수에 넣는다.

String a = sc.next();
a = a.toUpperCase();

int[] count = new int[26];
int max = 0;

for (int i = 0; i < a.length(); i++) {
	count[a.charAt(i) - 65]++;
	if (max < count[a.charAt(i) - 65]) {
		max = count[a.charAt(i) - 65];
	}
}

 

이후 다시 for문을 이용하여 max와 count[i](각 알파벳이 사용된 횟수)를 비교해본다.

max와 count[i]가 같을때마다 check를 1씩 증가시키고,

check가 1보다 크다면 결과를 저장할 res변수에 ? 를 저장하고 아니라면 (char)(i + 65) 를 저장한다.

(char)(i + 65)는 아까 알파벳 순서대로 저장하기 위해 65를 뺀 값을 다시 더해주어 아스키코드로 변환한 것이다.

char res = 0;
int check = 0;

for (int i = 0; i < count.length; i++) {
	if (max == count[i]) {
		check++;
		if (check > 1) {
			res = '?';
		} else {
			res = (char) (i + 65);
		}
	}

}

 

이후 res를 출력해주면 완성.

 

 

전체 코드를 보면 다음과 같다.

import java.util.Scanner;

public class Back1157 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String a = sc.next();
		a = a.toUpperCase();

		int[] count = new int[26];
		int max = 0;
		char res = 0;
		int check = 0;

		for (int i = 0; i < a.length(); i++) {
			count[a.charAt(i) - 65]++;
			if (max < count[a.charAt(i) - 65]) {
				max = count[a.charAt(i) - 65];
			}
		}

		for (int i = 0; i < count.length; i++) {
			if (max == count[i]) {
				check++;
				if (check > 1) {
					res = '?';
				} else {
					res = (char) (i + 65);
				}
			}

		}

		System.out.println(res);

	}

}
반응형