08
25

https://school.programmers.co.kr/learn/challenges?tab=algorithm_practice_kit

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

ํ‘ธ๋Š” ๋™์•ˆ ์‚ฌ๊ณ ๊ณผ์ • ๋ฐ ๊ฐœ์„ ์ 

import java.util.*;

class Solution {
    public int solution(int[] nums) {
        int answer = 0;
        TreeSet<Integer> ts = new TreeSet();
        for(int i: nums){
            ts.add(i); // ์ผ๋‹จ ์ด๋Ÿฌ๋ฉด ์ค‘๋ณต์ œ๊ฑฐ๊ฐ€ ๋œ๋‹ค
        }
        if(ts.size() >= nums.length/2){
            answer = nums.length/2;
        }else{
            answer = ts.size();
        }
        
        return answer;
    }
}

๋ถ„๋ฅ˜๋Š” Hash๋‹ค. TreeSet์œผ๋กœ ์ค‘๋ณต์ œ๊ฑฐํ•ด์„œ ์ตœ๋Œ€ ๊ฐ€์ง€์ˆ˜๋ฅผ ๋ฝ‘์•˜๋‹ค.

ํ•ด์‹œ๋กœ ๋ถ„๋ฅ˜๋œ ์ด์œ ๋Š” Set ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•ด์„œ ํ‘ธ๋Š” ๊ฒƒ ๋•Œ๋ฌธ์ผ ๊ฒƒ์œผ๋กœ ์ถ”์ •๋œ๋‹ค..


# ์ถ”๊ฐ€ ๊ณต๋ถ€

TreeSet ์ž๋ฃŒ๊ตฌ์กฐ

import java.util.*;

TreeSet<Integer> ts = new TreeSet<Integer>();
TreeSet<Integer> tsInit = new TreeSet<>(Arrays.asList(1,2,3,3,3));

ts.add(1);
ts.add(2);
ts.add(2);
ts.add(3);
ts.remove(2);
ts.size(); // ํฌ๊ธฐ
ts.clear(); // ์ „์ฒด ๋‚ ๋ฆฌ๊ธฐ

Treeset์€ ๊ธฐ๋ณธ์œผ๋กœ ๋ ˆ๋“œ๋ธ”๋ž™ํŠธ๋ฆฌ๊ฐ€ ์ ์šฉ๋˜์–ด์žˆ๋Š” Set ์ž๋ฃŒ๊ตฌ์กฐ๋‹ค. 

https://ko.wikipedia.org/wiki/%EB%A0%88%EB%93%9C-%EB%B8%94%EB%9E%99_%ED%8A%B8%EB%A6%AC

 

๋ ˆ๋“œ-๋ธ”๋ž™ ํŠธ๋ฆฌ - ์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „

์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „. ๋ ˆ๋“œ-๋ธ”๋ž™ ํŠธ๋ฆฌ(red-black tree)๋Š” ์ž๊ฐ€ ๊ท ํ˜• ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ(self-balancing binary search tree)๋กœ์„œ, ๋Œ€ํ‘œ์ ์œผ๋กœ๋Š” ์—ฐ๊ด€ ๋ฐฐ์—ด ๋“ฑ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์“ฐ์ด๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋‹ค. 1978๋…„

ko.wikipedia.org

๋ ˆ๋“œ๋ธ”๋ž™ํŠธ๋ฆฌ๋Š” ๋ถ€๋ชจ๋…ธ๋“œ ๊ธฐ์ค€์œผ๋กœ ์ž‘์€๊ฒŒ ์™ผ์ชฝ์œผ๋กœ, ํฐ๊ฒŒ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ฐ„๋‹ค. ๊ทธ๋ž˜์„œ ts.first()๋Š” ํŠธ๋ฆฌ์—์„œ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’, ts.last()๋Š” ํŠธ๋ฆฌ์—์„œ ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค. ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ์ด ๊ธฐ๋ณธ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ž˜์„œ ๊ทธ๋ƒฅ new ๋กœ ๋งŒ๋“œ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ Collections.reverseOrder() ํ•ด์ฃผ๋ฉด ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ์ด ๋˜๋Š” TreeSet์ด ์ƒ์„ฑ๋œ๋‹ค.

TreeSet<Integer> ts = new TreeSet(Comparator.reverseOrder());

Collection์ธ๋ฐ, Set๊ตฌ์กฐ๋ผ ์ˆœํšŒ๊ฐ€ ์ข€ ๋ถˆํŽธํ•˜๋‹ค. Iterator๋กœ ๊ฐ์‹ธ์„œ ์ˆœํšŒํ•ด์•ผ๋œ๋‹ค.

Iterator it = ts.iterator();
while(iter.hasNext()){
    System.out.print(it.next() + "\n");	
}

์ •๋ ฌ๋œ ์ˆœ์„œ๋Œ€๋กœ iterator๊ฐ€ ์ˆœํšŒํ•œ๋‹ค.

 

HashSet์„ ์“ฐ๋ฉด ์š”์†Œ๊ฐ€ ์ •๋ ฌ๋˜์ง€์•Š์•„์žˆ์ง€๋งŒ ํ•ด์‹œํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•ด์„œ O(1)์˜ ์†๋„๋ฅผ ์ž๋ž‘ํ•œ๋‹ค. ๊ทผ๋ฐ TreeSet์„ ์“ฐ๋ฉด ์ •๋ ฌ๋˜์–ด์žˆ์–ด์„œ ๋งŒ์•ฝ ๋ฒ”์œ„๊ฒ€์ƒ‰ ๊ฐ™์€ ๊ฒŒ ํ•„์š”ํ•˜๋ฉด ์ด๊ฑธ ์จ์•ผ๋œ๋‹ค. O(logN)์ด๊ฑฐ๋‚˜ amortized O(1)์ด๊ธฐ ๋•Œ๋ฌธ์— ์ž…๋ ฅ์ด ์ž…๋ ฅ์ด ์—„์ฒญ ์ปค์„œ ์กฐํšŒ์— ์‹œ๊ฐ„์ด ๋ง‰ ๊ฑธ๋ฆฌ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ๋ฉด TreeSet์„ ์จ๋„ ๋  ๊ฒƒ ๊ฐ™๋‹ค.

 

๋ฒ”์œ„๊ฒ€์ƒ‰์€ headSet, tailSet์„ ์“ด๋‹ค. ์ด๊ฒŒ ์‹ ์„ธ๊ณ„๋‹ค.

TreeSet<Integer> numbers = new TreeSet<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
numbers.add(4);
numbers.add(5);
numbers.add(6);

// headSet() ์˜ˆ์‹œ
System.out.println("headSet(4): " + numbers.headSet(4));
System.out.println("headSet(4, true): " + numbers.headSet(4, true));

// tailSet() ์˜ˆ์‹œ
System.out.println("tailSet(4): " + numbers.tailSet(4));
System.out.println("tailSet(4, false): " + numbers.tailSet(4, false));

headSet์€ ์ฃผ์–ด์ง„ ์š”์†Œ๋ณด๋‹ค ์ž‘์€ ๋ฒ”์œ„์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์š”์†Œ๋ฅผ ํฌํ•จํ•˜๊ณ  ์‹ถ์œผ๋ฉด true๋ฅผ ๊ฐ™์ด ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

tailSet์€ ์ฃผ์–ด์ง„ ์š”์†Œ๋ณด๊ฐ€ ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€ ๋ฒ”์œ„์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์š”์†Œ๊ฐ€ ํฌํ•จ๋˜์–ด์žˆ๋Š”๋ฐ, false๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ์‹œ์ž‘ ์ ์ด ์ œ์™ธ๋œ๋‹ค.

 

๋„์›€์ด ๋๋‹ค๋ฉด ๋Œ“๊ธ€์ด๋‚˜ ๊ณต๊ฐ ๋ฒ„ํŠผ ํ•œ ๋ฒˆ์”ฉ ๋ˆ„๋ฅด๊ณ  ๊ฐ€์ฃผ์„ธ์š”!

 

๋ฐ˜์‘ํ˜•
COMMENT