728x90
반응형

https://www.acmicpc.net/problem/1157

 

1157번: 단어 공부

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

www.acmicpc.net

 

 

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String s = br.readLine();
        s = s.toUpperCase(); //전부 대문자로 바꾸기
        int[] al = new int[26];

        for(int i=0;i<s.length();i++){
            al[s.charAt(i)-65]++; //A의 아스키코드 값이 65라서 알파벳 순서대로 index가 됨
        }

        int max = -1;
        int ch = -2;

        for(int i=0;i<26;i++){
            if(max < al[i]){
                max = al[i];
                ch = i;
            }
            else if(max == al[i]){
                ch = -2; //이게 핵심이었다고 생각함. 아래 글로 서술하겠음
            }
        }

        System.out.println((char)(ch+65)); //아스키코드 63은 ?임
    }
}

 

이 문제에서 핵심은 else if문에서 (max == al[i])일 때 ch = -2로 설정한 부분!

 

문제에서 까다로웠던 조건이 알파벳의 개수가 최대인 것들이 여러 개 존재하면 ?를 출력하라는 부분이었다.

이 부분을 짜려고 max 값을 구한 후에 다시 순회하면서 max값이랑 같은 값을 같은 애들을 count 했었는데,,,

 

위의 코드에서는 for문 한번으로 max값도 찾고 중복의 경우까지 다 걸렀다..!

max값이 결정되지 않은 상태에서 else if문으로 ch가 -2가 되더라도 상관없다!

왜냐면 진짜 max값이 나오면 다시 ch를 업데이트하니까!

그리고 처음으로 만난 가장 큰 값이 max를 차지할거고, 만약에 그 이후에 max와 같은 크기의 값이 나오면 그때 ch가 최종으로 -2로 업데이트될 것이다..!

와 진짜 이 코드 짠 사람 천잰가봐,,, 오늘도 천재들의 머리에 감탄하고 간다...

 

아 나는 HashMap도 쓰고 난리를 쳤는데 위의 방법이 이 문제에서는 더 간단하고 효율적으로 동작하길래 다른 분들 답안 참고해서 바꿨다ㅎㅎ

부끄럽지만 HashMap으로 푼 코드도 아래에 첨부한다,,ㅎ

 

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String s = br.readLine();
        s = s.toUpperCase();

        HashMap<Character,Integer> map = new HashMap<Character,Integer>();
        for(int i=0;i<s.length();i++){
            map.put(s.charAt(i), map.getOrDefault(s.charAt(i),0)+1);
        }

        int max = -1;
        char key = '0';
        char max_key = '0';
        int cnt=0;

        Iterator iter = map.keySet().iterator();
        while(iter.hasNext()){
            key = (char)iter.next();
            int value = map.get(key);
            if(max < value){
                max = value;
                max_key = key;
            }
        }

        iter = map.keySet().iterator();
        while(iter.hasNext()){
            key = (char)iter.next();
            if(map.get(key) == max)
                cnt++;
        }

        if(cnt != 1)
            System.out.println("?");
        else
            System.out.println(key);
    }
}

 

아 그리고 아래 코드는 자바에서 중복되는 값을 셀 때 유용한 코드!

해시맵이 getOrDefault라는 함수를 갖고 있는데 조회했을 때 있으면 그 값을 반환, 없으면 default를 0(설정가능)을 반환해요!

그럼 그 값에 +1 해서 put해주면 중복해서 count를 해주겠죠! 

이 문제 풀면서 파이썬 count를 얼마나 쓰고 싶었는지!!!ㅠㅠ

 

구글링하다가 발견해서 소장용으로 기록~!

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String s = br.readLine();
        s = s.toUpperCase();

        HashMap<Character,Integer> map = new HashMap<Character,Integer>();
        for(int i=0;i<s.length();i++){
            map.put(s.charAt(i), map.getOrDefault(s.charAt(i),0)+1);
        }
    }
}
728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기