문제: https://programmers.co.kr/learn/courses/30/lessons/42576?language=java
public String solution(String[] participant, String[] completion) { String answer = ""; // 1. HahsMap을 생성한다. (participant 기준) HashMap<String, Integer> map = new HashMap<String, Integer>(); for(String player : participant) { // map에 player를 key로 추가한다. // 동명이인이 있을 수 있기때문에 같은 key가 있을 경우에는 value에 1을 더하도록 한다. // 위의 경우를 해결하기 위해 getOrDefault를 사용한다. // 이전에 없었으면 0으로 만들어줌 그런데 뒤에서 + 1을 붙여서 value를 1로 만들어줌 map.put(player, map.getOrDefault(player, 0) + 1); } // 2. HashMap을 뺀다 (completion 기준) for(String player : completion) { map.put(player, map.get(player) - 1); } // 3. value가 0이 아닌 값이 마지막 주자가 되기때문에 그 값을 찾는다 for(String key: map.keySet()) { if(map.get(key) != 0) { answer = key; break; } } // EntrySet 사용 경우 Iterator<Map.Entry<String, Integer>> iter = map.entrySet().iterator(); //iterator.hasNext()는 다음 값이 있는지 없는지 확인하는 메소드 while(iter.hasNext()) { Map.Entry<String, Integer> entry = iter.next(); if(entry.getValue() != 0) { answer = entry.getKey(); break; } } return answer; }
진짜 의외로 정렬만 잘해도 많은 알고리즘을 해결할 수 있다.
public String solution(String[] participant, String[] completion) { //1. 배열을 정렬(sort) 한다. Arrays.sort(participant); Arrays.sort(completion); //2. 두 배열이 다를 때 까지 찾는다. // 정렬이 진짜 은근히 많은 정보를 찾고 효율을 올릴 수 있다. //⭐⭐완주하지 못한선수가 마지막일 경우의 예외처리를 해줘야 함 // for(int i=0; i<completion.length; i++) { // if(!participant[i].equals(completion[i])) { // return participant[i]; // } // } int i = 0; for(;i<completion.length; i++) { // participant의 i번째와 completion의 i번째의 값이 같지 않다면 그 값이 완주하지 못한사람이 된다. if(!participant[i].equals(completion[i])) { break; } } //3. 전체를 모두 반복했는데도 찾지 못했다면, 마지막 주자가 완주하지 못한 선수다 return participant[i]; }