일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- Android
- androidstudio
- bitmap
- BOJ
- Canvas
- CS
- Database
- DBeaver
- DP
- Ecilpse
- Eclipse
- firebase
- git
- github
- GooglePlayServices
- gradle
- IDE
- IntelliJ
- java
- json
- kotlin
- level2
- linux
- mariadb
- MYSQL
- Paint
- permission
- python
- Sorting
- sourcetree
Archives
will come true
[프로그래머스 / Level1] 완주하지 못한 선수 (Java) 본문
728x90
문제
https://programmers.co.kr/learn/courses/30/lessons/42576?language=java#
핵심 키워드
- 해시(Hash)
- HashMap
- Map.Entry
- 문자열 비교 .equals()
풀이
- participant 에는 있고, completion에는 없는 한명의 이름 구하기
Sort / Loop를 사용한 코드
import java.util.Arrays;
class Solution {
public String solution(String[] participant, String[] completion) {
Arrays.sort(participant);
Arrays.sort(completion);
int i;
for(i = 0; i < completion.length; i++){
if(!participant[i].equals(completion[i])){
break;
}
}
return participant[i];
}
}
- participant배열과 completion 배열을 정렬(Sort)
- completion배열의 길이 만큼 두 배열의 요소를 비교하는 걸 반복(Loop)
두 배열은 요소 하나를 제외하고는 전부 같기 때문에, 정렬을 하면 같은 위치에 같은 값이 있어야 한다. 같은 위치에 갑자기 다른 값이 온다면 그 값이 '완주하지 못한 한명'인 것. - 반복 도중에 두 배열의 요소가 다르면 그 값이 '완주하지 못한 한명'.
- 반복문을 끝까지 돌았음에도 다른 값이 나오지 않았다면 participant의 마지막 값이 '완주하지 못한 한명'
(completion이 participant보다 크기가 1작기 때문에 participant에는 비교하지 못한 값 하나가 남게됨) - 반복문 중단 => i : break에 걸렸을 당시의 i값
반복문 종료 => i : completion.length (=participant의 마지막 요소 인덱스) - 두 배열의 요소(String)가 같은지 비교할 때 participant[i] != completion[i] 로 하지 않도록 주의하자.
문자열간의 비교는 participant[i].equals(completion) 으로 하며, 두 개가 달라야 참이도록 !participant[i].equals(completion) 조건을 걸어줘야 한다.
Hash를 사용한 코드
*Hash : key-value 조합으로 구성된 자료구조. (ex: HashSet, HashMap)
import java.util.HashMap;
import java.util.Map.Entry;
class Solution {
public String solution(String[] participant, String[] completion) {
String answer = "";
HashMap<String, Integer> map = new HashMap<>();
for(String player : participant){
map.put(player, map.getOrDefault(player, 0) + 1);
}
for(String player : completion) {
map.put(player, map.get(player) - 1); //completion의 모든 요소는 participant에 무조건 있음
}
for(Entry<String, Integer> entry : map.entrySet()) {
if(entry.getValue().intValue() != 0) {
answer = entry.getKey(); //key가 선수이름, value는 사람 수
break;
}
}
return answer;
}
}
- participant배열로 [participant값(key) : 사람 수(value)] 형태의 Hash 생성
- Hash에서 completion의 요소를 찾아, value값을 1차감.
- 마지막에 value값으로 1이 남아있는 요소가 '완주하지 못한 한명'
HashMap 메서드
메서드 | 설명 |
Object put(Object key, Object value) | 지정된 키와 값을 HashMap에 저장 |
Object get(Object key) | 지정된 키(key)의 값(객체)을 반환, 못찾으면 null 반환. |
getOrDefault(Object key, Object dafaultValue) | 지정된 키(key)의 값(객체)을 반환, 키를 못 찾으면 기본값(defaultValue)로 지정된 객체를 반환. |
Set entrySet() | HashMap에 저장된 키와 값을 Entry(key와 value의 결합)의 형태로 Set에 저장해서 반환 |
Set keySet() | HashMap에 저장된 모든 키가 저장된 Set을 반환 |
Collection values() | HashMap에 저장된 모든 값을 컬렉션의 형태로 반환 |
Map.Entry 메서드
*Map.Entry 인터페이스 : Map인터페이스의 내부 인터페이스. Map에 저장되는 key-value쌍을 객체지향적으로 다루기 위해 내부적으로 정의해 놓은 것이다.
메서드 | 설명 |
boolean equals(Object o) | 동일한 Entry인지 비교한다. |
Object getKey() | Entry의 key객체를 반환한다. |
Object getValue() | Entry의 value객체를 반환한다. |
int hashCode() | Entry의 해시코드를 반환한다. |
Object setValue(Object value) | Entry의 value객체를 지정된 객체로 바꾼다. |
728x90
'Algorithm' 카테고리의 다른 글
[프로그래머스 / Level1] 없는 숫자 더하기 (Java) (0) | 2021.11.05 |
---|---|
[프로그래머스 / Level1] K번째 수 (Java) (0) | 2021.11.05 |
[프로그래머스 / Level1] 모의고사 (Java) (0) | 2021.11.05 |
[프로그래머스 / Level1] 소수 만들기 (Java) (0) | 2021.11.05 |
[프로그래머스 / Level1] 폰켓몬 (Java) (0) | 2021.11.05 |
Comments