μ½”λ”©ν…ŒμŠ€νŠΈ/ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

[Lv.1] μ™„μ£Όν•˜μ§€ λͺ»ν•œ μ„ μˆ˜

벼리01 2024. 1. 6. 01:13

μ–Έμ–΄: java

 

 

문제 μ„€λͺ…

μˆ˜λ§Žμ€ λ§ˆλΌν†€ μ„ μˆ˜λ“€μ΄ λ§ˆλΌν†€μ— μ°Έμ—¬ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 단 ν•œ λͺ…μ˜ μ„ μˆ˜λ₯Ό μ œμ™Έν•˜κ³ λŠ” λͺ¨λ“  μ„ μˆ˜κ°€ λ§ˆλΌν†€μ„ μ™„μ£Όν•˜μ˜€μŠ΅λ‹ˆλ‹€. λ§ˆλΌν†€μ— μ°Έμ—¬ν•œ μ„ μˆ˜λ“€μ˜ 이름이 λ‹΄κΈ΄ λ°°μ—΄ `participant`와 μ™„μ£Όν•œ μ„ μˆ˜λ“€μ˜ 이름이 λ‹΄κΈ΄ λ°°μ—΄ `completion`이 μ£Όμ–΄μ§ˆ λ•Œ, μ™„μ£Όν•˜μ§€ λͺ»ν•œ μ„ μˆ˜μ˜ 이름을 return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μž‘μ„±ν•΄ μ£Όμ„Έμš”.

 

μ œν•œμ‚¬ν•­

λ§ˆλΌν†€ 경기에 μ°Έμ—¬ν•œ μ„ μˆ˜μ˜ μˆ˜λŠ” 1λͺ… 이상 100,000λͺ… μ΄ν•˜μž…λ‹ˆλ‹€.

`completion`의 κΈΈμ΄λŠ” `participant`의 길이보닀 1 μž‘μŠ΅λ‹ˆλ‹€.

μ°Έκ°€μžμ˜ 이름은 1개 이상 20개 μ΄ν•˜μ˜ μ•ŒνŒŒλ²³ μ†Œλ¬Έμžλ‘œ 이루어져 μžˆμŠ΅λ‹ˆλ‹€.

μ°Έκ°€μž μ€‘μ—λŠ” 동λͺ…이인이 μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

 

 


 

πŸ“Œ 풀이(1/3) - ArrayList

`ArrayList`의 `indexOf()`λŠ” μ•žμ—μ„œλΆ€ν„° 검색해 μΌμΉ˜ν•˜λŠ” 객체 쀑 κ°€μž₯ λ¨Όμ € λ°œκ²¬ν•œ 객체의 인덱슀λ₯Ό λ°˜ν™˜ν•œλ‹€. μ°Ύμ§€ λͺ»ν•˜λ©΄ -1을 λ°˜ν™˜ν•œλ‹€. λ”°λΌμ„œ `indexOf()`둜 ν•΄λ‹Ή 객체의 인덱슀λ₯Ό 찾은 λ’€ ν•΄λ‹Ή 인덱슀λ₯Ό μ‚¬μš©ν•΄ `remove()`λ₯Ό ν•˜λ €κ³  ν–ˆλ‹€.

κ·ΈλŸ¬λ‚˜ `remove()` λ©”μ„œλ“œλŠ” `indexOf()`처럼 μ•žμ—μ„œλΆ€ν„° 검색해 μΌμΉ˜ν•˜λŠ” 객체 쀑 κ°€μž₯ λ¨Όμ € λ°œκ²¬ν•œ 객체 ν•˜λ‚˜λ₯Ό μ‚­μ œν•˜λ―€λ‘œ μœ„μ˜ 과정이 λΆˆν•„μš”ν•˜λ‹€. completion의 κΈΈμ΄λŠ” participant의 길이보닀 1 μž‘λ‹€λŠ” 것은 μ™„μ£Όν•˜μ§€ λͺ»ν•œ μ„ μˆ˜κ°€ λ°˜λ“œμ‹œ ν•œ λͺ…은 μ‘΄μž¬ν•œλ‹€λŠ” 의미둜, `p.get()`에 λ˜μ Έμ€„ λ§€κ°œλ³€μˆ˜λ₯Ό 0으둜 두어도 `p` λ‚΄μ˜ 객체가 λ°˜λ“œμ‹œ ν•˜λ‚˜λŠ” μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ— null이 λ‚˜μ˜€μ§€ μ•ŠλŠ”λ‹€.(검증할 ν•„μš” μ—†μŒ)

 

//	μ •ν™•μ„± 톡과, νš¨μœ¨μ„± μ‹€νŒ¨(μ‹œκ°„ 초과)

import java.util.*;

class Solution {
    public String solution(String[] participant, String[] completion) {

        List<String> p = new ArrayList<>(Arrays.asList(participant));
        
        for(int i = 0; i < completion.length; i++){
            p.remove(completion[i]);
        }
        
        return p.get(0);
        
    }
}

 

κ·ΈλŸ¬λ‚˜ `ArrayList`λ₯Ό μ‚¬μš©ν•˜λ©΄μ„œ for문으둜 쀑간 인덱슀 μ‚­μ œλ₯Ό λͺ‡ λ²ˆμ΄λ‚˜ λ°˜λ³΅ν•˜λŠ” 것은 쒋은 방법이 μ•„λ‹ˆλ‹€. `remove(Object o)` λ©”μ„œλ“œμ˜ 경우 λ‚΄λΆ€μ—μ„œ null이 μ•„λ‹Œμ§€ 확인 후에 `get(o)` λ©”μ„œλ“œλ₯Ό λΆ€λ₯΄κ³  boolean으둜 μˆ˜ν–‰ κ²°κ³Ό(μ§€μ›Œμ‘ŒλŠ”μ§€ μ•„λ‹Œμ§€)λ₯Ό 뱉어내기 λ•Œλ¬Έμ— μ‹œκ°„ λ³΅μž‘λ„λŠ” O(n)으둜 μ„±λŠ₯이 λ‚˜μ˜λ‹€κ³  ν•  μˆ˜λŠ” μ—†μœΌλ‚˜, `ArrayList`λŠ” μ€‘κ°„μ˜ μΈλ±μŠ€κ°€ μ§€μ›Œμ§€κ²Œ 되면 ν›„ μš”μ†Œμ˜ μΈλ±μŠ€κ°€ λ‹Ήκ²¨μ§€λ©΄μ„œ λ°°μ—΄μ˜ 볡사가 μΌμ–΄λ‚˜λ―€λ‘œ μ„±λŠ₯ μ €ν•˜λ₯Ό μΌμœΌν‚¨λ‹€. 

 

νš¨μœ¨μ„± μ‹€νŒ¨!

 

 

[자료ꡬ쑰] ArrayList - λ°°μ—΄μ˜ 단점을 λ³΄μ™„ν•œ 자료ꡬ쑰


 

 

πŸ“Œ 풀이(2/3) - λ°°μ—΄(Arrays)

`completion`의 κΈΈμ΄λŠ” `participant`의 길이보닀 항상 1이 μž‘κΈ° λ•Œλ¬Έμ— μ™„μ£Όν•˜μ§€ λͺ»ν•œ μ„ μˆ˜λŠ” λ°˜λ“œμ‹œ ν•œ λͺ…이 μ‘΄μž¬ν•œλ‹€. κ·Έλ ‡λ‹€λ©΄ 두 λ°°μ—΄ λͺ¨λ‘ μ •λ ¬ ν›„ ν•˜λ‚˜μ”© 비ꡐ해 봀을 λ•Œ 쀑간에 같은 μΈλ±μŠ€μ΄μ§€λ§Œ λ‹€λ₯Έ 이름이라면, μ™„μ£Ό μ„ μˆ˜ λͺ©λ‘μ— μ°Έμ—¬ μ„ μˆ˜ 이름이 μ—†λ‹€λŠ” 뜻이 λ˜λ―€λ‘œ  `participant`의 ν•΄λ‹Ή 인덱슀 μš”μ†Œλ₯Ό λ°˜ν™˜ν•˜λ©΄ λœλ‹€. 

 

import java.util.*;

class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        
        Arrays.sort(participant);
        Arrays.sort(completion);
        
        for(int i = 0; i < participant.length; i++){
                if(!participant[i].equals(completion[i])){
                    return participant[i];
                }
        }
        
        return answer;
    }
}

 

κ·ΈλŸ¬λ‚˜ `completion` λ°°μ—΄μ˜ 길이가 `participant`보닀 항상 μž‘κΈ° λ•Œλ¬Έμ— 인덱슀 iκ°€ 계속 μ¦κ°€ν•˜μ—¬ `participant`의 λ§ˆμ§€λ§‰ 인덱슀λ₯Ό κ°€λ¦¬ν‚€κ²Œ λ˜λŠ” 경우 `completion[i]`λŠ” λ°˜λ“œμ‹œ μ—†λŠ” μΈλ±μŠ€κ°€ λ˜λ―€λ‘œ `ArrayIndexOutOfBoundsException`이 λ°œμƒν•œλ‹€. 이 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ try - catch문을 μž‘μ„±ν•˜μ—¬ ν•¨μˆ˜λ₯Ό μ™„μ„±ν–ˆλ‹€. 

 

import java.util.*;

class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        
        Arrays.sort(participant);
        Arrays.sort(completion);
        
        
        for(int i = 0; i < participant.length; i++){
            try{
                if(!participant[i].equals(completion[i])){
                    return participant[i];
                }
            }catch(ArrayIndexOutOfBoundsException e){
                return participant[i];
            }
        }
        
        return answer;
    }
}

 

 

 


 

 

πŸ“Œ 풀이(3/3) - HashMap

`participant` λͺ©λ‘μ—λŠ” 동λͺ…이인이 μ‘΄μž¬ν•˜λ―€λ‘œ `HashSet`에 값을 λ„£μœΌλ©΄ 값이 μ‚¬λΌμ§€κ²Œ λœλ‹€. λ”°λΌμ„œ `HashMap`을 μ‚¬μš©ν•˜μ—¬ 동λͺ…μ΄μΈμ˜ 카운트λ₯Ό κ°’μœΌλ‘œ λ³΄κ΄€ν•˜κΈ°λ‘œ ν–ˆλ‹€. `HashMap`에 μ°Έκ°€μžμ˜ 이름을 λ„£λ˜, 이미 `HashMap`에 μ‘΄μž¬ν•˜λŠ” 이름이라면 ν•΄λ‹Ή 이름을 ν‚€λ‘œ κ°€μ§„ 값을 1 μ¦κ°€μ‹œν‚¨λ‹€. μ—¬λŸ¬λͺ…μ˜ 동λͺ…이인도 μΉ΄μš΄νŠΈν•  수 μžˆλ‹€.

이제 μ™„μ£Όν•œ μ‚¬λžŒμ„ μΉ΄μš΄νŠΈμ—μ„œ μ œμ™Έμ‹œν‚¨λ‹€. `participant`λŠ” `completion` 집합을 ν¬ν•¨ν•˜κ³  있기 λ•Œλ¬Έμ— `completion`에 μ‘΄μž¬ν•˜λŠ” 이름이라면 λ°˜λ“œμ‹œ `HashMap`에 ν•΄λ‹Ή μ΄λ¦„μ˜ ν‚€κ°€ μ‘΄μž¬ν•œλ‹€. κ·ΈλŸ¬λ―€λ‘œ `completion` λͺ©λ‘μ˜ 이름을 ν‚€λ‘œ κ°€μ§„ 값을 1 κ°μ†Œμ‹œν‚¨λ‹€.

이 과정을 거쳐 μ™„μ£Όν–ˆλ‹€λ©΄ 값이 0, μ™„μ£Όν•˜μ§€ λͺ»ν–ˆλ‹€λ©΄ 1 μ΄μƒμ˜ 값을 κ°€μ§„λ‹€. (λ¬Έμ œμ—μ„œλŠ” μ™„μ£Όν•˜μ§€ λͺ»ν•œ μ„ μˆ˜κ°€ 단 ν•œ λͺ…이라고 ν–ˆκΈ° λ•Œλ¬Έμ— 1이 μ‘΄μž¬ν•  것이닀.) 값이 0이 μ•„λ‹Œ ν‚€, 즉 μ„ μˆ˜μ˜ 이름을 λ°˜ν™˜ν•œλ‹€. 

 

import java.util.*;

class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        
        Map<String, Integer> map = new HashMap<>();
        
        for(int i = 0; i < participant.length; i++){
            if(map.containsKey(participant[i])){
			map.put(participant[i], map.get(participant[i]) + 1);
            }else{
			map.put(participant[i], 1);
            }
        }
        
        for(int i = 0; i < completion.length; i++){
            map.put(completion[i], map.get(completion[i])-1);
        }
        
        for(int i = 0; i < participant.length; i++){
            if(map.get(participant[i]) != 0){
                return participant[i];
            }
        }
        
        
        return answer;
    }
}

 

Arrays보닀 λΉ λ₯΄κ²Œ 성곡!

 

 

 

 

 

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

μ½”λ“œ μ€‘μ‹¬μ˜ 개발자 μ±„μš©. μŠ€νƒ 기반의 ν¬μ§€μ…˜ λ§€μΉ­. ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€μ˜ 개발자 λ§žμΆ€ν˜• ν”„λ‘œν•„μ„ λ“±λ‘ν•˜κ³ , λ‚˜μ™€ 기술 ꢁ합이 잘 λ§žλŠ” 기업듀을 λ§€μΉ­ λ°›μœΌμ„Έμš”.

programmers.co.kr