백준 온라인 저지에서 문제를풀어보자 #3(1371번: 가장많은 글자)
안녕하세요 저번 포스팅에 이어서 이번에도 문자열 처리관련 문제를 들고왔습니다.
https://www.acmicpc.net/problem/1371
문제
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.
입력
첫째 줄부터 글의 문장이 주어진다. 글은 최대 5000글자로 구성되어 있고, 공백, 알파벳 소문자, 엔터로만 이루어져 있다. 그리고 적어도 하나의 알파벳이 있다.
출력
첫째 줄에 가장 많이 나온 문자를 출력한다. 여러 개일 경우에는 알파벳 순으로 앞서는 것부터 모두 공백없이 출력한다.
라는 문제인데요
전 이번 문제를 풀이할때는 가장많이 사용된 알파벳을 카운트 하기위해 알파벳의 갯수와 같은 크기의
int 형 배열을 만들었습니다.
그다음에는 카운트가 저장될 int형 변수 max를 선언하고
Sacnner의 .hasNextLine()함수를 이용해 입력을 받았습니다.
그뒤에는 라인단위로 입력을받아
res[(int)(tmp.charAt(i)-'a')]++; 라는 부분을 통해서 아스키 코드값을 이용해 해당하는 인덱스의 값을 증가시키고
해당하는 인덱스의 값과 앞에서 선언한 최대 출현갯수인 max와 비교하는 부분을 추가해 최대값을 저장시켰습니다.
그이후엔 for문을 통해 res[]배열안에서 max와 같은 값을 가지고있는 인덱스를
(char)(i+'a')를 통해 다시 알파벳으로 바꾸어 출력시키는 방식으로 프로그램을 작성했습니다.
다만 문제가 있다면 로컬에서 해당 소스를 돌렸을때 EOF처리를 하지못해 결과를 볼수 없었는데요
결국 이대로 작성해서 제출을 했습니다. ㅠㅠ
다행이 백준 온라인저지에서는 알아서 EOF문제를 해결해주네용
알고리즘 문제는 입출력을 분리해서 가지고 있으면 빨리 풀 수 있습니다.
C/C++ 로 할때는 패턴이 있었는데
입력은 scanf, fgets 로 변수는 전역으로...
Java 는 Scanner 를 써야 하니 코딩량이 많아져서 기억하기 안좋은 것 같더군요...
넵 아무래도 C++같은경우에는
while(getline(cin, str)) {
for(int i=0; i<str.length(); i++) {
a[str[i] - 'a'] ++;
}
} 처럼 getLine함수 하나만 가져다 쓰면 되는데 자바에서는 스캐너 따로 객체를 생성하고 생성한객체에서 해당하는 함수를 사용하는등 불편한점이 많이 있더라구요 ㅎㅎ 다만 이미 ㅠㅠ 다른언어는까먹고 자바만 생각이나서 자바로 문제에대한 해설을 올리고 있습니다. ㅎㅎ 보팅&댓글 항상 감사합니다 ㅎㅎㅎ 다음엔 더좋은 소스를 포스팅할 수 있도록 노력하겠습니다. ㅎㅎ