본문 바로가기

자료구조 & 알고리즘

[프로그래머스] 완주하지 못한 선수 java/자바

(본 포스팅은 과정 & 시도가 포함되어 있어 쓸데 없는 내용이 많습니다. 바로 본론을 원하시는분은 제일 아래쪽에 최종 제출 코드만 참고하세요.)

 

코딩 공부를 해야될거 같다 1단계부터 한참 헤맸다...ㅠ

 

처음에는 아래와 같은 코드로 접근을 했다...

 

당연히 시간 초과일걸 알았지만 일단은 이렇게 접근해서 이것저것 손대보면서 영감을 얻으려했다. (별로 좋지 못한 접근 같다. 잘못된 방법에 계속 사로 잡히게 되는 것 같다. 쉽게 벗어나기 힘들었다.) 아래와 비슷한 방법으로 계속 이렇게 저렇게 시도를 하다가 별다른 수확 없이 잠깐 중단했다.

import java.util.Scanner;
class Solution {
    public String solution(String[] participant, String[] completion) {
        StringBuffer comp = toString(completion);
        
        for(int i = 0; i < participant.length; i++){
            int idx=comp.indexOf(participant[i]+"$");
            if(idx<0){
                return participant[i];
            }
            else comp.delete(idx, idx+participant[i].length()+1);
            
        }
        
        String answer = "";
        return answer;
    }
    
    public StringBuffer toString(String[] stringArray) {
        StringBuffer sb = new StringBuffer();
        for(int i = 0; i < stringArray.length; i++) {
         sb.append(stringArray[i]+"$");
        }
        return sb;
    }
}

 

그런데 샤워하고 머리를 식히고 다시 앉으니 갑자기 얼마전 면접 때 질문 받은 파이썬에서의 list와 set의 차이가 떠올랐다. (set은 정렬이 되고 중복 불가) set을 이용해 배열을 정렬을 한후 비교를 한다면 O(n)으로 풀 수 있다고 문득 생각이 나 바로 시도했다. (<=이 순간 set 너무 사로 잡혀버렸다. 왜 그랬지...)

package study;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String[] str1 ={"leo", "kiki", "eden"};
		String[] str2 ={"eden", "kiki"};
		
		System.out.println(solution(str1, str2));
	}
	
    public static String solution(String[] participant, String[] completion) {
    	Set<String> participant_set = new HashSet<String>();
    	Set<String> completion_set = new HashSet<String>();
    	
    	Collections.addAll(participant_set, participant); 
    	Collections.addAll(completion_set, completion);
    	
    	Iterator<String> part = participant_set.iterator();
    	Iterator<String> comp = completion_set.iterator();
    	
    	while (comp.hasNext()) {
    		String str1 = comp.next();
    		String str2 = part.next();
    		if(!str1.equals(str2)) return str2; 
		}
    	return part.next();
    }
}

그러나 위의 코드는 오답이다! 그 이유를 생각해보자 정답은 아래에 흰색으로 써놓겠다.

SET은 중복을 허용하지 않기 때문에 동명이인이 있는 경우를 처리해주지 못한다.

 

 

 

 

=======최종 제출 코드=========

 

정답은 생각보다 간단했다. 그냥 String[]을 정렬하면되는거였다...(왜 굳이 set으로 바꾸고 난리를 쳤는지...)

아래는 최종으로 제출한 코드이다. 다른 사람의 코드를 보니 hash맵을 이용해서 푼 코드가 있었고 그 아래에 나와 유사한 코드가 있었다. (한줄 빼고 똑같았다!)

package study;
import java.util.Arrays;

public class main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String[] str1 ={"leo", "kiki", "eden"};
		String[] str2 ={"eden", "kiki"};
		
		System.out.println(solution(str1, str2));
	}
	
    public static String solution(String[] participant, String[] completion) {
    	Arrays.sort(participant);
    	Arrays.sort(completion);
    	
    	for (int i = 0; i < completion.length; i++) {
			if (!completion[i].equals(participant[i])) {
				return participant[i];
			}
		}
    	
    	return participant[participant.length-1];
    }
}

 

처음으로 돌아가 해시맵을 사용해서 푸는 방법을 다시 생각해봐야겠다.