코딩테스트 연습 - 완주하지 못한 선수 | 프로그래머스 (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<String, Integer> 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<Map.Entry<String, Integer>> iter = map.entrySet().iterator();
while(iter.hasNext()) {
Map.Entry<String, Integer> 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<Integer, Integer> map = new HashMap<Integer, Integer>();
for (Map.Entry<Integer, Integer> 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뿐이 아닌, 언어의 사용법, 즉 기초가 얼마나 중요한지 다시 깨닫게 되는 부분이 있었다.
'알고리즘' 카테고리의 다른 글
[프로그래머스] 전화번호 목록 (0) | 2021.12.29 |
---|