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 |