Back-End공부하는 Hero의 개발공부일기
article thumbnail

 

백준 문제집의 "대기업 코테에서 나오는 유형 모음"을 풀고 있는데 최근에 검색 관련 API를 만들면서 검색단어의 빈도수를 구해야 하는 경우가 있었다. 해당 문제를 보고 그때가 생각이 났고, 어렵지 않게 풀 수 있었다. 

 

백준 1157번 단어 공부

 

문제 풀이

문제가 단순명료하여 바로 문제 풀이를 진행하려고 한다.  

 

1. 대소문자로 이루어진 단어를 입력받는다. 
2. 대소문자를 구분하지 않고 가장 많이 사용된 알파벳을 찾는 것임으로 모든 알파벳을 "대문자"로 치환한다 (출력이 대문자라서)
3. 사용빈도가 제일 높은 알파벳이 중복해서 존재하면 "?"을 리턴하고 아니면 사용빈도가 제일 높은 알파벳 대문자를 출력한다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;

// 1157번 - 단어공부
public class Main {
	public static void main(String[] args) throws IOException {
       // 가장 높은 빈도를 가진 알파벳 찾기
       int maxFrequency = 0;
       char mostFrequentChar = ' ';
       Map<Character, Integer> charMap = new HashMap<>();
	       
	   // 입력을 효율적으로 처리하기 위해 BufferedReader를 사용하여 입력을 받음
	   BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	   
	   // 빈도수 분석할 문자열 입력받음
	   StringTokenizer str = new StringTokenizer(br.readLine());

	   // 대소문자 구분하지 않기 위해 모든 알파뱃 대문자로 치환
	   String word = str.nextToken().toUpperCase();
	   
	   // 문자열을 분해하여 빈도수 저장
	   for(char c : word.toCharArray()) {
		   charMap.put(c, charMap.getOrDefault(c, 0)+1);
	   }
	   
	   for(Map.Entry<Character, Integer> c : charMap.entrySet()) {
		   if(maxFrequency < c.getValue()) {
			   maxFrequency = c.getValue();
			   mostFrequentChar = c.getKey();
		   } else if(maxFrequency == c.getValue()) { // 최고빈도수가 중복된다면 '?' 출력
			   mostFrequentChar = '?';
		   }
	   }
	   
	   // 답 출력
	   System.out.println(mostFrequentChar);
	}
}

 

마무리

난이도가 쉬운 문제였지만 재밌게 풀었다. 문제를 다 풀고 나서 다른 사람들은 어떻게 풀었나 검색해 보았는데 정말 다양한 방법들이 많이 있어서 흥미로웠다.

 

무엇보다 내가 제출한 정답의 메모리 보다 적고 속도도 거의 절반으로 줄인 코드들이 많이 있어서 진짜 대단한 사람들이 많고 아직 부족하다고 느꼈다.

앞으로는 더 적은 자원을 사용하고 효율이 높은 로직을 작성해야겠다고 생각했다. 

profile

Back-End공부하는 Hero의 개발공부일기

@Back-Hero

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!