Algorithm/문자열
[백준 1157] 단어 공부
09009
2023. 12. 25. 23:55
문제 보기
https://www.acmicpc.net/problem/1157
1157번: 단어 공부
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.
www.acmicpc.net
처음 해결한 풀이
//https://www.acmicpc.net/problem/1157
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String word = br.readLine();
word = word.toUpperCase();
Map<String, Integer> map = new HashMap<>();
for (int i=0; i<word.length(); i++) {
String letter = word.substring(i, i+1);
if (!map.containsKey(letter))
map.put(letter, 1);
else
map.put(letter, map.get(letter)+1);
}
int maxValue = 0;
for (String key : map.keySet())
maxValue = Math.max(maxValue, map.get(key));
int cnt = 0;
String answer = "";
for (String key : map.keySet()) {
if (map.get(key) == maxValue) {
cnt++;
answer = key;
}
}
if (cnt >= 2) {
System.out.println("?");
} else {
System.out.println(answer);
}
}
}
문제는 맞았으나, 엄청난 메모리와 시간이 소요되었다.
반복문 안에서 문자열을 자르고 다시 합치는 작업은 코드의 비효율을 야기한다고 한다.
그래서 코드를 개선하였더니
//https://www.acmicpc.net/problem/1157
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String word = br.readLine().toUpperCase();
Map<Character, Integer> map = new HashMap<>();
int maxValue = 0;
for (char letter : word.toCharArray()) {
map.put(letter, map.getOrDefault(letter, 0)+1);
maxValue = Math.max(maxValue, map.get(letter));
}
int cnt = 0;
char answer = 0;
for (char key : map.keySet()) {
if (map.get(key) == maxValue) {
cnt++;
answer = key;
}
}
if (cnt >= 2) {
System.out.println("?");
} else {
System.out.println(answer);
}
}
}
그나마 시간과 메모리 측면에서 나아지긴 했다.
그래도 마음에 안들어서 인터넷에 있는 풀이를 참고하고 아스키코드를 활용하여 코드를 개선했다.
소스 코드 (최종 답안)
//https://www.acmicpc.net/problem/1157
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String word = br.readLine().toUpperCase();
int[] arr = new int[26];
for (int i=0; i<word.length(); i++)
arr[word.charAt(i) - 'A']++;
int maxValue = -1;
char answer = '?';
for (int i=0; i<arr.length; i++) {
if (arr[i] > maxValue) {
maxValue = arr[i];
answer = (char) (i+65);
} else if (arr[i] == maxValue) {
answer = '?';
}
}
System.out.println(answer);
}
}