본문 바로가기

Java/Java 알고리즘 인프런

[Ch.04 - HashTree] 01. 학급 회장(해쉬) (+Map.Entry, entrySet())

반응형
1. 학급 회장(해쉬)
 

설명

학급 회장을 뽑는데 후보로 기호 A, B, C, D, E 후보가 등록을 했습니다.

투표용지에는 반 학생들이 자기가 선택한 후보의 기호(알파벳)가 쓰여져 있으며 선생님은 그 기호를 발표하고 있습니다.

선생님의 발표가 끝난 후 어떤 기호의 후보가 학급 회장이 되었는지 출력하는 프로그램을 작성하세요.

반드시 한 명의 학급회장이 선출되도록 투표결과가 나왔다고 가정합니다.

입력

첫 줄에는 반 학생수 N(5<=N<=50)이 주어집니다.

두 번째 줄에 N개의 투표용지에 쓰여져 있던 각 후보의 기호가 선생님이 발표한 순서대로 문자열로 입력됩니다.

출력

학급 회장으로 선택된 기호를 출력합니다.

예시 입력 1 

15
BACBACCACCBDEDE

예시 출력 1

C

import java.util.*;
  
public class Main {
  public Character solution(int n, String str){
    char answer=' ';
    HashMap <Character, Integer> map = new HashMap<>();
    char[] arr=str.toCharArray();
    for(int i=0;i<n;i++){
      map.put(arr[i], map.getOrDefault(arr[i],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){
    Main T=new Main();
    Scanner kb=new Scanner(System.in);
    int n = kb.nextInt();
    String str= kb.next();
    System.out.println(T.solution(n,str));
    
  }
}

 

키와 값으로 이루어진 자료구조 -> 키에 해당하는 값을 찾을 수 있다.

HashMap <Character, Integer> map = new HashMap<>();

 

삽입

map.put(arr[i], map.getOrDefault(arr[i], 0)+1)

-> 키에 해당하는 값이 없으면 0을 넣고 1를 추가한다.

 

추출 -> 키로만 이루어진 자료구조 (키셋)

for(Character x : map.keySet()){

map.get(key)

키셋에서 키에 해당하는 값

}

 

참고 : 키에는 인덱스가 존재하지 않는다. -> 순서가 존재하지 않는다.

키와 값이 연결되어 있기 때문에

package hashtree.ch04;

import java.util.HashMap;
import java.util.Scanner;

public class Hashtree01 {
	//회장 선출
	//A, B, C, D, E 후보
	//반드시 한 명의 학급회장이 선출
	//N명 -> 각각 후보가 다름 hashmap
	
	public static void main(String[] args) {
		Hashtree01 T = new Hashtree01();
		//클래스 객체 생성
		Scanner kb = new Scanner(System.in);
		//사용자에게 입력받는 객체 생성
		int n = kb.nextInt();
		//n명의 학생수
		String str=kb.next();
		//n명의 학생이 투표한 사람
		System.out.println(T.solution(n,str));
		//회장선출함수 호출	
		kb.close();
		//Scanner는 닫아줘야한다.
	}
	
	public char solution (int n, String s) {
		char answer=' ';
		//회장 변수 선언 및 정의
		HashMap<Character, Integer> map = new HashMap<>();
		//char와 integer 즉, 투표한 후보, 득표수로 이루어진 자료구조
		for(char x : s.toCharArray()) {
			//x는 투표한 후보로 이루어진 변수를 하나씩 나누는 배열
			map.put(x, map.getOrDefault(x, 0)+1);
			//map에 후보자 x에 대한 득표수를 넣는다. 아니면 0, 맞으면 +1
		}
		System.out.println(map.containsKey('F'));
		//F라는 키가 존재 여부 반환
		System.out.println(map.size());
		System.out.println(map.remove('C'));
		
		
		int max=Integer.MIN_VALUE;
		//int의 가장 작은 값을 max에 설정
		
		for(char key : map.keySet()) {
			System.out.println(key+" "+map.get(key));
			if(map.get(key)>max) {
				//max변수와 key의 value 비교 = 득표수 비교
				max=map.get(key);
				//max 변수에 key를 대입
				answer=key;
				//회장은 키값 (득표수가 가장 많은후보자)
			}
		}
		return answer;
	}

}

 

 


import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {
	public char solution(int n,String str) {
		char x=' ';
		char[] arr = str.toCharArray();
		HashMap<Character, Integer> map = new HashMap<>();
		for(int i=0;i<n;i++) {
			map.put(arr[i],map.getOrDefault(arr[i], 0)+1);
		}
		int max=0;
	
		
		
		for(int y:map.values()) {
			max=Math.max(y, max);
		}
		
		//value로 키 가져오기
		for(char key :map.keySet())
		{
			Integer value=map.get(key);
			if(value==max) {
				return x=key;
			}
		}
		return x;
	}
	
	public static void main(String[] args) {
		Main T = new Main();
		Scanner kb=new Scanner(System.in);
		int n=kb.nextInt();
		String str= kb.next();
		System.out.println(T.solution(n,str));
	}

}

 

 

+) 세련된 풀이

import java.util.HashMap;
import java.util.Scanner;

public class Main {
	public char solution(int n, String str) {
		char answer=' ';
		HashMap<Character, Integer> map = new HashMap<>();
		for(char x: str.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) {
		Main T = new Main();
		Scanner kb = new Scanner(System.in);
		int n =kb.nextInt();
		String str=kb.next();
		System.out.println(T.solution(n,str));
	}

}

import java.util.*;
  
public class Main {
  public static void main(String[] args){
    Scanner in=new Scanner(System.in);
    int n = in.nextInt();
    String str = in.next();
    Map<Character, Integer> map = new HashMap<>();
    for(char c: str.toCharArray()){
      map.put(c, map.getOrDefault(c, 0)+1);
    }
    List<Map.Entry<Character, Integer>> list = new LinkedList<>(map.entrySet());
    Collections.sort(list, (o1, o2) -> o2.getValue()==o1.getValue()?o1.getKey()-o2.getKey():o2.getValue()-o1.getValue());
    for(Map.Entry<Character, Integer> entry : list){
      System.out.println( entry.getKey());
      return;
    }
  }
}
반응형