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

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

코딩테스트 연습 - 완주하지 못한 선수 | 프로그래머스 (programmers.co.kr)

1. 정렬을 이용해 풀기

package programmers; import java.util.Arrays; //해시)완주하지 못한 선수 //정렬을 이용해 풀기 public class case42576 { public String solution(String[] participant, String[] completion) { Arrays.sort(participant); Arrays.sort(completion); //받은 값들을 정렬해준다 // 두 배열이 다를 때 까지 반복해준다. // i를 전역변수로 넣어서, for문에 따라 달라지는 값을 가져가는 것이 포인트 int i = 0 ; for(i = 0;i < completion.length;i++) { if(!participant[i].equals(completion[i])) { break; // 여기서 for문이 break 된다면 해당 participant의 주자가 완주하지 못했다는 의미이다. } } //여기까지 온다면 마지막의 participant의 주자가 완주하지 못했다는 의미이다 //왜냐하면 문제가 completion이 participant보다 길이가 1 작기 때문 return participant[i]; } public static void main(String[] args) { String[] participant = {"leo", "kiki", "eden"}; String[] completion = {"eden", "kiki"}; case42576 sort = new case42576(); System.out.println(sort.solution(participant, completion)); } }

2. 해시를 이용해 풀기

package programmers; import java.util.*; //해시)완주하지 못한 선수 //해시를 이용해 풀기 public class case42576_2 { public String solution(String[] paricipant, String[] completion) { String answer = ""; HashMap map = new HashMap<>(); //매개변수로 받은 배열을 key값으로, map을 만들어준다 //참가자의 value값에 기본값은 0, +1 을 해줌 for(String player : paricipant) { map.put(player, map.getOrDefault(player, 0)+1); } //완주자의 value값에 다시 -1을 해줌 //이로써 참가자 중 완주하지 못한 한명의 선수빼고는 value값이 모두 0 for(String player : completion) { map.put(player, map.get(player) -1); } Iterator> iter = map.entrySet().iterator(); while(iter.hasNext()) { Map.Entry entry = iter.next(); if(entry.getValue() != 0) { answer = entry.getKey(); break; } } return answer; } public static void main(String[] args) { String[] participant = {"leo", "kiki", "eden"}; String[] completion = {"eden", "kiki"}; case42576 sort = new case42576(); System.out.println(sort.solution(participant, completion)); } }

여기서 Iterator는 무엇일까?

Iterator는 자바의 컬렉션 프레임워크에서 컬렉션의 저장되어 있는 요소들을 읽어오는 방법을 표준화 한 것이다.

컬렉션 프레임워크란 데이터를 저장하는 클래스들을 표준화한 설계이다.

자바 컬렉션이란

set , List , Map 3가지 인터페이지를 의미한다.

Iterator 메서드에는 다음이 있다.

hasNext() : 읽어올 요소가 남아있는지 확인하는 메소드이다. 요소가 있으면 true, 없으면 false

next() : 다음 데이터를 반환한다.

remove() : next()로 읽어온 요소를 삭제한다.

Map.Entry는 반복문을 사용해서 Map의 key와 value값을 가져오는 방법이다.

Map map = new HashMap(); for (Map.Entry entry : map.entrySet()) { System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue()); }

Iterator를 사용하지 않는다면 이런 for문을 이용헤서 값을 출력 할 수도 있다.

뒤의 부분은 while문을 사용해 iteraotr의 hasNext가 true일 때,

Map의 value가 0이 아니라면,

key값을 String answer에 담고 반복문을 break한다.

위에서 참가자들의 value값에 전부 +1을 해주고

다시 완주자들의 value값에 전부 -1 을 해주었기 때문에,

완주자들의 value값은 0이다.

때문에 map에 value가 1인 key값이 완주하지 못한 선수가 되는 것이다.

스프링을 이용해서 웹개발을 할 때,

파일관련 구현은 multipart 라이브러리를 활용한다.

multipart는 파일의 값을 map형식으로 가져오는데,

다중파일업로드를 구현할 때 이 iterator를 사용했다.

그때는 iterator의 사용법을 몰라서 굉장히 헤맸었던 기억이 있다.

개발에 있어서 java뿐이 아닌, 언어의 사용법, 즉 기초가 얼마나 중요한지 다시 깨닫게 되는 부분이 있었다.

from http://kimfk567.tistory.com/100 by ccl(A) rewrite - 2021-12-23 04:02:19