반응형

프로그래머스 문제 링크 

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는 어떻게 활용해야할지 잘 몰랐었는데 동명이인을 가리기위한 용도로 활용하는 것을 보고 갈길이 멀다고 생각했다.

728x90

+ Recent posts