투케이2K

212. (java/자바) 알고리즘 : 완주하지 못한 선수 - hashmap 해쉬맵 사용 본문

Java

212. (java/자바) 알고리즘 : 완주하지 못한 선수 - hashmap 해쉬맵 사용

투케이2K 2021. 7. 23. 08:32

[ 개발 환경 설정 ]

개발 툴 : Eclipse

개발 언어 : Java


[소스 코드]

package ex5;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;

public class MainActivity20 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("[Program Start]");
		System.out.println("");
		
		/**
		 * [완주하지 못한 선수]
		 * 1. 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다
		 * 2. completion (완주 배열)의 길이는 participant (전체 배열)의 길이보다 1 작습니다
		 * 3. 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다
		 * 4. 참가자 중에는 동명이인이 있을 수 있습니다
		 * 5. 입출력 예 : 
		 *    participant [전체] : ["mislav", "stanko", "mislav", "ana"]
		 *    completion [완주] : ["stanko", "ana", "mislav"]
		 *    return [낙오] : "mislav"
		 * 6. 참고 : 해시 알고리즘 풀이 사용    
		 * */
		
		// 초기 전체 및 완주자 배열 선언
		String total[] = {"mislav", "stanko", "mislav", "ana"}; // 전체 길이 3
		String success[] = {"stanko", "ana", "mislav"}; // 합격자 전체길이 - 1 = 2
		
		// 낙오자 확인 메소드 호출 실시
		System.out.println("낙오자 : " + solution(total, success));

	}// 메인 종료
	
	public static String solution (String t[], String s[]) {
		// 리턴 결과를 담을 변수 선언
		String result = "";
		
		// 인풋으로 들어온 데이터 확인
		System.out.println("total : " + Arrays.toString(t));
		System.out.println("success : " + Arrays.toString(s));
		System.out.println("");		
		
		// hashmap 을 사용해서 낙오자 판단 실시
		HashMap <String, Integer> map = new HashMap();
		
		
		// 동명이인 이름이 같은 사람 카운트 실시
		for(int i=0; i<t.length; i++) {
			if(map.containsKey(t[i])) { // 키값이 존재하는 경우
				int total_cnt = (int) map.get(t[i]); // key에 해당하는 value (정수) 값을 가져옵니다
				map.replace(t[i], (total_cnt+1)); // 해당 key value 값을 +1 더해서 업데이트합니다
			}
			else { // 키값이 존재하지 않는 경우 
				map.put(t[i], 1); // 초기 1값으로 데이터를 저장합니다
			}			
		}		
		System.out.println("동명이인 판단 : " + map.toString());
		
		
		// 합격자 명단을 돌면서 특정인 value 값을 -1 감소시킵니다 (합격 처리)
		for(int j=0; j<s.length; j++) {
			if(map.containsKey(s[j])) { //해쉬맵에 특정인 키 값이 존재하는 경우
				int success_cnt = (int) map.get(s[j]); // key에 해당하는 value (정수) 값을 가져옵니다
				map.replace(s[j], (success_cnt-1)); // 해당 key value 값을 -1 연산 수행 후 업데이트합니다				
			}			
		}
		System.out.println("합격 여부 판단 : " + map.toString());
		System.out.println("");
		
		
		// 최종 0값이 아닌 (즉, 합격자가 아닌) key 값을 확인해서 결과를 리턴합니다
		Set set = map.keySet();
		Iterator iterator = set.iterator();
		while(iterator.hasNext()){
			String key = (String) iterator.next();
			if(map.get(key) != 0) { // value 값이 0 이 아닐 경우
				result = key;
				break;				
			}
		}
		
		// 결과 리턴 실시
		return result;		
	} 

}// 클래스 종료

[결과 출력]


[요약 설명]

/**

* [완주하지 못한 선수]

* 1. 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다

* 2. completion (완주 배열)의 길이는 participant (전체 배열)의 길이보다 1 작습니다

* 3. 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다

* 4. 참가자 중에는 동명이인이 있을 수 있습니다

* 5. 입출력 예 :

*     participant [전체] : ["mislav", "stanko", "mislav", "ana"]

*     completion [완주] : ["stanko", "ana", "mislav"]

*     return [낙오] : "mislav"

* 6. 참고 : 해시 알고리즘 풀이 사용

* */


 

반응형
Comments