본문 바로가기

취업관련/코딩테스트

완주하지 못한 선수

프로그래머스에서 제공하는 문제들 중 해시함수를 연습하기 위한 문제를 풀었다.

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/42576

 

코딩테스트 연습 - 완주하지 못한 선수 | 프로그래머스

수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다. 마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요. 제한사항 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다. completion의 길이는 partic

programmers.co.kr

 

문제 설명

문제 설명 및 예시


풀이 과정

해시맵을 이용해 풀어보기로 하였으며 전체적인 키와 값은 사람 이름 String과 동명이인 숫자 Integer로 정했다.

우선 참가자와 완주자 두 해시 맵을 만들기로 결정했다. 두 맵에 키와 값을 대입하는 과정에서 코드가 완전히 똑같이 진행된다는 사실을 발견해 addValue라는 메소드를 새로 만들어 중복되는 코드를 줄여보게 되었다.

static void addValue(HashMap<String, Integer> map, String index) {
    if (map.containsKey(index))
        map.put(index, map.get(index) + 1);
    else
        map.put(index, 1);
}

 

처음에는 참가자를 완주자보다 더 먼저 맵에 추가했지만 추가작업 후 해답을 구하고자 계산식을 생각해보니 참가자 배열을 돌며 완주자 맵에서 각 인덱스값을 비교하면 훨씬 절차를 단축시킬 수 있겠다는 생각이 들었다.

이 과정에서 위의 메소드는 중복되는 코드가 없어졌기 때문에 더이상 필요가 없어져 삭제하였고, 완주에 실패한 사람은 단 한명이기 때문에 참가자 배열을 돌며 containsKey메소드를 활용해 답을 찾는 중 해답을 발견하면 break를 통해 반복을 빠져나가도록 조치했다.

동명이인을 제대로 처리하지 않아 발생한 오류


for (String index : participant) {
    if (compl.containsKey(index)) {
        if (compl.get(index) > 1)
            compl.put(index, compl.get(index) - 1);
        else
            compl.remove(index);
		
        continue;
	}
    
    answer = index;
    break;
}

 

맵에서 해당 키를 찾을 때 동명이인이 여러 명 있다면 정답을 정확하게 찾을 수 없게 되기 때문에 값을 하나씩 지우도록 하였으며 한 명 남았을 때는 해당 키를 완주자 맵에서 지우도록 했다.

이 과정에서 continue를 넣어주지 않는다면 바로 아래 코드인 answer변수에 인덱스 넣기 부분으로 넘어가기 때문에 꼭 넣어주어야 오류가 발생하지 않는다.

 

최종 코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.StringTokenizer;

public class CantCompletionPlayer {
	public static void main(String[] args) {
		init();
	}
	
	static void init() {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		String input1 = "", input2 = "";
		StringTokenizer st;
		int index = 0;
		
		try {
			input1 = br.readLine();
			st = new StringTokenizer(input1);
			String[] participant = new String[st.countTokens()];
			while (st.hasMoreTokens())
				participant[index++] = st.nextToken();
			
			index = 0;
			input2 = br.readLine();
			st = new StringTokenizer(input2);
			String[] completion = new String[st.countTokens()];
			while (st.hasMoreTokens())
				completion[index++] = st.nextToken();
			
			bw.write(solution(participant, completion));
			bw.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	static String solution(String[] participant, String[] completion) {
		String answer = "";
		HashMap<String, Integer> compl = new HashMap<>();
		
		for (String index : completion) {
			if (compl.containsKey(index))
				compl.put(index, compl.get(index) + 1);
			else
				compl.put(index, 1);
		}
		
		for (String index : participant) {
			if (compl.containsKey(index)) {
				if (compl.get(index) > 1)
					compl.put(index, compl.get(index) - 1);
				else
					compl.remove(index);
				
				continue;
			}
			answer = index;
			break;
		}
		
		return answer;
	}
}

 

채점 결과

'취업관련 > 코딩테스트' 카테고리의 다른 글

베스트 앨범  (0) 2019.10.06
  (0) 2019.10.06
위장  (0) 2019.10.02
다리를 지나는 트럭  (0) 2019.10.01
전화번호 목록  (0) 2019.09.30