설명
학급 회장을 뽑는데 후보로 기호 A, B, C, D, E 후보가 등록을 했습니다.
투표용지에는 반 학생들이 자기가 선택한 후보의 기호(알파벳)가 쓰여져 있으며 선생님은 그 기호를 발표하고 있습니다.
선생님의 발표가 끝난 후 어떤 기호의 후보가 학급 회장이 되었는지 출력하는 프로그램을 작성하세요.
반드시 한 명의 학급회장이 선출되도록 투표결과가 나왔다고 가정합니다.
입력
첫 줄에는 반 학생수 N(5<=N<=50)이 주어집니다.
두 번째 줄에 N개의 투표용지에 쓰여져 있던 각 후보의 기호가 선생님이 발표한 순서대로 문자열로 입력됩니다.
출력
학급 회장으로 선택된 기호를 출력합니다.
예시 입력 1
15
BACBACCACCBDEDE
예시 출력 1
C
접근 방법
우선, 입출력 될 값들을 구분한다.
입력 : n (HashMap key의 개수), str(HashMap key의 값)
출력 : HashMap의 value 중에서 가장 큰 값(max)
import java.util.*;
class Main{
public 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;
}
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
Main T = new Main();
int k = sc.nextInt();
String str = sc.next();
System.out.println(T.solution(k, str));
}
}
HashMap에 대한 간단한 분석
해쉬맵은, 자바의 Map 인터페이스의 구현체 중 하나이다. 그래서 Map의 특성인 key : value 특성을 그대로 가지고 온다.
위 그림과 같이 HashMap은 내부에 키와 값을 저장하는 자료 구조를 가지고 있다. 해시 함수를 통해 키와 값이 저장되는 위치를 결정하므로, 그 위치를 알 수 없고 삽입되는 순서와 들어 있는 위치 또한 관계가 없다.
(삽입한 순서에 따라 정렬되지 않는다.)
알고리즘 문제를 풀 때, HashMap 자료구조를 사용하며 자주 사용되는 함수들이 몇 가지 있다. 간단하게 정리해보자.
get(), getOrDefault(), keySet()
get() 함수
get()함수는 매개변수(괄호안에)의 value 값을 찾아서 출력한다.
HashMap<Character, Integer> map = new HashMap<>();
map.put('A', 1);
map.put('B', 2);
map.put('C', 3);
map.put('D', 4);
map.put('E', 5);
System.out.print(map.get('A'));
System.out.print(map.get('B'));
System.out.print(map.get('C'));
System.out.print(map.get('D'));
System.out.print(map.get('E'));
// 12345 출력
getOrDefault()함수
이 함수는 알고리즘을 풀 때 빈도가 높은 함수니까 잘 봐두는 것을 권장한다.
getOrDefault는 HashMap의 key가 있으면 그 키의 value를 가져오고, key가 없으면 무엇을 반환할지 사용자가 설정할 수 있다.
HashMap<Character, Integer> map = new HashMap<>();
for(char x : s.toCharArray()) {
map.put(x, map.getOrDefault(x, 0) + 1); //key가 있으면 value를 반환하고, 없으면 0을 반환한다. 그리고 + 1 을 하여 카운팅
}
for(char key : map.keySet()) {
System.out.println(key + " " + map.get(key));
}
// 아래와 같은 값 출력
A 3
B 3
C 5
D 2
E 2
여기서, getOrDefault(x, 0) + 2 를 한다면, value의 값들이 1씩 증가해서 나올 것이다.
또한, getOrDefault(x, 1) + 1 를 한다면, key값이 없을 때 0이 아닌 1을 반환하여 나온다.
keySet() 함수
keySet() 함수는 HashMap에 저장되어 있는 key 값을 출력해준다.
HashMap<Character, Integer> map = new HashMap<>();
map.put('A', 1);
map.put('B', 2);
map.put('C', 3);
map.put('D', 4);
map.put('E', 5);
for(char key : map.keySet()) {
System.out.print(key + " ");
}
// A B C D E 출력
이 글의 문제는 인프런 강의에서, HashMap에 대한 분석은 아래 블로그에서 참고하였습니다.
https://lordofkangs.tistory.com/78
'프로그래밍 > 알고리즘' 카테고리의 다른 글
[for each 문] - 알고리즘 공부하다 알게 된 신기한 것 (0) | 2024.02.01 |
---|---|
[알고리즘 - 인프런] 두 배열 합치기 (two pointer 단순 구현, sort 활용) (0) | 2024.02.01 |
백준 (10811) - 바구니 뒤집기 Java (0) | 2023.09.08 |
백준(5597) - 과제 안 내신 분? Java (1) | 2023.09.07 |
백준(2720) - 세탁소 사장 동혁 Java (0) | 2023.09.05 |