1. ๋ฌธ์ ์ค๋ช
๋น์ ์ ํฐ์ผ๋ชฌ์ ์ก๊ธฐ ์ํ ์ค๋ ์ฌํ ๋์, ํ ๋ฐ์ฌ๋์ ์ฐ๊ตฌ์ค์ ๋์ฐฉํ์ต๋๋ค. ํ ๋ฐ์ฌ๋์ ๋น์ ์๊ฒ ์์ ์ ์ฐ๊ตฌ์ค์ ์๋ ์ด N ๋ง๋ฆฌ์ ํฐ์ผ๋ชฌ ์ค์์ N/2๋ง๋ฆฌ๋ฅผ ๊ฐ์ ธ๊ฐ๋ ์ข๋ค๊ณ ํ์ต๋๋ค.
ํ ๋ฐ์ฌ๋ ์ฐ๊ตฌ์ค์ ํฐ์ผ๋ชฌ์ ์ข
๋ฅ์ ๋ฐ๋ผ ๋ฒํธ๋ฅผ ๋ถ์ฌ ๊ตฌ๋ถํฉ๋๋ค. ๋ฐ๋ผ์ ๊ฐ์ ์ข
๋ฅ์ ํฐ์ผ๋ชฌ์ ๊ฐ์ ๋ฒํธ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ฐ๊ตฌ์ค์ ์ด 4๋ง๋ฆฌ์ ํฐ์ผ๋ชฌ์ด ์๊ณ , ๊ฐ ํฐ์ผ๋ชฌ์ ์ข
๋ฅ ๋ฒํธ๊ฐ [3๋ฒ, 1๋ฒ, 2๋ฒ, 3๋ฒ]์ด๋ผ๋ฉด ์ด๋ 3๋ฒ ํฐ์ผ๋ชฌ ๋ ๋ง๋ฆฌ, 1๋ฒ ํฐ์ผ๋ชฌ ํ ๋ง๋ฆฌ, 2๋ฒ ํฐ์ผ๋ชฌ ํ ๋ง๋ฆฌ๊ฐ ์์์ ๋ํ๋
๋๋ค. ์ด๋, 4๋ง๋ฆฌ์ ํฐ์ผ๋ชฌ ์ค 2๋ง๋ฆฌ๋ฅผ ๊ณ ๋ฅด๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ด 6๊ฐ์ง๊ฐ ์์ต๋๋ค.
- ์ฒซ ๋ฒ์งธ(3๋ฒ), ๋ ๋ฒ์งธ(1๋ฒ) ํฐ์ผ๋ชฌ์ ์ ํ
- ์ฒซ ๋ฒ์งธ(3๋ฒ), ์ธ ๋ฒ์งธ(2๋ฒ) ํฐ์ผ๋ชฌ์ ์ ํ
- ์ฒซ ๋ฒ์งธ(3๋ฒ), ๋ค ๋ฒ์งธ(3๋ฒ) ํฐ์ผ๋ชฌ์ ์ ํ
- ๋ ๋ฒ์งธ(1๋ฒ), ์ธ ๋ฒ์งธ(2๋ฒ) ํฐ์ผ๋ชฌ์ ์ ํ
- ๋ ๋ฒ์งธ(1๋ฒ), ๋ค ๋ฒ์งธ(3๋ฒ) ํฐ์ผ๋ชฌ์ ์ ํ
- ์ธ ๋ฒ์งธ(2๋ฒ), ๋ค ๋ฒ์งธ(3๋ฒ) ํฐ์ผ๋ชฌ์ ์ ํ
์ด๋, ์ฒซ ๋ฒ์งธ(3๋ฒ) ํฐ์ผ๋ชฌ๊ณผ ๋ค ๋ฒ์งธ(3๋ฒ) ํฐ์ผ๋ชฌ์ ์ ํํ๋ ๋ฐฉ๋ฒ์ ํ ์ข
๋ฅ(3๋ฒ ํฐ์ผ๋ชฌ ๋ ๋ง๋ฆฌ)์ ํฐ์ผ๋ชฌ๋ง ๊ฐ์ง ์ ์์ง๋ง, ๋ค๋ฅธ ๋ฐฉ๋ฒ๋ค์ ๋ชจ๋ ๋ ์ข
๋ฅ์ ํฐ์ผ๋ชฌ์ ๊ฐ์ง ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ ์์์์ ๊ฐ์ง ์ ์๋ ํฐ์ผ๋ชฌ ์ข
๋ฅ ์์ ์ต๋๊ฐ์ 2๊ฐ ๋ฉ๋๋ค.
๋น์ ์ ์ต๋ํ ๋ค์ํ ์ข
๋ฅ์ ํฐ์ผ๋ชฌ์ ๊ฐ์ง๊ธธ ์ํ๊ธฐ ๋๋ฌธ์, ์ต๋ํ ๋ง์ ์ข
๋ฅ์ ํฐ์ผ๋ชฌ์ ํฌํจํด์ N/2๋ง๋ฆฌ๋ฅผ ์ ํํ๋ ค ํฉ๋๋ค. N๋ง๋ฆฌ ํฐ์ผ๋ชฌ์ ์ข
๋ฅ ๋ฒํธ๊ฐ ๋ด๊ธด ๋ฐฐ์ด nums๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, N/2๋ง๋ฆฌ์ ํฐ์ผ๋ชฌ์ ์ ํํ๋ ๋ฐฉ๋ฒ ์ค, ๊ฐ์ฅ ๋ง์ ์ข
๋ฅ์ ํฐ์ผ๋ชฌ์ ์ ํํ๋ ๋ฐฉ๋ฒ์ ์ฐพ์, ๊ทธ๋์ ํฐ์ผ๋ชฌ ์ข
๋ฅ ๋ฒํธ์ ๊ฐ์๋ฅผ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
์ ํ์ฌํญ
- nums๋ ํฐ์ผ๋ชฌ์ ์ข ๋ฅ ๋ฒํธ๊ฐ ๋ด๊ธด 1์ฐจ์ ๋ฐฐ์ด์ ๋๋ค.
- nums์ ๊ธธ์ด(N)๋ 1 ์ด์ 10,000 ์ดํ์ ์์ฐ์์ด๋ฉฐ, ํญ์ ์ง์๋ก ์ฃผ์ด์ง๋๋ค.
- ํฐ์ผ๋ชฌ์ ์ข ๋ฅ ๋ฒํธ๋ 1 ์ด์ 200,000 ์ดํ์ ์์ฐ์๋ก ๋ํ๋ ๋๋ค.
- ๊ฐ์ฅ ๋ง์ ์ข ๋ฅ์ ํฐ์ผ๋ชฌ์ ์ ํํ๋ ๋ฐฉ๋ฒ์ด ์ฌ๋ฌ ๊ฐ์ง์ธ ๊ฒฝ์ฐ์๋, ์ ํํ ์ ์๋ ํฐ์ผ๋ชฌ ์ข ๋ฅ ๊ฐ์์ ์ต๋๊ฐ ํ๋๋ง return ํ๋ฉด ๋ฉ๋๋ค.
์ ์ถ๋ ฅ ์
nums | result |
---|---|
[3,1,2,3] | 2 |
[3,3,3,2,2,4] | 3 |
[3,3,3,2,2,2] | 2 |
์ ์ถ๋ ฅ ์ ์ค๋ช
์
์ถ๋ ฅ ์ #1
๋ฌธ์ ์ ์์์ ๊ฐ์ต๋๋ค.
์
์ถ๋ ฅ ์ #2
6๋ง๋ฆฌ์ ํฐ์ผ๋ชฌ์ด ์์ผ๋ฏ๋ก, 3๋ง๋ฆฌ์ ํฐ์ผ๋ชฌ์ ๊ณจ๋ผ์ผ ํฉ๋๋ค.
๊ฐ์ฅ ๋ง์ ์ข
๋ฅ์ ํฐ์ผ๋ชฌ์ ๊ณ ๋ฅด๊ธฐ ์ํด์๋ 3๋ฒ ํฐ์ผ๋ชฌ ํ ๋ง๋ฆฌ, 2๋ฒ ํฐ์ผ๋ชฌ ํ ๋ง๋ฆฌ, 4๋ฒ ํฐ์ผ๋ชฌ ํ ๋ง๋ฆฌ๋ฅผ ๊ณ ๋ฅด๋ฉด ๋๋ฉฐ, ๋ฐ๋ผ์ 3์ return ํฉ๋๋ค.
์
์ถ๋ ฅ ์ #3
6๋ง๋ฆฌ์ ํฐ์ผ๋ชฌ์ด ์์ผ๋ฏ๋ก, 3๋ง๋ฆฌ์ ํฐ์ผ๋ชฌ์ ๊ณจ๋ผ์ผ ํฉ๋๋ค.
๊ฐ์ฅ ๋ง์ ์ข
๋ฅ์ ํฐ์ผ๋ชฌ์ ๊ณ ๋ฅด๊ธฐ ์ํด์๋ 3๋ฒ ํฐ์ผ๋ชฌ ํ ๋ง๋ฆฌ์ 2๋ฒ ํฐ์ผ๋ชฌ ๋ ๋ง๋ฆฌ๋ฅผ ๊ณ ๋ฅด๊ฑฐ๋, ํน์ 3๋ฒ ํฐ์ผ๋ชฌ ๋ ๋ง๋ฆฌ์ 2๋ฒ ํฐ์ผ๋ชฌ ํ ๋ง๋ฆฌ๋ฅผ ๊ณ ๋ฅด๋ฉด ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ต๋ ๊ณ ๋ฅผ ์ ์๋ ํฐ์ผ๋ชฌ ์ข
๋ฅ์ ์๋ 2์
๋๋ค.
์ถ์ฒ: ํ๋ก๊ทธ๋๋จธ์ค ์ฝ๋ฉ ํ ์คํธ ์ฐ์ต, https://school.programmers.co.kr/learn/challenges
2. ์ ๊ทผ ๋ฐฉ์
map์ ๋ช
๋ถ๋ก ์ฌ์ฉํ๋ค.
์ฌ์ฉ์๋ ์ด N/2 ๊ฐ์ ํฐ์ผ๋ชฌ์ ๊ฐ์ ธ๊ฐ ์ ์๋๋ฐ, ๋ช
๋ถ์ ์ ํ ํฐ์ผ๋ชฌ ์๊ฐ N/2๋ ๊ฐ๊ฑฐ๋, ๊ทธ ๋ณด๋ค ํจ์ฌ ๋ค์ํ๋ฉด, ์ต๋์น์ธ N/2๋ฅผ ๋ฐํํ๋๋ก ํ์๊ณ , ๊ฐ์ ธ๊ฐ ์ ์๋ ์๋ณด๋ค ์ข
์ ๋ค์์ฑ์ด ์ ์ผ๋ฉด, ๋ช
๋ถ์ ์ ํ ํฐ์ผ๋ชฌ์ ์๋ฅผ ๋ฐํํ์๋ค.
3. ์ฝ๋ ๋ถ์
class Solution {
public int solution(int[] nums) {
HashMap<Integer, Integer> map = new HashMap<>();
for(int i = 0; i < nums.length; i ++){
map.putIfAbsent(nums[i], 1);
}
if(map.size() < nums.length/2) {
return map.size();
}else{
return nums.length/2;
}
}
}
4. ์ฑ์ฅ ํ๊ธฐ
import java.util.Arrays;
import java.util.stream.Collectors;
class Solution {
public int solution(int[] nums) {
// 1)
return Arrays.stream(nums)
// 2)
.boxed()
// 3)
.collect(Collectors.collectingAndThen(Collectors.toSet(),
phonekemons -> Integer.min(phonekemons.size(), nums.length / 2)));
}
}
1) Arrays.stream(nums)
int[]๋ double[] ๊ฐ์ ์์ ํ์
๋ฐฐ์ด์ Stream ์์ฒด์์ ๋ค๋ฃฐ ์ ์๋ค. ์ด๋ฌํ ์์ํ์
๋ฐฐ์ด์ ๋ํด์ stream์์ ์ฌ์ฉํ๋ ์ฒด์ด๋ ํจ์๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์์ ํ์
์ ์ฉ Stream ํด๋์ค๋ฅผ ์ด์ฉํด์ผ ํ๋ค.
int[]์ ๊ฒฝ์ฐ IntStream ์ด ๋ฐ๋ก int ํ์
์ ์ฉ Stream ํด๋์ค์ด๋ค.
์ฌ๊ธฐ์ Arrays.stream(nums)
๋ nums๋ผ๋ int[] ๋ฐฐ์ด์ intStream์ผ๋ก ๋ณ๊ฒฝํด์ฃผ๋ ๊ฒ์ด๋ค.
2).boxed()
์์์ ์ค๋ช ํ๋๋ก, IntStream์ ๊ฒฝ์ฐ, int๋ผ๋ ์์ํ์ ์ ์ฉ Stream ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์, Wrapper ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ Collection์์๋ ์ฌ์ฉํ์ง ๋ชปํ๋ค. ๋ฐ๋ผ์ Collection ๊ธฐ๋ฐ์ ํจ์๋ฅผ ์ฐ๋ ค๋ฉด, boxed()์ ์ฌ์ฉํด ์์ํ์ ์ ์์ ์ ๋ง๋ Wrapper Class ํ์ ์ผ๋ก ๋ฐ๊ฟ์ค์ผํ๋ค.
ํฌ์ฅํ๋ค
๋ผ๋ ๋ป์ box์ ์๋ฏธ์ฒ๋ผ, ์์ํ์
์ Stream์ ์์ ์ ํ์
์ ๋ง๋ Wrapper Class Type์ Stream์ผ๋ก ๋ฐ๊ฟ์ค๋ค.
์ฌ๊ธฐ์๋ IntStream → Stream๋ก ๋ฐ๊ฟจ๋ค.
3) .collect(Collectors.collectingAndThen(Collectors.toSet(), ๋ ๋ฒ์งธ ํจ์)
- stream.collect() ๋ Stream ๊ฐ์ฒด๋ฅผ ํน์ ์๋ฃ ๊ตฌ์กฐ๋ก ๋ณ๊ฒฝํด์ฃผ๋ ์ต์ข
์ฐ์ฐ์์ด๋ค.
์๋ฅผ ๋ค์ด
Stream.collect(Collectors.toList()): Stream ๊ฐ์ฒด → ArrayList
Stream.collect(Collectors.toSet()): Stream ๊ฐ์ฒด → Set
์ผ๋ก ๋ฐ๊ฟ์ค๋ค.
์ด ์์๋ Collectors๋ผ๋ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ง ์๊ณ , ์ด๋ฌํ ์์ ์ ํ๋ ค๋ฉด ๋ค์ 3๊ฐ์ง ์ธ์๋ฅผ ๋ฃ์ด์ผ ํ๋ค.1๋ฒ supplier: Stream ๊ฐ์ฒด์ ์์๋ค์ด ๋ค์ด๊ฐ ์๋ก์ด ์ปจํ ์ด๋๋ฅผ ๋ง๋๋ ํจ์์ด๋ค.์์ ์์๋collect(ArrayList::new, ArrayList::add, ArrayList::addAll)
์ด๋ค.
๋น ArrayList๋ฅผ ๋ง๋ค๊ณ ๊ฑฐ๊ธฐ์ Stream ๊ฐ์ฒด ์์๋ค์ list.add()๋ก ๋ฃ๊ณ , ๋ณ๋ ฌ์ฒ๋ฆฌ๋ก ์ธํด ์๊ฒจ๋ ์ฌ๋ฌ ArrayList๋ค์ list.addAll()๋ก ํ๋๋ก ํตํฉํ๋ค. - 2๋ฒ accumulator: Stream ๊ฐ์ฒด์ ์์๋ค์ ๊ฒฐ๊ณผ ์ปจํ
์ด๋์ ์ด๋ป๊ฒ ์ถ๊ฐํ ์ง๋ฅผ ์ ์ํ๋ ํจ์์ด๋ค.
์๋ฅผ ๋ค์ด Set::add ์ด๋ฉด ์ค๋ณต ์์ด ๋ค์ด๊ฐ๋ ๊ฒ์ด๊ณ , List::add ๋ฉด List ํ ํด์ ๋ค ๋ค์ด๊ฐ๋ ๊ฒ์ด๋ค.
3๋ฒ, ๋ณ๋ ฌ ์คํธ๋ฆผ์ผ๋ก ์ฒ๋ฆฌํ๊ฒ ๋๋ฉด, 2๋ฒ์ ํจ์๋ก Stream ๊ฐ์ฒด ์์๋ค์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ๋์์ ์ฒ๋ฆฌํ๊ฒ ๋๊ณ 2๊ฐ ์ด์์ ๋ถ๋ถ ๊ฒฐ๊ณผ๊ฐ ๋ํ๋๊ฒ ๋๋ค. ์ด๋ ์ด๋ฌํ ๋ถ๋ถ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ป๊ฒ ํ๋๋ก ํฉ์น ์ง์ ๋ํ ๋ฐฉ๋ฒ์ ์ ์ํ๋ ํจ์์ด๋ค. <R> R collect(Supplier<R> supplier, BiConsumer<R, ? super T> accumulator, BiConsumer<R, R> combiner);
- Collectors.collectingAndThen((์ฒซ ๋ฒ์งธ ์์ง ํจ์), (๋ ๋ฒ์งธ ์ฒซ๋ฒ์งธ ํจ์ ๊ฒฐ๊ณผ์ ๋ํ ์ฒ๋ฆฌ ํจ์))
.collect()์ ๊ฒฐ๊ณผ๊ฐ ๋ฌด์กฐ๊ฑด ํน์ ์๋ฃ๊ตฌ์กฐ์ผ ํ์๋์๋ค. ๋ง์ฝCollectors.collectingAndThen()
์ ์ฌ์ฉํ๋ฉด ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ํน์ ์๋ฃํ์ ๊ฐ์ผ๋ก ๋ฐ๊ฟ ์ ์๋ค.
์ฌ๊ธฐ์๋ ์ฒซ๋ฒ์งธ ํจ์๋ก Collectors.toSet()์ ๋ฃ์ด์, Set ์๋ฃํ์ผ๋ก ๋ฐ๊พผ๋ค. (์ค๋ณต์ ๊ฑฐ)
์ค๋ณต์ ๊ฑฐ ์ดํ์๋ N/2๋ผ๋ Max ๊ฐ๊ณผ ํฌ์ผ๋ชฌ ์ข ์ ๊ฐ์๋ฅผ ์ธ์, ๋ ์์ ์ชฝ์ ์ถ๋ ฅ ํ๋๋ก ํ๋ค.
5. ์ฑ์ฅ ๊ฒฐ๊ณผ
import java.io.*;
import java.util.*;
class Solution {
public int solution(int[] nums) {
int A = (int) Arrays.stream(nums).distinct().count();
int B = nums.length/2;
return A >= B? B : A;
}
}
์์ ํ์ด๋ฅผ ๋ณด๋ฉด์, ๊ตณ์ด ์์ํ Stream์ Steam๊ฐ์ฒด๋ก ๋ฐ๊พธ์ด์ Collection ๊ด๋ จ ํจ์๋ฅผ ์จ์ผํ ๊น? ๋ผ๋ ์๊ฐ์ด ๋ค์๋ค. ์ดํ ์์์คํธ๋ฆผ์ distinct()๋ผ๋ ์ค๋ณต ์ ๊ฑฐ ํจ์๋ฅผ ๋ฐ๊ฒฌํ๊ณ ํด๋น ํจ์๋ฅผ ์จ์ ๋ฌธ์ ๋ฅผ ํ์๋ค.