본문 바로가기
Programming/Algorithm(ACM Problems)

[백준] 1371번 : 가장 많은 글자 / [자바] JAVA / 학습기록

by jongmln_ 2022. 1. 16.

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

 

1371번: 가장 많은 글자

첫째 줄부터 글의 문장이 주어진다. 글은 최대 50개의 줄로 이루어져 있고, 각 줄은 최대 50개의 글자로 이루어져 있다. 각 줄에는 공백과 알파벳 소문자만 있다. 문장에 알파벳은 적어도 하나 이

www.acmicpc.net


[백준] 1371번 : 가장 많은 글자
입출력예제


[전체 코드]

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int[] count = new int[26]; //알파벳을 셀 카운트 배열
		for(int i=0;i<26;i++) { //카운트 배열 초기화
			count[i] = 0;
		}
		while(sc.hasNext()) { //hasNext() 입력값유무를 boolean값으로 변환해주는 함수
			String str = sc.nextLine();
			for(int j=0;j<str.length();j++) {
				if(str.charAt(j) >= 'a' && str.charAt(j) <= 'z') {
					//공백을 입력받았을때 오류가 발생하지 않기 위해서 a~z 조건문
					int index = str.charAt(j) - 'a';
					//아스키코드를 이용하여 카운트배열 인덱스 계산
					count[index]++;
					//위에서 공백입력을 걸러주지 않으면 이부분에서
					//공백 아스키넘버를 인덱스로 넣기때문에 오류발생
				}
			}
		}
		int max = count[0];
		//배열값이 하나일 수도 있으니 첫번째 배열 대입
		for(int i=0;i<26;i++) {
			if(count[i] > max) {
				max = count[i];
				//카운트 젤 많이 된 값 찾기
			}
		}
		//젤 많이 된값이 여러개일 경우 다 출력해야 되기 때문에 다시 한번 max를 이용해서 반복문
		for(int i=0;i<26;i++) {
			if(max == count[i]) {
			//max값과 값이 같다면 다 출력
				System.out.print((char)(i+97));
				// 현재 i 에 97(소문자 a)만큼 더하여 문자로 변환후 출력
			}
		}
		
	}
	
}

 

[제출 결과]

위의 런타임에러 (ArrayIndexOutOfBounds) 는 배열에서 선언되지 않은 인덱스를 호출하면 발생되는 오류이다.

문장을 입력받는과정에서 공백을 걸러주지 않아서 생긴 오류인데 자꾸 배열 인덱스를 넘어선다고 생각해 오타가 있는지 이리저리 살펴봤는데 알고보니 공백 아스키코드가 배열 인덱스를 넘어서고 있어서 유레카한 순간이다.


이번 가장많은글자 문제는 새로운것에 대해 많이 배울 수 있는 문제였다. 아직 기초 단계여서 한참 배울게 많지만 백준문제를 풀어나가기에 조금 유익한걸 배운것 같달까 그중 먼저 EOF 라는것인데 EOF란 "End Of File"을 뜻한다.

즉 컴퓨터가 알아서 FILE의 끝 백준에서는 입력의 끝을 알아차리도록 하는것이다.

말로만 들으면 쉽지않다고 생각할 수도 있는데 다행히도 찾아보니 자바에는 비슷한 라이브러리 함수가 구현되어 있다.

hasNext() 라는 함수이다.

 

hasNext() 함수

hasNext()함수는 간단히 말해 현재 입력창 다음에 오는 값이 있는지 없는지를 True, False Boolean값으로 변환해주는 함수라고 생각하면 편하다.