문제
영어에서는 어떤 글자가 다른 글자보다 많이 쓰인다. 예를 들어, 긴 글에서 약 12.31% 글자는 e이다.
어떤 글이 주어졌을 때, 가장 많이 나온 글자를 출력하는 프로그램을 작성하시오.
입력
첫째 줄부터 글의 문장이 주어진다. 글은 최대 50개의 줄로 이루어져 있고, 각 줄은 최대 50개의 글자로 이루어져 있다. 각 줄에는 공백과 알파벳 소문자만 있다. 문장에 알파벳은 적어도 하나 이상 있다.
출력
첫째 줄에 가장 많이 나온 문자를 출력한다. 여러 개일 경우에는 알파벳 순으로 앞서는 것부터 모두 공백없이 출력한다.
이 포스팅을 시작하고 처음으로 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 사용법에 대해 알아본 것 같다.
이상입니다!