일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Linux
- 명령어
- 백준 java
- 개발자 회고록
- 스프링 빈
- 자바
- toCharArray
- 카카오
- java 백준 1차원 배열
- 리눅스마스터1급
- 스프링 컨테이너
- 리눅스마스터 3과목
- Kotlin
- 프로그래머스
- Java
- 백준 javascript
- 고잉버스
- JavaScript
- 월간코드챌린지
- map
- 연습문제
- 자바스크립트 코딩의 기술
- 리눅스
- 리눅스마스터 1급 정리
- 코테
- GoingBus
- 문자열
- 코딩테스트
- 반복문
- Memoir
- Today
- Total
hoon's bLog
Java 프로그래머스 완주하지 못한 선수 자바 본문
문제 출처 : https://school.programmers.co.kr/learn/courses/30/lessons/42576
[문제 설명]
수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때,
완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해 주세요.
[제한 조건]
- 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
- completion의 길이는 participant의 길이보다 1 작습니다.
- 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
- 참가자 중에는 동명이인이 있을 수 있습니다.
[입출력 예]
participant | completion | return |
["leo", "kiki", "eden"] | ["eden", "kiki"] | "leo" |
["marina", "josipa", "nikola", "vinko", "filipa"] | ["josipa", "filipa", "marina", "nikola"] | "vinko" |
["mislav", "stanko", "mislav", "ana"] | ["stanko", "ana", "mislav"] | "mislav" |
입출력 예 #1
"leo"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.
입출력 예 #2
"vinko"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.
입출력 예 #3
"mislav"는 참여자 명단에는 두 명이 있지만, 완주자 명단에는 한 명밖에 없기 때문에 한 명은 완주하지 못했습니다.
[먼저 생각해 보기]
배열로 주어지는 참여자(participant), 완주자(completion)를 어떻게 비교할 것인가?
정렬 후 비교한다면 반복문 사용 시, 인덱스에 따라 순차적으로 비교 가능할 듯하다!!
[나의 풀이]
import java.util.Arrays;
class Solution {
public String solution(String[] participant, String[] completion) {
Arrays.sort(participant);
Arrays.sort(completion);
for (int i = 0; i < completion.length; i++) {
if(!participant[i].equals(completion[i])){
return participant[i];
}
}
return participant[participant.length-1];
}
}
배열이기 때문에 Arrays.sort를 이용해서 participant와 completion를 오름차순으로 정렬!
이후 값을 비교하여 해당하는 값 String으로 return!
물론 이렇게도 풀 수 있다.
하지만 이번 문제는 해시맵으로 풀어야 하는 알고리즘 문제이다!
추후 포스팅을 통해 해시맵(HashMap)에 대해 설명하겠지만, Java에서 사용하는 Collection Framework 중에 하나로,
Map <key, value> 형식으로, key 값을 통해 value를 put, get 메서드를 사용하여 데이터를 가공한다!
다른 사람의 풀이를 보며 코드를 해석해 보자!
[다른 사람의 풀이]
import java.util.HashMap;
class Solution {
public String solution(String[] participant, String[] completion) {
String answer = "";
HashMap<String, Integer> hm = new HashMap<>();
for (String player : participant)
hm.put(player, hm.getOrDefault(player, 0) + 1);
for (String player : completion)
hm.put(player, hm.get(player) - 1);
for (String key : hm.keySet()) {
if (hm.get(key) != 0){
answer = key;
}
}
return answer;
}
}
우선 key 타입은 String, value 타입은 Integer을 가지는 HashMap hm을 선언!
foreach로 HashMap hm에 participant와 completion 각각의 key로 player, value로 int값을 넣어준다.
이때 getOrDefault 메서드를 이용해 value값을 setting 하는데,
getOrDefault는 찾는 key가 존재한다면 찾는 key의 value를 반환, 없거나 null이면 default 값 반환한다.
위 코드에서는 player가 가지고 있는 value가 없기 때문에 0을 반환 후 1을 더해, 그 값을 hm에 player key와 put 해준다.
getOrDefault 원형은 아래와 같다.
맵변수명.getOrDefault(key값, default값)
이어서 completion 배열에 요소를 hm에 다시 put 해줄 때, 기존에 hm에서 각 player가 가지고 있는 value를 get 해서,
1을 빼면 완주한 player는 0의 value를 가지게 된다.
그리고 key값을 가져와 비교해야 하는데 이때 사용되는 것이 keySet()!!
keySet()은 해당 Map의 key만 반환하게 된다.
위 코드에서, hm.keySet()으로 [leo, kiki, eden]의 key를 반환하고, 0이 아닌 key값을 return 한다!
[정리]
개인 피셜 난이도 : ★★☆☆☆
Map은 실무에서 정말정말정말 많이 쓰인다!!!!!!!
대부분 실무에서 쓰이는 로직들의 절반 이상은 for문, if문, Map으로 이루어져 있다.
때문에 이 세 가지를 적절하게, 때에 맞게 사용한다면, 실전에서도 큰 어려움은 없다.(초반 코드분석 한정...)
추가로, 난이도 한 개도 아까울 만큼 쉬워서 포스팅 건너뛴 문제들도 있다.
그런 문제들은 아래 내 github에서 검색하여 소스 참고하면 되겠다!
https://github.com/chrishoonS/codeTest
언제나 새로운 정보 공유와 잘못된 정보
비판/지적/태클은 환영입니다!
끝.
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
Java 프로그래머스 모의고사 자바 (2) | 2023.03.15 |
---|---|
Java 프로그래머스 K번째 수 자바 (3) | 2023.03.14 |
Java 프로그래머스 하샤드 수 자바 (1) | 2023.02.15 |
Java 프로그래머스 제일 작은 수 제거하기 자바 (0) | 2023.02.09 |
[Java] 프로그래머스 정수 제곱근 판별 자바 (6) | 2023.02.08 |