Glion 의 안드로이드 개발노트
[백준] 1157번 단어공부 - Java(자바) 본문
오늘의 백준 문제 1157번 단어공부
본래 하루 한문제씩 풀고자 마음먹었지만, 오늘 풀었던 파트 문제가 간단한 것들이 많아 총 5문제를 풀었고, 그중 1157번에서 살짝 헤매었기에 해당 문제를 포스팅한다.
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.
<입력>
첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.
<출력>
첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.
풀이
우선 문제에서 대소문자를 구분하지 않는다고 했으니, 전부 대문자로 바꾸고 시작한다.
단어에서 가장 많이 사용된 알파벳을 출력해야 한다. 그럴려면 우선 각 알파벳이 몇번 사용되었는지 카운트 해야 한다고 생각했고,
HashMap을 사용하여 key를 단어로, 값에 횟수를 넣어주자고 생각했다.
for 문을 돌며 HashMap.containsKey함수를 사용하여 포함되어있으면 해당 단어를 key로 하는 value에 1을 더해 다시 저장했다.
HashMap의 특성상 동일한 key에 다른 value가 추가되면 같은 key의 다른 value를 추가하는 것이 아닌, 이미 존재한 key의 value 를 업데이트 해준다.(동일한 키는 여러개 존재할 수 없으므로)
그 뒤, HashMap.keySet() 을 통해 현재 존재하는 key를 전부 반복하며 최대값을 가지는 value를 찾고, answer 에 해당 key를 저장해두고 , 만약 현재 최대값과 key에 해당하는 value 가 동일하다면 answer에 ? 를 저장한다.
최종적으로 answer 를 리턴시켜주면 끝이난다.
누가 볼지 모르겠지만, 풀이만 보고 코드를 보기 싫은 사람을 위해 공백을 좀 두고 아래에 코드를 쓰겠다. 혹시 여기까지 보고 직접 짜보고 싶은 사람도 있을테니...(사실 내가 그렇다. 도저히 안풀리는 문제에 대해 온전한 코드보다 풀이를 먼저 보고싶어한다. 나같은 사람도 있을수 있잖아..)
import java.io.*;
import java.util.*;
public class Num5 {
public String solution(String str) {
String answer = "?";
char[] c = str.toUpperCase().toCharArray();
int count = 1;
int max = 0;
HashMap<Character, Integer> map = new HashMap<>();
for (char x : c) {
if (!map.containsKey(x)) {
count = 1;
} else {
count = map.get(x) + 1;
}
map.put(x, count);
}
for (char x : map.keySet()) {
if (map.get(x) > max) {
max = map.get(x);
answer = String.valueOf(x);
}else if(map.get(x)==max){
answer = "?";
}
}
return answer;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Num5 t = new Num5();
System.out.println(t.solution(br.readLine()));
}
}
결과는 정답이다.