우규이인우윀
Eager To Learn 🌌
우규이인우윀
전체 방문자
였늘
μ–΄μ œ

λΈ”λ‘œκ·Έ 메뉴

  • 🏑 ν™ˆ
  • πŸš€ κΉƒν—ˆλΈŒ
  • β›… νƒœκ·Έ ν΄λΌμš°λ“œ
  • λΆ„λ₯˜ 전체보기 (217)
    • πŸ‘¨πŸ»‍πŸ’» PS (170)
      • JAVA (82)
      • MYSQL (1)
      • Docker (2)
      • PYTHON (24)
      • LeetCode 150 (39)
      • Algorithm 기법 (1)
      • 바킹독 (21)
    • λΈ”λ‘œκ·Έ 이사 (0)
    • Error (1)
    • CS (15)
      • DataBase (2)
      • OS (7)
      • Network (1)
      • Spring (1)
      • 자료ꡬ쑰 (3)
      • Java (1)
    • Learned (7)
      • Spring (7)
    • κ°œλ°œμ„œμ  (15)
      • 가상 λ©΄μ ‘ μ‚¬λ‘€λ‘œ λ°°μš°λŠ” λŒ€κ·œλͺ¨ μ‹œμŠ€ν…œ 섀계 기초 (1)
      • 였브젝트 - 쑰영호 (7)
      • μΉœμ ˆν•œ SQL νŠœλ‹ (7)
    • 회고 (2)
hELLO Β· Designed By μ •μƒμš°.
우규이인우윀

Eager To Learn 🌌

πŸ‘¨πŸ»‍πŸ’» PS/LeetCode 150

[Java] 169. Majority Element

2023. 8. 24. 11:16

문제 νŒŒμ•…

 

크기가 n인 λ°°μ—΄ nums κ°€ μ£Όμ–΄μ§„λ‹€.

 

n/2 보닀 많이 λ“±μž₯ν•˜λŠ” 수λ₯Ό λ°˜ν™˜ν•΄μ•Όν•œλ‹€.

 


풀이

 

1️⃣ ν•΄μ‹œ ν™œμš©

λ°”λ‘œ κ°„λ‹¨ν•˜κ²Œ λ– μ˜€λ₯Έ 풀이이닀.

 

λ¨Όμ €, 배열을 μˆœνšŒν•˜λ©΄μ„œ μ›μ†Œλ₯Ό key κ°’μœΌλ‘œ μ›μ†Œκ°€ λ‚˜νƒ€λ‚œ 횟수λ₯Ό value κ°’μœΌλ‘œ map에 κΈ°λ‘ν•œ λ’€,

 

map을 ν•œλ²ˆ 더 μˆœνšŒν•˜λ©΄μ„œ, λ‚˜νƒ€λ‚œ νšŸμˆ˜κ°€ n/2 보닀 큰 경우 λ°˜ν™˜ν•˜λŠ” 방식이닀.

 

import java.util.*;

class Solution {
    public int majorityElement(int[] nums) {
        int n = nums.length;
        int result = nums[0];
        HashMap<Integer, Integer> map = new HashMap<>();

        for (int num : nums) {
            map.put(num, map.getOrDefault(num, 0) + 1);
        }

        for (Integer key : map.keySet()) {
            if (map.get(key) > n / 2) {
                result = key;
                break;
            }
        }

        return result;
    }
}

 

κ²°κ³Ό

 

이 방식은, μ‹œκ°„ λ³΅μž‘λ„ O(N) 그리고 곡간 λ³΅μž‘λ„λ„ O(N) 방식이 λœλ‹€.

 

이런 λ¬Έμž₯이 μžˆμ–΄μ„œ, 곡간 λ³΅μž‘λ„λ₯Ό O(1) λ‚΄λ‘œ ν•΄κ²°ν•  수 μžˆλŠ” 방법을 κ³ λ―Όν•΄λ³΄μ•˜λ‹€.

 

 

2️⃣ O(1) 곡간 λ³΅μž‘λ„ 풀이

 

혼자 해닡을 고민해보닀가, λ„μ €νžˆ 아이디어가 λ– μ˜€λ₯΄μ§€ μ•Šμ•„μ„œ λ‹€λ₯Έ 닡을 μ°Έκ³ ν•΄λ³΄μ•˜λ‹€.

 

μ•„μ΄λ””μ–΄λŠ”, μš°λ¦¬κ°€ κ΅¬ν•΄μ•Όν•˜λŠ” μˆ˜λŠ” n/2 보닀 큰 횟수둜 λ“±μž₯ν•˜λŠ” μˆ˜μ΄λ‹€.

 

λ”°λΌμ„œ, 배열을 μˆœνšŒν•˜λ©΄μ„œ μ›μ†Œλ₯Ό μΉ΄μš΄νŒ…ν•˜λŠ”λ°

 

λ‹€λ₯Έ μ›μ†Œκ°€ λ‚˜μ˜€λ©΄ μΉ΄μš΄νŒ…μ„ -1 ν•΄μ€€λ‹€.

 

μΉ΄μš΄νŒ… 값이 0이 되면, μΉ΄μš΄νŒ…ν•˜λŠ” μ›μ†Œλ₯Ό ꡐ체해쀀닀.

 

결과적으둜 μΉ΄μš΄νŒ…ν•˜λŠ” μ›μ†Œκ°€ 닡이 λœλ‹€.

 

import java.util.*;
class Solution {
    public int majorityElement(int[] nums) {
        int num = nums[0];
        int cnt = 0;
    
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] == num) {
                cnt++;
            } else {
                cnt--;
                if (cnt == 0) {
                    num = nums[i];
                    cnt = 1;
                }
            }
        }

        return num;
    }
}

 

이 ν’€μ΄λŠ”, μ§κ΄€μ μœΌλ‘œλŠ” 이해가 λ˜λŠ”λ° μˆ˜ν•™μ μœΌλ‘œ 잘 이해가 λ˜μ§€ μ•Šμ•˜λ‹€.

 

λ”°λΌμ„œ κ²€μƒ‰ν•΄λ³΄λ‹ˆ, Boyer-Moore 과반수 νˆ¬ν‘œ μ•Œκ³ λ¦¬μ¦˜μ΄λΌλŠ” μ΄λ¦„μœΌλ‘œ μ•Œκ³ λ¦¬μ¦˜μ΄ μ‘΄μž¬ν–ˆλ‹€.

 

λ°°μ—΄ 내에 절반이 λ„˜λŠ” μˆ˜μ— ν•΄λ‹Ήν•˜λŠ” μ›μ†Œκ°€ 보μž₯이 되면 μ‚¬μš©ν•  수 μžˆλŠ” μ•Œκ³ λ¦¬μ¦˜μ΄λΌκ³  ν•œλ‹€.

 

κ²°κ³Ό


 

πŸ“– 회고

λ¬Έμ œκ°€ λ„ˆλ¬΄ κ°„λ‹¨ν•΄μ„œ 금방 끝낼 수 μžˆμ„ 쀄 μ•Œμ•˜λŠ”λ°,

 

곡간 λ³΅μž‘λ„λ₯Ό κ°œμ„ ν•˜λŠ” 방법을 λ– μ˜¬λ¦¬λŠλΌ 거의 1μ‹œκ°„ 30뢄을 λΆ™μž‘μ•˜λ‹€.

 

κ·Έλž˜λ„ 였래 κ³ λ―Όν•΄λ³Έ 만큼, κ°œμ„  방법이 머릿속에 μ˜€λž«λ™μ•ˆ λ‚¨μ•„μžˆμ„ 것 κ°™λ‹€.

 

πŸ’‘ "과반수 μš”μ†Œμ˜ λ“±μž₯ νšŸμˆ˜κ°€ λ‚˜λ¨Έμ§€ μš”μ†Œλ“€μ˜ λ“±μž₯ 횟수λ₯Ό μƒμ‡„μ‹œν‚€λŠ” 경우"λ₯Ό μ΄μš©ν•œ 것

 

μœ„ 아이디어λ₯Ό 머릿속에 넣어두면, λ‚˜μ€‘μ— μ‰½κ²Œ λ– μ˜¬λ¦΄ 수 μžˆμ„ 것 κ°™λ‹€.

    'πŸ‘¨πŸ»‍πŸ’» PS/LeetCode 150' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
    • [Java] 121. Best Time to Buy and Sell Stock
    • [Java] 189. Rotate Array
    • [Java] 80. Remove Duplicates from Sorted Array II
    • [Java] 26. Remove Duplicates from Sorted Array
    우규이인우윀
    우규이인우윀
    개발자 κΏˆλ‚˜λ¬΄

    ν‹°μŠ€ν† λ¦¬νˆ΄λ°”