프로그래머스 문제 링크
https://programmers.co.kr/learn/courses/30/lessons/42576
내 스스로 푼 코드
import java.util.HashMap;
class Solution {
public String solution(String[] participant, String[] completion) {
String answer = "";
HashMap<Integer, String> mapParticipant=new HashMap<>();
for(int i=0; i<participant.length;i++) {
mapParticipant.put(i, participant[i]);
}
for(int i=0; i<mapParticipant.size();i++) {
for(int j=0; j<completion.length;j++) {
if(mapParticipant.get(i).equals(completion[j])) {
mapParticipant.put(i, "");
completion[j]="";
}
}
}
for(int i=0; i<mapParticipant.size() ;i++) {
answer+=mapParticipant.get(i);
}
return answer;
}
}
굳이 mapParticipant에 null값을 넣어줘야하는게 마음에 안들었다.
*다른사람의 코드
import java.util.Arrays;
class Solution {
public String solution(String[] participant, String[] completion) {
String answer = "";
String temp = "";
Arrays.sort(participant); //알파벳 순 정렬
Arrays.sort(completion);
int i = 0;
while(i < completion.length){
if(!completion[i].equals(participant[i])){ //도중에 다른글자발견한다면
temp = participant[i];
break;
}else{
i++;
}
}
if(!temp.equals("")){ //도중에 다른글자 발견 했을때
answer = temp;
}else{ //끝내 다른글자 발견 못했을때
answer = participant[participant.length-1];
}
return answer;
}
}
1. Arrays.sort 를 활용하여 우선 알파벳순으로 정렬
2. completion 만큼 돌되 중간에 다른글자 발견하면 그 글자를 temp 에 저장
3. temp가 null이 아니라면 그것을 return , null이면 participant 의 마지막 인덱스를 return .
Arrays.sort를처음 알았다.
먼저 정렬부터 해 주고 다른걸 발견했을때 리턴, 아니면 마지막인덱스 값을 리턴하는 방식이다.
*다른사람의 코드
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;
}
}
프로그래머스 정답의 가장 상위에 있는 코드이다.
1. map에 key : player, value : 1 이런 형식으로 넣을건데 만약 같은 이름일 경우엔 1이 아닌 다른 숫자로 해줄것인데
map에 참가자 명단을 하나씩 넣되, value는 map.get ( player ) 를 해준다.
왜냐하면 동명이인이 있을 수 있기 때문에 palyer를 key로 썼을때 value가 없으면 0으로 셋팅, 0+1로 value는 1
반대로 player 를 key 로 썼을때 value가 기존에 셋팅된 1로 있을 경우 1+1 =2로 value 는 2로 셋팅된다.(동명이인)
2. 같은 key 값으로 put 해주면 그 value는 갱신되는 HashMap의 특성을 이용하여 completion 이름들을 put 해준다.
value는 기존 hm.get (player)의 value - 1 을 해준다.
이렇게 되면 동명이인을 제외한 모든 player 들의 value는 0이 된다.
사실 동명이인이 있을 수 있다는 조건이 없으면
foreach문으로 participant를 돌릴때 key:player, value : hm.getOrDefault 를 안해주고 value : 1 로 적어넣어도된다.
그러면 모든참가자의 value는 1이 되고 completion의 이름들과 부합하였을때 0이 되며
부합하지않은 사람만 1로 남아있기 때문이다.
문제의 특성상 key value 의 두개 중에 이름만 보면되므로 리스트로 해도될텐데 왜 해시맵으로 하라고하는걸까
key를 이름들로 구성하고 value는 어떻게 활용해야할지 잘 몰랐었는데 동명이인을 가리기위한 용도로 활용하는 것을 보고 갈길이 멀다고 생각했다.
'과거 게시글' 카테고리의 다른 글
[JQUERY] .find _ 어떤 요소의 하위 요소 중 특정 요소를 찾는 메서드 (0) | 2019.05.17 |
---|---|
intellij 2019 svn 연동과 " Cannot run program "svn" : CreateProcess error=2, 지정된 파일을 찾을 수 없습니다 " svn에러 (3) | 2019.05.14 |
String 문자열 비교 (.equalsIgnoreCase()) (0) | 2019.04.12 |
Scheduler 라이브러리 (0) | 2019.04.11 |
Mustache (0) | 2019.04.08 |