Contents

체윑볡 (with.Java)

   Aug 13, 2024     3 min read

체윑볡 (with.Java) λ¬Έμ œμ— λŒ€ν•˜μ—¬ μ•Œμ•„λ³Έ κΈ€μž…λ‹ˆλ‹€.

μ½”λ”© ν…ŒμŠ€νŠΈ 문제λ₯Ό ν’€λ©°, ν’€μ—ˆλ˜ λ¬Έμ œμ— λŒ€ν•œ 회고λ₯Ό ν•΄λ³΄κ³ μž ν•©λ‹ˆλ‹€.

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

문제

μ μ‹¬μ‹œκ°„μ— 도둑이 λ“€μ–΄, 일뢀 학생이 μ²΄μœ‘λ³΅μ„ λ„λ‚œλ‹Ήν–ˆμŠ΅λ‹ˆλ‹€.

λ‹€ν–‰νžˆ μ—¬λ²Œ 체윑볡이 μžˆλŠ” 학생이 μ΄λ“€μ—κ²Œ μ²΄μœ‘λ³΅μ„ 빌렀주렀 ν•©λ‹ˆλ‹€.

ν•™μƒλ“€μ˜ λ²ˆν˜ΈλŠ” 체격 순으둜 맀겨져 μžˆμ–΄, λ°”λ‘œ μ•žλ²ˆν˜Έμ˜ ν•™μƒμ΄λ‚˜ λ°”λ‘œ λ’·λ²ˆν˜Έμ˜ ν•™μƒμ—κ²Œλ§Œ μ²΄μœ‘λ³΅μ„ λΉŒλ €μ€„ 수 μžˆμŠ΅λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, 4번 학생은 3번 ν•™μƒμ΄λ‚˜ 5번 ν•™μƒμ—κ²Œλ§Œ μ²΄μœ‘λ³΅μ„ λΉŒλ €μ€„ 수 μžˆμŠ΅λ‹ˆλ‹€.

체윑볡이 μ—†μœΌλ©΄ μˆ˜μ—…μ„ 듀을 수 μ—†κΈ° λ•Œλ¬Έμ— μ²΄μœ‘λ³΅μ„ 적절히 빌렀 μ΅œλŒ€ν•œ λ§Žμ€ 학생이 μ²΄μœ‘μˆ˜μ—…μ„ λ“€μ–΄μ•Ό ν•©λ‹ˆλ‹€.

전체 ν•™μƒμ˜ 수 n, μ²΄μœ‘λ³΅μ„ λ„λ‚œλ‹Ήν•œ ν•™μƒλ“€μ˜ λ²ˆν˜Έκ°€ λ‹΄κΈ΄ λ°°μ—΄ lost, μ—¬λ²Œμ˜ μ²΄μœ‘λ³΅μ„ κ°€μ Έμ˜¨ ν•™μƒλ“€μ˜ λ²ˆν˜Έκ°€ λ‹΄κΈ΄ λ°°μ—΄ reserveκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, μ²΄μœ‘μˆ˜μ—…μ„ 듀을 수 μžˆλŠ” ν•™μƒμ˜ μ΅œλŒ“κ°’μ„ return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μž‘μ„±ν•΄μ£Όμ„Έμš”.

μ œν•œμ‚¬ν•­

  • 전체 ν•™μƒμ˜ μˆ˜λŠ” 2λͺ… 이상 30λͺ… μ΄ν•˜μž…λ‹ˆλ‹€.
  • μ²΄μœ‘λ³΅μ„ λ„λ‚œλ‹Ήν•œ ν•™μƒμ˜ μˆ˜λŠ” 1λͺ… 이상 nλͺ… μ΄ν•˜μ΄κ³  μ€‘λ³΅λ˜λŠ” λ²ˆν˜ΈλŠ” μ—†μŠ΅λ‹ˆλ‹€.
  • μ—¬λ²Œμ˜ μ²΄μœ‘λ³΅μ„ κ°€μ Έμ˜¨ ν•™μƒμ˜ μˆ˜λŠ” 1λͺ… 이상 nλͺ… μ΄ν•˜μ΄κ³  μ€‘λ³΅λ˜λŠ” λ²ˆν˜ΈλŠ” μ—†μŠ΅λ‹ˆλ‹€.
  • μ—¬λ²Œ 체윑볡이 μžˆλŠ” ν•™μƒλ§Œ λ‹€λ₯Έ ν•™μƒμ—κ²Œ μ²΄μœ‘λ³΅μ„ λΉŒλ €μ€„ 수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ—¬λ²Œ μ²΄μœ‘λ³΅μ„ κ°€μ Έμ˜¨ 학생이 μ²΄μœ‘λ³΅μ„ λ„λ‚œλ‹Ήν–ˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λ•Œ 이 학생은 μ²΄μœ‘λ³΅μ„ ν•˜λ‚˜λ§Œ λ„λ‚œλ‹Ήν–ˆλ‹€κ³  κ°€μ •ν•˜λ©°, 남은 체윑볡이 ν•˜λ‚˜μ΄κΈ°μ— λ‹€λ₯Έ ν•™μƒμ—κ²ŒλŠ” μ²΄μœ‘λ³΅μ„ λΉŒλ €μ€„ 수 μ—†μŠ΅λ‹ˆλ‹€.

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

nlostreservereturn
5[2, 4][1, 3, 5]5
5[2, 4][3]4
3[3][1]2

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

import java.util.Arrays;

class Solution {
    public int solution(int n, int[] lost, int[] reserve) {
        int answer = 0;
        Arrays.sort(reserve);
        Arrays.sort(lost);

        answer = n - lost.length;

        for (int i = 0; i < lost.length; i++) {
			for (int j = 0; j < reserve.length; j++) {
				if (lost[i] == reserve[j]) {
					answer++;
					lost[i] = -1;
					reserve[j] = -1;
                    break;
				}
			}
		}
        for(int num : lost){
            for (int j = 0; j < reserve.length; j++) {
				if (num - 1 == reserve[j] || num + 1 == reserve[j]) {
					answer++;
					reserve[j] = -1;
					break;
				}
			}
        }

        return answer;
    }
}

풀이 μ„€λͺ…

λ¨Όμ € μ—¬λΆ„μ˜ μ²΄μœ‘λ³΅μ„ κ°€μ Έμ˜¨ 학생듀과 λ„λ‚œλ‹Ήν•œ ν•™μƒλ“€μ˜ 배열을 μ •λ ¬ν•©λ‹ˆλ‹€.

μ΄λŠ” 이후 비ꡐ κ³Όμ •μ—μ„œ 더 효율적으둜 μ§„ν–‰ν•˜κΈ° μœ„ν•¨μž…λ‹ˆλ‹€.

λ„λ‚œλ‹Ήν•œ 학생 수λ₯Ό μ œμ™Έν•œ 전체 학생 수λ₯Ό μ΄ˆκΈ°κ°’μœΌλ‘œ μ„€μ •ν•©λ‹ˆλ‹€.

μ—¬λΆ„μ˜ μ²΄μœ‘λ³΅μ„ κ°€μ Έμ˜¨ 학생이 λ„λ‚œλ‹Ήν•œ ν•™μƒμ—κ²Œ μ²΄μœ‘λ³΅μ„ λΉŒλ €μ€„ 수 μžˆλŠ” 경우λ₯Ό κ³ λ €ν•˜μ—¬ 일단 λ„λ‚œλ‹Ήν•œ 학생 수λ₯Ό 전체 학생 μˆ˜μ—μ„œ λΊλ‹ˆλ‹€.

λ„λ‚œλ‹Ήν•œ 학생과 μ—¬λΆ„μ˜ μ²΄μœ‘λ³΅μ„ κ°€μ Έμ˜¨ 학생이 같은 번호인 경우λ₯Ό μ°Ύμ•„μ„œ ν•΄λ‹Ή 학생듀을 μ²˜λ¦¬ν•©λ‹ˆλ‹€.

λ„λ‚œλ‹Ήν•œ 학생이 μ²΄μœ‘λ³΅μ„ μžƒμ–΄λ²„λ Έμ§€λ§Œ μ—¬λΆ„μ˜ μ²΄μœ‘λ³΅μ„ κ°€μ Έμ˜¨ κ²½μš°μ΄λ―€λ‘œ, 이 학생듀은 체윑 μˆ˜μ—…μ„ 듀을 수 μžˆμŠ΅λ‹ˆλ‹€.

이 λ•Œ, ν•΄λ‹Ή 학생듀을 λ„λ‚œλ‹Ήν•œ 학생 수λ₯Ό μ œμ™Έν•œ 전체 학생 μˆ˜μ— λ”ν•΄μ€λ‹ˆλ‹€.

처리된 학생듀은 λ‹€μŒ νƒμƒ‰μ—μ„œ μ€‘λ³΅ν•˜μ—¬ κ³ λ €λ˜μ§€ μ•Šλ„λ‘ ν•΄λ‹Ή ν•™μƒλ“€μ˜ 번호λ₯Ό -1둜 λ³€κ²½ν•©λ‹ˆλ‹€.

μ—¬λΆ„μ˜ μ²΄μœ‘λ³΅μ„ κ°€μ Έμ˜¨ 학생듀과 λ„λ‚œλ‹Ήν•œ 학생듀 μ‚¬μ΄μ˜ 거리가 1인 경우λ₯Ό κ³ λ €ν•˜μ—¬ μ²΄μœ‘λ³΅μ„ λΉŒλ €μ€„ 수 μžˆλŠ”μ§€λ₯Ό νƒμƒ‰ν•©λ‹ˆλ‹€.

μ—¬λΆ„μ˜ μ²΄μœ‘λ³΅μ„ κ°€μ Έμ˜¨ 학생듀과 λ„λ‚œλ‹Ήν•œ 학생듀 μ‚¬μ΄μ˜ 거리가 1이면 μ„œλ‘œ μ²΄μœ‘λ³΅μ„ λΉŒλ €μ€„ 수 μžˆμŠ΅λ‹ˆλ‹€.

이 경우, λ„λ‚œλ‹Ήν•œ 학생 수λ₯Ό μ œμ™Έν•œ 전체 학생 μˆ˜μ— λ”ν•΄μ€λ‹ˆλ‹€.

처리된 학생듀은 λ‹€μŒ νƒμƒ‰μ—μ„œ μ€‘λ³΅ν•˜μ—¬ κ³ λ €λ˜μ§€ μ•Šλ„λ‘ ν•΄λ‹Ή ν•™μƒλ“€μ˜ 번호λ₯Ό -1둜 λ³€κ²½ν•©λ‹ˆλ‹€.

μ΅œμ’…μ μœΌλ‘œ λ„λ‚œλ‹Ήν•œ 학생을 μ œμ™Έν•œ 전체 학생 μˆ˜κ°€ 체윑 μˆ˜μ—…μ„ 듀을 수 μžˆλŠ” 학생 μˆ˜μž…λ‹ˆλ‹€. 이 값을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

이 μ½”λ“œλŠ” 두 번의 λ°˜λ³΅λ¬Έμ„ 톡해 주어진 쑰건에 따라 학생듀이 체윑 μˆ˜μ—…μ„ 듀을 수 μžˆλŠ” 경우λ₯Ό νƒμƒ‰ν•˜κ³ , κ·Έ 수λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

κ²°λ‘ 

μœ„ μ½”λ“œμ—λŠ” μ—¬λŸ¬ 쑰건에 따라 λ„λ‚œλ‹Ήν•œ 학생과 μ—¬λΆ„μ˜ μ²΄μœ‘λ³΅μ„ κ°€μ Έμ˜¨ 학생 μ‚¬μ΄μ˜ 관계λ₯Ό νƒμƒ‰ν•˜λŠ” 과정이 κ΅¬ν˜„λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

이 과정은 주어진 문제의 쑰건에 맞게 μƒμ„Ένžˆ μ„€κ³„λ˜μ—ˆμœΌλ©°, λ¨Όμ € λ„λ‚œλ‹Ήν•œ 학생과 μ—¬λΆ„μ˜ μ²΄μœ‘λ³΅μ„ κ°€μ Έμ˜¨ 학생이 같은 번호인 경우λ₯Ό μ²˜λ¦¬ν•˜κ³ , κ·Έ λ‹€μŒμœΌλ‘œλŠ” μ—¬λΆ„μ˜ μ²΄μœ‘λ³΅μ„ κ°€μ Έμ˜¨ 학생듀과 λ„λ‚œλ‹Ήν•œ 학생듀 μ‚¬μ΄μ˜ 거리가 1인 경우λ₯Ό κ³ λ €ν•˜μ—¬ μ²΄μœ‘λ³΅μ„ λΉŒλ €μ€„ 수 μžˆλŠ”μ§€λ₯Ό ν™•μΈν•©λ‹ˆλ‹€.