본문 바로가기

ALGORITHM

[프로그래머스 Java] 완주하지 못한 선수

 

코딩테스트 연습 - 완주하지 못한 선수

수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다. 마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수

programmers.co.kr

⏱소요 시간 - 30분

 

🔑해결 방법

 

문자열도 정렬이 가능하다.

문자열을 정렬해서 두 배열을 같은 순서대로 비교하면서 달라지는 순간!

그 사람은 완주하지 못했다고 할 수 있다. 완주하지 못한 선수가 한 명이라서 가능했던 문제

여러 명이 되면 정렬로 구현이 불가능하지 않을까 싶다.

 

다만, 헤맸던 부분은 answer = participant[i + 1]; ---> 이 부분을 추가해줘야 함

완주하지 못한 선수가 participant에서 맨 마지막 사람인 경우이다.

나는 for문의 범위를 completion.length 만큼 줬기 때문에 당연히 participant의 마지막 요소는 돌지 못할 것이다.

completion의 길이만큼 범위를 돌았는데도 요소가 모두 동일했다면 participant의 마지막 요소가 완주하지 못한 선수라는 것을 알 수 있다.

 

 

🔎소스 코드

 

package step1;

import java.util.*;

// 완주하지 못한 선수
public class Ex03 {

	public static void main(String[] args) {
		
		String[] participant = { "mislav", "stanko", "mislav", "ana" };
		
		String[] completion = { "stanko", "ana", "mislav" };
		
		System.out.println(solution(participant, completion));

	}
	
	public static String solution(String[] participant, String[] completion) {
		
		String answer = "";
		
		Arrays.sort(participant);
		Arrays.sort(completion);
		
		for(int i = 0; i < completion.length; i++) {
				
			if(!(participant[i].equals(completion[i]))) {
				answer = participant[i];
				break;
			}
			
			answer = participant[i + 1]; // # 위의 설명 확인
			
		}
	
		return answer;
		
	}

}

 

🔎소스 코드

HashMap을 활용한 코드이다.

 

package step1;

import java.util.HashMap;
import java.util.Map;

public class Ex03_1 {
	
	public static void main(String[] args) {
	
		String[] participant = {"leo", "kiki", "eden"};
		
		String[] completion = {"eden", "kiki"};
		
		System.out.println(solution(participant, completion));
		
	}
	
	static String solution(String[] participant, String[] completion) {
		
		String answer = "";
		
		Map<String, Integer> map = new HashMap<>(); // key: 선수이름, value: 수(동명이인 체크)
		
		for(String player : participant) {
			map.put(player, map.getOrDefault(player, 0) + 1);
			// value값이 없다면 0+1=1로 변경 (즉, 모든 새로운 player는 1 값을 갖는다)
			// value가 중복되는 경우 1+1=2로 변경 (이후에 동명이인이 나올 경우 기존 1 값에 1을 더해준다)
		}
		
		for(String player : completion) {
			map.put(player, map.get(player) - 1);
			// 완주자는 value 감소
		}
		
		for(String key : map.keySet()) {
			if(map.get(key) != 0) {
				answer = key;
			} // value값이 1인 경우 -> completion 목록에 없다 -> 완주하지 못했다
		}
		
		return answer;
	}

}