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);
	}
}