일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 자바
- 2798 자바
- 티움투어
- 10807 자바
- 파이썬
- 자바 28278
- 2164 자바
- 백준 28278 자바
- 10810 자바
- 1764 자바
- 코딩테스트
- 자바 2164
- 데보션영 3기
- IAM 사용자
- 백준 2346 자바
- 28278 스택 2
- 2748 자바
- 그리디
- 10813 자바
- 자바 2346
- 자바 10866
- BFS
- dfs
- 2346 풍선 터뜨리기
- 백준 1764 자바
- IAM Identity Center
- 1010 자바
- 백준 10866 자바
- 백준
- 자바 1003
- Today
- Total
자두의 데브로그
[자바] 프로그래머스 완주하지 못한 선수 본문
https://school.programmers.co.kr/learn/courses/30/lessons/42576
이 문제에는 두 가지 풀이 방법이 있는데 첫 번째는 participant와 completion 두 배열을 ArrayList로 선언한 뒤, 정렬하고 participant 배열의 i번째 값과 completion 배열의 i번째 값을 비교해가며 만약 다르다면, 그 값을 answer에 저장하는 방식으로 문제를 해결했다. 그러나 만약 answer의 값이 공백으로 아무 값도 저장되지 않았다면 participant의 가장 마지막에 해당하는 사람이 완주하지 못한 선수가 된다.
import java.util.*;
class Solution {
public String solution(String[] participant, String[] completion) {
ArrayList<String> parti = new ArrayList<>(Arrays.asList(participant));
ArrayList<String> comple = new ArrayList<>(Arrays.asList(completion));
Collections.sort(parti);
Collections.sort(comple);
String answer = "";
for(int i = 0; i < comple.size(); i++){
if(!(parti.get(i).equals(comple.get(i)))){
answer += parti.get(i);
break;
}
}
if(answer.length() == 0) answer = parti.get(parti.size()-1);
return answer;
}
}
두 번째는 HashMap을 활용하여 문제를 풀 수 있는 방법이다. HashMap을 잘 사용해보지 않아서 사용 방법을 몰랐지만 이번 기회에 확실히 외우고!!! 가보자.
일단 participant에 해당하는 사람에 대해서 1의 값을 모두 갖도록 설정했는데, 문제 조건에 동명이인이 있을 수 있다고 하니까 만약 해시맵 안에 값이 없었다면 0으로 설정한 뒤, 1로 증가하라는 의미의 getOrDefault 함수를 사용한다. 만약 동명이인이 있으면 2 이상의 값을 갖게 되는데 이 부분에 대해서는 다음 for문에서 처리한다. 다음 for문에서는 완주한 사람의 이름을 key로 갖는다면 해당 key의 value-1을 하는 방식을 사용한다. 이렇게 되면 동명이인이 있다고 하더라도, 그 수만큼 모두 완주했다면 결국 0이 될 것이다. 따라서 해시맵의 value 값을 1로 갖는 사람의 이름을 출력하면 된다. 이때 사용하는 게 Iterator로, EntrySet을 사용하면 더 속도가 빠르다고 하여 iterator를 활용한 풀이로 코드를 작성해봤다.
import java.util.*;
class Solution {
public String solution(String[] participant, String[] completion) {
String answer = "";
HashMap<String, Integer> map = new HashMap<>();
for(String pla : participant){
map.put(pla, map.getOrDefault(pla, 0)+1);
}
for(String pla : completion){
map.put(pla, map.get(pla) - 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;
}
}
'코딩테스트 > Java' 카테고리의 다른 글
[자바] 백준 11279번 최대 힙 (0) | 2024.10.09 |
---|---|
[자바] 프로그래머스 폰켓몬 (1) | 2024.10.09 |
[자바] 프로그래머스 N개의 최소공배수 (1) | 2024.10.08 |
[자바] 프로그래머스 이상한 문자 만들기 (0) | 2024.10.07 |
[자바] 프로그래머스 두 개 뽑아서 더하기 (3) | 2024.10.06 |