Contents

폰켓λͺ¬ (with.Java)

   May 31, 2024     2 min read

β€œν°μΌ“λͺ¬ (with.Java)” λ¬Έμ œμ— λŒ€ν•˜μ—¬ μ•Œμ•„λ³Έ κΈ€μž…λ‹ˆλ‹€.

μ½”λ”© ν…ŒμŠ€νŠΈ 문제λ₯Ό ν’€λ©°, ν’€μ—ˆλ˜ λ¬Έμ œμ— λŒ€ν•œ νšŒκ³ μ™€ λ‹€λ₯Έ 풀이 방법을 μ•Œμ•„λ³΄λ©°, μ•Œμ•„κ°€κ³ μž ν•©λ‹ˆλ‹€.

λ¬Έμ œμ— λŒ€ν•΄ λ¨Όμ € μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

문제

당신은 폰켓λͺ¬μ„ 작기 μœ„ν•œ 였랜 μ—¬ν–‰ 끝에, 홍 λ°•μ‚¬λ‹˜μ˜ 연ꡬ싀에 λ„μ°©ν–ˆμŠ΅λ‹ˆλ‹€.

홍 λ°•μ‚¬λ‹˜μ€ λ‹Ήμ‹ μ—κ²Œ μžμ‹ μ˜ 연ꡬ싀에 μžˆλŠ” 총 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 ν•˜λ©΄ λ©λ‹ˆλ‹€.

μž…μΆœλ ₯ μ˜ˆμ‹œ

numsresult
[3, 1, 2, 3]2
[3, 3, 3, 2, 2, 4]3
[3, 3, 3, 2, 2, 2]2

λ¬Έμ œμ— λŒ€ν•œ λ‚˜μ˜ 풀이

import java.util.Arrays;
class Solution {
    public int solution(int[] nums) {
        int answer = 0;
        int choiceNum = nums.length / 2;
        nums = Arrays.stream(nums).distinct().toArray();

        if(nums.length >= choiceNum){
            return choiceNum;
        }else{
            return nums.length;
        }
    }
}

풀이 리뷰

solution λ©”μ„œλ“œλŠ” μ •μˆ˜ λ°°μ—΄ numsλ₯Ό μž…λ ₯으둜 λ°›μŠ΅λ‹ˆλ‹€.

choiceNum λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜κ³ , λ°°μ—΄μ˜ 길이의 μ ˆλ°˜μ„ μ €μž₯ν•©λ‹ˆλ‹€. μ΄λŠ” 선택할 수 μžˆλŠ” 숫자의 μ΅œλŒ€ 개수λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

Arrays.stream(nums).distinct().toArray()λ₯Ό μ‚¬μš©ν•˜μ—¬ μ€‘λ³΅λœ 숫자λ₯Ό μ œκ±°ν•œ ν›„, λ°°μ—΄λ‘œ λ³€ν™˜ν•˜μ—¬ nums에 μ €μž₯ν•©λ‹ˆλ‹€.

if 문을 μ‚¬μš©ν•˜μ—¬ 쀑볡이 제거된 λ°°μ—΄μ˜ 길이가 choiceNum보닀 ν¬κ±°λ‚˜ κ°™μœΌλ©΄ choiceNum을 λ°˜ν™˜ν•©λ‹ˆλ‹€. μ΄λŠ” 쀑볡이 제거된 λ°°μ—΄μ˜ 길이가 선택할 수 μžˆλŠ” μ΅œλŒ€ 숫자의 κ°œμˆ˜λ³΄λ‹€ ν¬λ‹€λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.

그렇지 μ•Šμ€ κ²½μš°μ—λŠ” 쀑볡이 제거된 λ°°μ—΄μ˜ 길이λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

μ΅œμ’…μ μœΌλ‘œ μ„ νƒλœ 숫자의 개수λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

이 μ½”λ“œλŠ” λ°°μ—΄μ—μ„œ μ€‘λ³΅λœ 숫자λ₯Ό μ œκ±°ν•˜κ³ , 선택할 수 μžˆλŠ” 숫자의 μ΅œλŒ€ 개수λ₯Ό κΈ°μ€€μœΌλ‘œ μ„œλ‘œ λ‹€λ₯Έ 숫자의 개수λ₯Ό λ°˜ν™˜ν•˜λŠ” κ°„λ‹¨ν•œ 방법을 μ‚¬μš©ν•©λ‹ˆλ‹€.