문제를 읽고 그리 어렵게 느껴지지 않았는데 막상 코딩을 하려보니 만만치 않음을 느꼈다.

해결 방법을 위해 알아보던 중 아스키코드를 이용해 풀 수 있었다.

(그 동안 아스키코드 관련 문제를 풀어본적이 없어서 생각해 내지 못한 것 같다.)

아래는 내가 짠 코드이다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Main {

	public static void main(String[] args)throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		String str = br.readLine();
		int[] arr = new int[26]; //A~Z 모든 알파벳 수만큼 배열 크기 설정

		for(int i=0; i<arr.length; i++) { // 초기값 0으로 설정
			arr[i]=0;
		}
		str = str.toUpperCase(); //입력된 문자열을 모두 대문자로 변경

		for(int i=0; i<str.length(); i++) {
			arr[(int)str.charAt(i)-65]++;  
		}                                  
		/* 입력 받은 문자열에서 첫번째부터 하나하나 (int)형으로 해줘서 아스키코드 값을 받고 65를 빼줘서
		   해당 알파벳의 배열 위치에 카운팅 숫자를 하나 올려주는 for문이다 
		   (입력받은 문자열 하나하나 대응되는 아스키코드 값에 65(A의 아스키 코드값)를 빼주면
		   0부터 26까지 배열 위치를 A~Z까지 대응되게 만들 수 있다) */
		int max = 0;
		char result='?';
		for(int i=0; i<arr.length; i++) {
			if(max<arr[i]) {
				max=arr[i];
				result=(char)(i+65);  /*현재까지 가장 큰 카운팅 값을 가지고 있는 알파벳을
				                       담기 위해 해당 숫자의 아스키코드값을 받고있다*/
			}
			else if(max==arr[i]) { // 가장 많이 사용된 알파벳이 2개이상 존재하는 경우 '?' 를 담는다
				result='?';
			}
		}
		bw.write(result + "\n");
		bw.flush();
	}
}

이 문제의 핵심은 대소문자 구별을 안하기 때문에 받은 문자열을 소문자 혹은 대문자로 바꿔주는 것과 아스키 코드값을 잘 활용하는 것이다. 나는 입력받은 문자열을 모두 대문자로 바꿔주는 방법을 선택하였다(출력값은 대문자로 출력되야 하기 때문) 해당 메소드는 toUpperCase() 이다.

그리고 A의 아스키 코드값은 65이다. 배열은 0부터 위치가 시작되므로 A값을 0에, Z를 25에 위치시켰으므로 배열 위치번호를 통해 해당 알파벳을 보려면 (배열 위치숫자+65)를 char로 형변환하면 아스키코드를 통한 해당 알파벳을 알 수 있다.

소스를 통한 해설은 주석을 참고 바란다.

 

처음에는 for문은 5개정도 사용해서 문제를 풀었다. 너무 지저분해 보여서 for문을 줄이는 방법을 생각하던중 마지막 for문처럼 만들어낼 수  있었다.

 

반응형

+ Recent posts