1157번-단어 공부

Dev StoryTeller·2020년 12월 12일
0
post-thumbnail

0. 문제

알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.
자세한 문제는 여기서
(https://www.acmicpc.net/problem/1157)


1. 풀이

import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
	static void solution(String list) {
		int max = 0;
		char answer = ' ';
		
        // 알파벳을 숫자에 대응
        int[] answerList = new int[26];
        
        // 문자열을 배열로 변환
        list = list.toUpperCase();
        char[] charList = list.toCharArray();
        
        // 문자-'A'를 이용하여, 문자를 숫자에 대응
        for(char item : charList) {
        	answerList[item-'A']++;
        }
        
        // 최댓값 해결하기
        for(int i=0; i<26; i++) {
        	if(max < answerList[i]) {
        		max = answerList[i];
        		answer = (char)('A'+i);
        	}
        	else if(max == answerList[i]) {
        		answer = '?';
        	}
        }
        
        System.out.println(answer);
    }
	public static void main (String[] args)
	{
		Scanner sc = new Scanner(System.in);
		
		String list = sc.next();
		solution(list);
	}
}

2. 설명

이 풀이의 핵심은 바로 "문자를 정수의 관점으로 보는 것!"이다.

모든 컴퓨터들은 문자를 그 자체로 인식하지 못한다.
숫자라던가 무언가 다른 것으로 바꿔야 인식할 수 있다.
"문자를 인코딩"해야 한다는 것이다.
아스키 코드는 그런 문자 인코딩 중 대표적인 것이다.

아스키 표를 보면, 알파벳은 다음과 같이 대응된다.

알파벳이 자연 증가하는 아스키 값에 대응되는 것을 볼 수 있다.

그럼 알파벳에 A에 해당하는 65를 빼면..? 다음과 같이 된다.

알파벳이 인덱스와 대응되게 된다.
즉, Map을 쓰지 않고도 인덱스가 알파벳인 배열을 만든 것이다!!

이것을 알면 이제 아주 간단해진다.
어떤 알파벳을 받더라도 대응되는 인덱스에 값을 넣어주면 된다.
A를 받으면 'A'-'A'인 인덱스(0)에 +1을 한다.
B도 마찬가지고 모든 문자가 다 똑같다.
아래의 코드는 바로 그런 뜻이다.

// 문자-'A'를 이용하여, 문자를 숫자에 대응
        for(char item : charList) {
        	answerList[item-'A']++;
        }

3. 결론

내가 직접 풀은 게 아니라는 것이 가장 아쉬웠다.
하루종일 고민해도 도무지 뭔지 모르겠어서, 다른 사람들의 풀이를 참조하였다...ㅠㅜ

그렇지만 알파벳 같은 문자를 char형이 아닌, int형 정수로도 볼 수 있다는 새로운 관점을 열어주었다.

문자는 문자끼리, 정수는 정수끼리 사용해야 한다고정 관념에서 벗어나게 해준 좋은 문제라고 생각한다 : )

profile
개발을 이야기하는 개발자입니다.

0개의 댓글