본문 바로가기
프로그래머스/JAVA

[해시] 완주하지 못한 선수

by AsCE_hyunseung 2018. 10. 4.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import java.util.HashMap;
import java.util.Map;
 
public class NotFinishRace {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        Map<String,Integer>info=new HashMap<>();
 
        InsertPartInfo(participant, info);//참가자 정보를 해시맵에 넣었다.
        FindNotComplete(completion, info);//완주하지 못한 참가자를 찾았다.
 
        answer = GetAnswer(answer, info);
 
        return answer;
    }
 
    public String GetAnswer(String answer, Map<String, Integer> info) {
        for(String key:info.keySet()){
            if(info.get(key)==1) {//완주하지 못한 참가자 value=1
                answer = key;
            }
        }
        return answer;
    }
    public void FindNotComplete(String[] completion, Map<String, Integer> info) {
        int Value;
        for(String com:completion){//완주한 사람 value=0 만들기
            Value=info.get(com)-1;
            info.put(com,Value);
        }
    }
    public void InsertPartInfo(String[] participant, Map<String, Integer> info) {
        int Value;
        for(String part:participant){
            if(info.get(part)==null){
                info.put(part,1);
            }
            else{//동명이인
                Value=info.get(part)+1;
                info.put(part,Value);
            }
        }
    }
}
cs

NotFinishRace.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import org.junit.Test;
import static org.junit.Assert.*;
 
public class NotFinishRaceTest {
    NotFinishRace n=new NotFinishRace();
 
    String[] p1={"leo""kiki""eden"};
    String[] p2={"marina""josipa""nikola""vinko""filipa"};
    String[] p3={"mislav""stanko""mislav""ana"};
 
    String[] c1={"eden""kiki"};
    String[] c2={"josipa""filipa""marina""nikola"};
    String[] c3={"stanko""ana""mislav"};
 
    @Test
    public void 테스트_결과() {
        assertEquals("leo",n.solution(p1,c1));
        assertEquals("vinko",n.solution(p2,c2));
        assertEquals("mislav",n.solution(p3,c3));
    }
}
cs

NotFinishRaceTest.java


- 문제 설명

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


마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.


- 제한사항

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

completion의 길이는 participant의 길이보다 1 작습니다.

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

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


participant배열과 completion배열을 모두 정렬한 뒤에 매칭이 안되는 인덱스만 알아내는 알고리즘으로 간편하게 풀 수 있었지만 이 문제가 요구하는 것이 해시이기도하고 이 참에 자료구조 공부를 같이 해보려고 해시로 풀었다.

오랜만에 자료구조 책을 펴서 해시부분 정독을 했다. 역시 어렵다. 오랜만에 써보는거라 간단한 알고리즘이지만 시간이 좀 걸렸다. 

그 동안 알고리즘은 문자열 다루기와 자료구조쪽은 배열만 써서 더 풀기 복잡했다는 생각이 든다.

반복문을 돌릴때 인덱스 접근하는 것은 위험하다고 피드백을 받아서 for-each문으로 바꿔서 풀었다. 앞으로 인덱스 접근해서 푸는 방법을 최대한 지양해야겠다.

TDD개발론을 계속 실천하고 있는데 뭔가 배운것을 계속 활용하는 느낌이라 문제 풀 때마다 기분이 좋다.


----------------------------------------------------------------------------------------------------

35~59번 라인을 한줄로 요약하는 메소드가 있다고 한다.

getOrDefault()

HashMap에 찾는 키 값이 없을 경우에 바로 Default값을 설정하고 그 값을 리턴하고, 있으면 그 키 값의 value를 리턴합니다. 

'프로그래머스 > JAVA' 카테고리의 다른 글

[해시] 전화번호 목록  (0) 2018.10.10
[정렬] H-Index  (0) 2018.10.05
[level 2] JadenCase 만들기  (4) 2018.09.30
[level 2] 숫자의 표현  (0) 2018.09.26
[정렬] K번째수  (0) 2018.09.21