ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • section4.1
    알고리즘 2025. 8. 7. 20:57
    학급 회장을 뽑는데 후보로 기호 A, B, C, D, E 후보가 등록을 했습니다.
    투표용지에는 반 학생들이 자기가 선택한 후보의 기호(알파벳)가 쓰여져 있으며 선생님은 그 기호를 발표하고 있습니다.
    선생님의 발표가 끝난 후 어떤 기호의 후보가 학급 회장이 되었는지 출력하는 프로그램을 작성하세요.
    반드시 한 명의 학급회장이 선출되도록 투표결과가 나왔다고 가정합니다.
    
    입력설명
    첫 줄에는 반 학생수 N(5<=N<=50)이 주어집니다.
    두 번째 줄에 N개의 투표용지에 쓰여져 있던 각 후보의 기호가 선생님이 발표한 순서대로 문자열로 입력됩니다.
    
    출력설명
    학급 회장으로 선택된 기호를 출력합니다.
    
    입력예제 1
    15
    BACBACCACCBDEDE
    
    출력예제 1
    C

     

     

     

    ANSWER

    public class Question1 {
        public static void main(String[] args) {
            Question1 T = new Question1();
            Scanner sc = new Scanner(System.in);
            int n = sc.nextInt();
            String str = sc.next();
            System.out.println(T.solution(n, str));
        }
    
        public String solution (int n, String str) {
            String answer = "";
    
            // list로 쪼개서 담기
            List<String> strList = new ArrayList<>();
            for (int i=0; i<n; i++) {
                strList.add(str.substring(i, i+1));
            }
    
            // list에 같은 단어이면 +1 숫자 함께 담기
            HashMap<String, Integer> rslt = new HashMap<>();
            Integer max = -1;
            for (String s : strList) {
                if (!rslt.containsKey(s)) {
                    rslt.put(s,0);
                } else {
                    rslt.put(s, rslt.get(s) + 1);
                }
    
                if (max < rslt.get(s) + 1) {
                    max = rslt.get(s);
                }
            }
    
            // {A=2, B=2, C=4, D=1, E=1}
            // max, value 비교해서 최댓값 뽑기
            for (String key : rslt.keySet()) {
                if (rslt.get(key) == max) {
                    answer = key;
                }
    
            }
            return answer;
        }
    }

    정답은 맞혔지만 특정 메서드들을 몰랐기 때문에 정답과 비교했을 때 코드가 길어졌다

     

     

     

    SOLUTION

    public class Answer1 {
        public static void main(String[] args) {
            Answer1 T = new Answer1();
            Scanner sc = new Scanner(System.in);
            int n = sc.nextInt();
            String str = sc.next();
            System.out.println(T.solution(n,str));
        }
    
        private char solution(int n, String s) {
            char answer = ' ';
    
            HashMap<Character, Integer> map = new HashMap<>();
            for (char x : s.toCharArray()) {
                map.put(x, map.getOrDefault(x, 0)+1);
            }
    
            int max = Integer.MIN_VALUE;
            for (char key : map.keySet()) {
                if (map.get(key) > max) {
                    max = map.get(key);
                    answer = key;
                }
            }
            
            return answer;
        }
    }
    • toCharArray : 문자열을 문자형 배열로 변환할 수 있다
    • map.getOrDefault 가 생각이 안나서 if 문이 추가로 더 들어갔다
    • map.ketSet() 사용법이 익숙하지 않아서 구글링 도움을 받았다
      • entrySet을 사용하면 모든 key, value값을 꺼낸다
      • keySet을 사용하면 모든 key값을 꺼낸다
    • 참고. HashMap은 데이터를 저장할 때 key, value가 짝을 이루어 저장되며 key값으로 해시함수를 실행한 결과를 통해 저장 위치를 결정한다. 따라서 특정 데이터의 저장위치를 해시함수를 통해 바로 알 수 있기 때문에 데이터의 추가, 삭제, 특히 검색이 빠르다는 장점이 있다
    728x90
Designed by Tistory.