• [백준/JAVA] 1157번 단어 공부

    2021. 10. 20.

    by. 하루플스토리

    반응형

    안녕하세요, 하루플 입니다.

    이번 문제는 아스키코드를 활용하여 풀 수 있는 문제입니다.

     

    문제

    알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.

     

    입력

    첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.

     

    출력

    첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.


     

    [풀이]

    //단어 읽기
    		for(int i=0; i<word.length(); i++) {
    			if('A'<= word.charAt(i) && word.charAt(i) <= 'Z') { //대문자 범위
    				arr[word.charAt(i) - 'A']++; //해당 인덱스 값 1 증가
    			}
    			
    			else { //소문자 범위
    				arr[word.charAt(i) - 'a']++;
    			}
    		}

    i를 단어 길이만큼 반복합니다.

    대문자 범위만큼 찾아서 존재하면 arr[i] 의 인덱스 값을 증가시켜야하는데요,

    대문자 A의 아스키 코드 : 65, 소문자 a 의 아스키코드 : 97 입니다.

     

    즉, - 65를 해도되고 -'A' 라고 한다면 자동으로 -65로 인식하여 적용되므로 아무거나 사용하시면 됩니다.

    이렇게 arr[i] 배열에서 존재하는 문자 부분을 증가 시킵니다.

     

    마찬가지 방법으로 else 문을 사용하여 소문자도 증가시킵니다.

    이렇게 해야하는 이유는 대문자 A, 소문자a 가 존재한다고 찾으면 같은 인덱스를 증가시켜야 하기 때문입니다.

     

     

    //배열 순회 반복문
    		for(int i=0; i<26; i++) {
    			if(arr[i] > max) {
    				max = arr[i];
    				ch = (char) (i+65); //대문자로 출력해야하므로 65를 더한다.
    			}
    			else if(arr[i] == max) {
    				ch = '?';
    			}
    		}

    그다음 for문 입니다.

    이제 배열을 풀어서 가장 큰 수가 무엇인지 찾고, 해당 수에 맞는 대문자를 출력해야합니다.

    만약 가장 큰 수와 max 가 동일하다면 ? 를 출력합니다.

     

    max를 -1로 초기화한 이유는 보통 관행상 음수로 표기하는 것이라 예외가 발생하지 않는 안전한 수라면 어떤 수로든 초기화해도 무방하다고 하네요! 처음 알았습니다..ㅎㅎ

     

    쉬운듯 하면서 조금 생각할게 있었던 문제였네요😅

     

    아래는 문제 풀면서 참고한 사이트입니다.

    https://st-lab.tistory.com/64

    반응형

    댓글