[백준,BOJ 1157] 단어 공부(JAVA 구현)
코테/백준 온라인 저지(BOJ)

[백준,BOJ 1157] 단어 공부(JAVA 구현)

반응형

-해법

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        
        int arr[] = new int[26]; // 알파벳 사용 횟수 저장 배열
        String alph = in.nextLine(); // 단어 입력
        int max = 0,position = 0, cnt = 0; // 최대 사용 단어 찾기 연산에 사용할 변수
        
        alph = alph.toLowerCase(); // 대소문자 구분이 없기 때문에 모두 소문자로 변환
        
        for(int i=0;i<alph.length();i++) { // a의 아스키 코드값을 빼주어 인덱스에 활용
        	arr[alph.charAt(i)-97]++; // 해당 알파벳 등장 시 1개씩 증가
        }
        
        for(int i=0;i<arr.length;i++) { // 알파벳 등장 횟수가 저장된 배열을 탐색 	
        	if(max<arr[i]) { // 최대 사용 횟수 알파벳을 찾는다.
        		max = arr[i]; // 해당 알파벳의 등장 횟수
        		position = i; // 해당 알파벳의 인덱스 값
        		cnt = 0; // 최대 사용 횟수 알파벳의 개수를 초기화
        	}else if(max!=0 && max == arr[i]) { // 배열이 0으로 초기화 되있으므로 0이 아닌 경우와 최대 값이 동일한 알파벳이 등장 시
        		cnt++; // 최대 사용 알파벳 개수를 증가
        	}
        }
        if(cnt != 0) // 최대 사용 알파벳 개수가 1번이라도 증가했으면
        	System.out.println("?"); // 무엇이 최대 사용 알파벳인지 알 수 없다
        else // 최대 사용 알파벳 개수가 증가하지 않았다면
        	System.out.println(Character.toUpperCase((char)(position+97))); // 해당 알파벳의 인덱스에 다시 +97 수행 후, 대문자로 변환
        
        in.close();
        
    }
}

  이 문제는 아스키코드 문제를 풀 때 사용했던 방법을 응용하였다.

 

  1. 알파벳 26개의 배열을 선언 (0~25 인덱스 사용)

  2. 아스키코드에서 'a'는 97이므로 -97 시 'a'는 0, 'b'는 1.... 이므로 위에서 선언한 배열의 인덱스로 활용 가능.

  3. 입력받은 알파벳을. toLowerCase() 메서드를 이용해 소문자로 변환.

  4. 알파벳들을 탐색하며 등장할 때 마다 해당 알파벳의 인덱스 배열의 값을 증가.

  5. 배열에 저장된 값들을 탐색하여 최대 등장 횟수의 알파벳을 찾는다.

  6. 최대 등장 횟수의 알파벳을 만날 때 마다 cnt(최대 등장 횟수 알파벳의 개수)를 0으로 초기화.

  7. 최대 등장 횟수가 0이 아니면서, 기존의 최대 등장 횟수와 같은 경우는 동일한 횟수로 등장한 알파벳이 존재한다는 의미이므로 cnt를 증가.

  8. 모든 과정이 끝났을 때, cnt가 0이면 최대 등장 횟수의 알파벳은 1개라는 의미이므로 해당 인덱스에 다시 +97 후 toUpperCase() 메서드를 이용해 대문자로 출력

  9. cnt가 0이 아닌 경우는 최대 등장 횟수 알파벳이 2개 이상이라는 소리이므로 ? 를 출력한다.

 

 


  처음 풀이 후 제출 했을 때 오답처리되어 고민하면서 다양한 테스트 케이스를 입력해보았을 때, 'aaddsss'에서 걸리는 경우가 있었다. 이러한 현상은 배열을 끝까지 탐색하지 않고 최대 등장 횟수의 알파벳이 2개 이상일 경우 바로?를 출력하고 프로그램을 종료시켜서 나타났다.

 

  이러한 문제를 해결한 것이 위의 풀이이다. 아 복잡해 

 

반응형