๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Algorithm

[Algoritm/Java][ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ํฐ์ผ“๋ชฌ

๋ฐ˜์‘ํ˜•

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ํฐ์ผ“๋ชฌ

https://programmers.co.kr/learn/courses/30/lessons/1845

๋ฌธ์ œ ์„ค๋ช…

๋‹น์‹ ์€ ํฐ์ผ“๋ชฌ์„ ์žก๊ธฐ ์œ„ํ•œ ์˜ค๋žœ ์—ฌํ–‰ ๋์—, ํ™ ๋ฐ•์‚ฌ๋‹˜์˜ ์—ฐ๊ตฌ์‹ค์— ๋„์ฐฉํ–ˆ์Šต๋‹ˆ๋‹ค. ํ™ ๋ฐ•์‚ฌ๋‹˜์€ ๋‹น์‹ ์—๊ฒŒ ์ž์‹ ์˜ ์—ฐ๊ตฌ์‹ค์— ์žˆ๋Š” ์ด N ๋งˆ๋ฆฌ์˜ ํฐ์ผ“๋ชฌ ์ค‘์—์„œ N/2๋งˆ๋ฆฌ๋ฅผ ๊ฐ€์ ธ๊ฐ€๋„ ์ข‹๋‹ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค.
ํ™ ๋ฐ•์‚ฌ๋‹˜ ์—ฐ๊ตฌ์‹ค์˜ ํฐ์ผ“๋ชฌ์€ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ๋ฒˆํ˜ธ๋ฅผ ๋ถ™์—ฌ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ™์€ ์ข…๋ฅ˜์˜ ํฐ์ผ“๋ชฌ์€ ๊ฐ™์€ ๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์—ฐ๊ตฌ์‹ค์— ์ด 4๋งˆ๋ฆฌ์˜ ํฐ์ผ“๋ชฌ์ด ์žˆ๊ณ , ๊ฐ ํฐ์ผ“๋ชฌ์˜ ์ข…๋ฅ˜ ๋ฒˆํ˜ธ๊ฐ€ [3๋ฒˆ, 1๋ฒˆ, 2๋ฒˆ, 3๋ฒˆ]์ด๋ผ๋ฉด ์ด๋Š” 3๋ฒˆ ํฐ์ผ“๋ชฌ ๋‘ ๋งˆ๋ฆฌ, 1๋ฒˆ ํฐ์ผ“๋ชฌ ํ•œ ๋งˆ๋ฆฌ, 2๋ฒˆ ํฐ์ผ“๋ชฌ ํ•œ ๋งˆ๋ฆฌ๊ฐ€ ์žˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ด๋•Œ, 4๋งˆ๋ฆฌ์˜ ํฐ์ผ“๋ชฌ ์ค‘ 2๋งˆ๋ฆฌ๋ฅผ ๊ณ ๋ฅด๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด 6๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์ฒซ ๋ฒˆ์งธ(3๋ฒˆ), ๋‘ ๋ฒˆ์งธ(1๋ฒˆ) ํฐ์ผ“๋ชฌ์„ ์„ ํƒ
  2. ์ฒซ ๋ฒˆ์งธ(3๋ฒˆ), ์„ธ ๋ฒˆ์งธ(2๋ฒˆ) ํฐ์ผ“๋ชฌ์„ ์„ ํƒ
  3. ์ฒซ ๋ฒˆ์งธ(3๋ฒˆ), ๋„ค ๋ฒˆ์งธ(3๋ฒˆ) ํฐ์ผ“๋ชฌ์„ ์„ ํƒ
  4. ๋‘ ๋ฒˆ์งธ(1๋ฒˆ), ์„ธ ๋ฒˆ์งธ(2๋ฒˆ) ํฐ์ผ“๋ชฌ์„ ์„ ํƒ
  5. ๋‘ ๋ฒˆ์งธ(1๋ฒˆ), ๋„ค ๋ฒˆ์งธ(3๋ฒˆ) ํฐ์ผ“๋ชฌ์„ ์„ ํƒ
  6. ์„ธ ๋ฒˆ์งธ(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 ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

Code

import java.util.HashMap;
class Solution {
    public int solution(int[] nums) {
        int answer = 0;
        HashMap<Integer,Integer> ponketmon = new HashMap();
        for(int num: nums){
            ponketmon.put(num,ponketmon.getOrDefault(num,0)+1);
        }

        if(ponketmon.size() > nums.length/2){
            answer = nums.length/2;
        }
        else {
            answer = ponketmon.size();
        }
        return answer;
    }
}

Code ์„ค๋ช…

์ด ๋ฌธ์ œ๋Š” ์ฒ˜์Œ ๋ดค์„๋•Œ๋Š” ์กฐํ•ฉ์„ ํ•˜๋‚˜ํ•˜๋‚˜ ๋‹ค ์„ธ์•ผ๋˜๋Š”๊ฑฐ ๊ฐ™์ง€๋งŒ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์ค‘๋ณต๋˜๋Š” ๊ฒƒ๋“ค์„ ์ œ๊ฑฐํ•œ ๊ฐฏ์ˆ˜๊ฐ€
nums.length/2๋ณด๋‹ค ํฌ๋ฉด nums.length/2๊ฐ€ answer์ด๊ณ , ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ์ค‘๋ณต๋˜๋Š” ๊ฒƒ๋“ค์„ ์ œ๊ฑฐํ•œ ๊ฐฏ์ˆ˜๊ฐ€ answer๊ฐ€ ๋œ๋‹ค.
์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ €๋ฒˆ์— ์™„์ฃผํ•˜์ง€ ๋ชปํ•œ ์„ ์ˆ˜์—์„œ ์‚ฌ์šฉํ–ˆ๋˜ HashMap์„ ์ด์šฉํ•˜๋ฉด ์ค‘๋ณต์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์„๊ฒƒ ๊ฐ™์•„์„œ ์‚ฌ์šฉํ•ด ์ฃผ์—ˆ๋‹ค.

๋ฐฐ์šด์ 

์ €๋ฒˆ์— ์‚ฌ์šฉํ–ˆ๋˜ HashMap์„ ์ด์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ๋‚˜์„œ ๋‹ค๋ฅธ์‚ฌ๋žŒ์˜ ํ’€์ด๋ฅผ ๋ณด๋‹ˆ HashSet์ด๋ผ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์•Œ๊ฒŒ๋˜์—ˆ๋‹ค.
HashMap์€ key์™€ value๊ฐ€ ์žˆ์ง€๋งŒ HashSet์€ value๊ฐ€ ์žˆ๋‹ค๋Š” ์ฐจ์ด์ ์ด์žˆ๋‹ค. ์ฃผ๋œ ์ฐจ์ด์ ์€ HashMap์ด Map Interface Hierarchy์— ์†ํ•˜๊ณ  HashSet์ด Collection Interface Hierarchy์— ์†ํ•ด์žˆ๋Š” ๋™์•ˆ Collection ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ด€๋ จ์ด ์—†๋‹ค๋Š” ๊ฒƒ์ด๋‹ค ๋ผ๋Š”๊ฑด๋ฐ ๋ฌด์Šจ ์†Œ๋ฆฌ์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค...
์•„๋ฌดํŠผ ์ด๋ฒˆ ๋ฌธ์ œ๋Š” Key๊ฐ€ ํ•„์š”์—†์œผ๋ฏ€๋กœ HashSet์„ ์ด์šฉํ•ด์„œ ์ฝ”๋“œ๋ฅผ ๋ฐ”๊ฟ”๋ณด์•˜๋‹ค. HashMap์„ HashSet์œผ๋กœ ๋ฐ”๊พธ๊ธฐ๋งŒ ํ•˜๋ฉด ๋˜๋Š” ๋˜‘๊ฐ™์€ ๊ตฌ์กฐ์˜ ์ฝ”๋“œ์ด๋‹ค

HashMap ์‹œ๊ฐ„

HashSet ์‹œ๊ฐ„

์˜๋ฏธ์žˆ๋Š” ์‹œ๊ฐ„ ์ฐจ์ด์ธ์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ HashSet์ด ๋” ๋น ๋ฅด๊ธด ํ•˜๋‹ค.

HashSet์„ ์ด์šฉํ•œ Code

import java.util.HashSet;
class Solution {
    public int solution(int[] nums) {
        int answer = 0;
        HashSet<Integer> ponketmon = new HashSet();
        for(int num: nums){
            ponketmon.add(num);
        }

        if(ponketmon.size() > nums.length/2){
            answer = nums.length/2;
        }
        else {
            answer = ponketmon.size();
        }
        return answer;
    }
}
๋ฐ˜์‘ํ˜•