본문 바로가기

# 프로그래밍 개발/04. 알고리즘 문제풀이

백준 1371번 [가장 많은 글자] 문제 풀이 - BufferedReader java 입출력

반응형

백준 알고리즘 1371번 가장 많은 글자 문제 풀이

문제

영어에서는 어떤 글자가 다른 글자보다 많이 쓰인다. 예를 들어, 긴 글에서 약 12.31% 글자는 e이다.

어떤 글이 주어졌을 때, 가장 많이 나온 글자를 출력하는 프로그램을 작성하시오.

입력

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

출력

첫째 줄에 가장 많이 나온 문자를 출력한다. 여러 개일 경우에는 알파벳 순으로 앞서는 것부터 모두 공백없이 출력한다.

예제 입력과 예제 출력 결과 첫번째
예제 입력과 예제 출력 결과 첫번째
예제 입력과 예제 출력 결과 두번째부터 네번째
예제 입력과 예제 출력 결과 두번째 부터 네번째
예제 입력과 예제 출력 결과 다섯번째
예제 입력과 예제 출력 결과 다섯번째

출처

  • 문제를 번역한 사람: baekjoon
  • 데이터를 추가한 사람: djm03178
  • 문제의 오타를 찾은 사람: jaehoo1

알고리즘 분류

 

알고리즘 코드 제출 결과
코드 제출 결과이다. 무슨 짓을 하였길래 출력 초과의 결과를 얻은 것일까

이 포스팅을 시작하고 처음으로 4년전에 제출한 코드를 만난 것 같다. 하지만 결과는 출력 초과와 틀렸습니다가 보이니 4년전에도 알고리즘 코드 작성은 서툴었던 모양이다. 아니면 C++로 작성하는 것이 어려웠던 것일지도 모르겠다. 

먼저 정답을 받은 JAVA 코드부터 공개하겠다. 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;

//1371
public class Main {
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String input;
		int[] arr = new int[26];
		int i;
		while ((input = br.readLine()) != null){
			for (i = 0; i<input.length(); i++){
				if (!input.substring(i, i + 1).equals(" ")){
					arr[(int)input.substring(i, i + 1).charAt(0) - 97]++;
				}
			}
		}
		br.close();
		int maxValue = Integer.MIN_VALUE;
		for (i = 0; i<arr.length; i++){
			if (maxValue < arr[i]){
				maxValue = arr[i];
			}
		}
		for (i = 0; i<arr.length; i++){
			if (arr[i] == maxValue){
				System.out.print((char)(i + 97));
			}
		}
	}
}

최근 자바를 사용하지 않아, 자바 코드를 볼때마다 새로운 것 같은 느낌이 든다. 

BufferedReader가 잘 기억이 나지 않아 새로 찾아봤다. 

BufferedReader 는 

Scanner와 유사한 역할을 한다. 즉, 입력 값을 받는역할을 하며 Scanner 대신 사용한 이유는 속도 측면에서 훨씬 빠르게 처리가 가능하기 때문이다. 그 이유는 입력된 데이터가 바로 전달되지 않고 버퍼를 거쳐 절달되기 때문에 데이터 처리의 효율성이 높기 때문이다. Scanner 대신 BufferedReader를 사용한 이유는 당시 코딩 테스트 중 일부가 빠른 속도를 요구하는 문제들이 등장해 Scanner 를 사용하여 코드를 제출할 시 오답을 받았던 것 같다. 솔직히 별 차이는 없어 보이지만 조금이라도 더 높은 점수를 받고 싶은 분들은 Scanner 이외에도 다른 입력 방식이 존재하고 있다는 것을 알고 계셔야 할 것 같다. 아니 오히려 이 함수를 평소부터 사용하는 것이 좋을지도 모르겠다. 

BufferedReader를 사용하기 위해서는 아래의 라이브러리 import가 필요하니 꼭 기억하도록 하자. 

import java.io.BufferedReader;
import java.io.InputStreamReader;

사실 이클립스나 여러 툴에서는 그냥 적어도 자동으로 해주긴 하지만, 코딩테스트에서는 그런 것 없기 때문에 외워둬야 한다. 안 그러면 사용을 못 하니까 말이다. 

오늘 포스팅은 백준 알고리즘 포스팅으로 시작했지만 우연히 다시 만난 

BufferedReader 사용법에 대해 알아본 것 같다. 

이상입니다! 

반응형