Hello Kitty Eyes Shut
๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ’ป ์ฝ”ํ…Œ/๐Ÿ“Œ JAVA

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/JAVA] ๋ง์น ํ•˜๊ธฐ

๋ฐ˜์‘ํ˜•

 

 

 

๐Ÿ”— ๋ฌธ์ œ ๋ฐ”๋กœ๊ฐ€๊ธฐ

 

https://school.programmers.co.kr/learn/courses/30/lessons/161989

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

SW๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ํ‰๊ฐ€, ๊ต์œก์˜ Total Solution์„ ์ œ๊ณตํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์„ฑ์žฅ์„ ์œ„ํ•œ ๋ฒ ์ด์Šค์บ ํ”„

programmers.co.kr

 


๐Ÿ“Œ ๋ฌธ์ œ ์š”์•ฝ

 

 

 

๐ŸŽจ ๋กค๋Ÿฌ๋กœ ๋ฒฝ ์น ํ•˜๊ธฐ

๐Ÿ–Œ๏ธ ํŽ˜์ธํŠธ์น  ๊ทœ์น™

  • ๋กค๋Ÿฌ์˜ ๊ธธ์ด๋Š” m ๋ฏธํ„ฐ์ด๋‹ค. (์ฆ‰, ํ•œ ๋ฒˆ ์น ํ•  ๋•Œ m ๊ฐœ์˜ ์—ฐ์†๋œ ๊ตฌ์—ญ์„ ํ•œ ๋ฒˆ์— ์น ํ•  ์ˆ˜ ์žˆ๋‹ค.)
  • ๋กค๋Ÿฌ์˜ ์–‘ ๋์€ ๊ตฌ์—ญ ๊ฒฝ๊ณ„๋‚˜ ๋ฒฝ์˜ ๋์— ๋งž์ถฐ์•ผ ํ•œ๋‹ค. (๋ฒฝ์—์„œ ๋ฒ—์–ด๋‚˜๋ฉด โŒ)
  • ํ•œ ๊ตฌ์—ญ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ์น ํ•ด๋„ ์ƒ๊ด€ ์—†๋‹ค.
  • ๋‹ค์‹œ ์น ํ•ด์•ผ ํ•  ๊ตฌ์—ญ์€ ์ ์–ด๋„ ํ•œ ๋ฒˆ์€ ์ƒ‰์น ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

 

๐ŸŽฏ ๋ชฉํ‘œ

  • ํŽ˜์ธํŠธ์น ์„ ํ•˜๋Š” ํšŸ์ˆ˜๋ฅผ ์ตœ์†Œํ™”ํ•˜์—ฌ ๊ตฌํ•ด์•ผ ํ•œ๋‹ค.

 

๐Ÿ’Œ ์ž…๋ ฅ

  • n: ๋ฒฝ์˜ ์ „์ฒด ๊ธธ์ด
  • m: ๋กค๋Ÿฌ์˜ ๊ธธ์ด (ํ•œ ๋ฒˆ์— ์น ํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ๊ฐ„์˜ ์นธ ์ˆ˜)
  • section[ ]: ๋‹ค์‹œ ์น ํ•ด์•ผ ํ•˜๋Š” ๊ตฌ์—ญ์˜ ๋ฒˆํ˜ธ ๋ชฉ๋ก (์˜ค๋ฆ„์ฐจ์ˆœ, ์ค‘๋ณต ์—†์Œ)

 

๐Ÿ”Ž ์˜ˆ์‹œ

n = 8, m = 4, section = [2, 3, 6]
  • ์น ํ•ด์•ผ ํ•  ๊ณณ: 2๋ฒˆ, 3๋ฒˆ, 6๋ฒˆ
  • ๋กค๋Ÿฌ ๊ธธ์ด: 4m (์ฆ‰, ํ•œ ๋ฒˆ์— ์—ฐ์†๋œ 4๊ฐœ์˜ ์นธ์„ ์น ํ•  ์ˆ˜ ์žˆ์Œ)

 

  • ๋จผ์ € 3~6๋ฒˆ์„ ์น ํ•˜๋ฉด, 3๋ฒˆ๊ณผ 6๋ฒˆ์ด ํ•ด๊ฒฐ๋˜๊ณ , 2๋ฒˆ๋งŒ ๋‚จ๋Š”๋‹ค.
  • ๋‹ค์Œ์œผ๋กœ 1~4๋ฒˆ์„ ์น ํ•˜๋ฉด 2๋ฒˆ๋„ ํ•ด๊ฒฐ๋œ๋‹ค.
  • ์ฆ‰, ์ตœ์†Œ ํšŸ์ˆ˜๋Š” 2๋ฒˆ์ด๋‹ค.

 


๐Ÿ’ก ์•„์ด๋””์–ด

๐Ÿง  ํ•ต์‹ฌ ์ „๋žต

  • ๋งˆํ‚น ๋‹จ๊ฒŒ
    • ๊ธธ์ด n์ธ boolean ๋ฐฐ์—ด not_painted[ ]์„ ๋งŒ๋“ค์–ด์ค€๋‹ค.
    • ๋‹ค์‹œ ์น ํ•ด์•ผ ํ•˜๋Š” ๊ตฌ์—ญ๋งŒ true๋กœ ํ‘œ์‹œํ•ด์ค€๋‹ค.
boolean[] not_painted = new boolean[n];        
for(int s : section){
    not_painted[s - 1] = true;
}

 

  • ์ƒ‰์น  ๋‹จ๊ณ„
    • i = 0๋ถ€ํ„ฐ n-1๊นŒ์ง€ ํ›‘์œผ๋ฉด์„œ
      • ๋งŒ์•ฝ not_painted[i] == true๋ผ๋ฉด, ์—ฌ๊ธฐ์„œ ๋กค๋Ÿฌ๋ฅผ ํ•œ ๋ฒˆ ์น ํ•ด์ค€๋‹ค.
      • ์ด๋•Œ, [i, i + m - 1] ๊ตฌ๊ฐ„์„ ์ „๋ถ€ false๋กœ ๋ฐ”๊ฟ”์„œ ๋ง์น ์„ ํ•ด์คฌ์Œ์„ ํ‘œ์‹œํ•ด์ค€๋‹ค.
      • ์ดํ›„, ์น ํ•œ ํšŸ์ˆ˜ answer๋ฅผ +1 ํ•ด์ค€๋‹ค.
for(int i = 0; i < n; i++){
    if(not_painted[i]){
        answer++;
        
        for(int j = 0; j < m && i + j < n; j++){
            not_painted[i + j] = false;
        }
    }
}

 

 

 

๐Ÿ”Ž ์œ„์˜ ๋ฐฉ๋ฒ•์ด ์ตœ์†Œ๊ฐ€ ๋˜๋Š” ์ด์œ 

  • ์™ผ์ชฝ๋ถ€ํ„ฐ ํƒ์ƒ‰
    • ๋ฒฝ์„ ์™ผ์ชฝ์—์„œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ๋ณด๋‹ค๊ฐ€, ์ฒ˜์Œ์œผ๋กœ ํŽ˜์ธํŠธ๊ฐ€ ๋ฒ—๊ฒจ์ง„ ์นธ i๋ฅผ ๋ฐœ๊ฒฌํ–ˆ๋‹ค๊ณ  ํ•˜์ž.
    • ์ด ์นธ์€ ์–ธ์  ๊ฐ€๋Š” ๋ฐ˜๋“œ์‹œ ์น ํ•ด์ค˜์•ผ ํ•  ๊ฒƒ์ด๋‹ค.
    • ๊ทธ๋Ÿฐ๋ฐ ๊ทธ๋ƒฅ ์ง€๋‚˜๊ฐ€๋ฒ„๋ฆฌ๋ฉด, ๋‚˜์ค‘์— ๋˜ ๋Œ์•„์™€์„œ i๋ฅผ ํฌํ•จํ•œ ๊ตฌ๊ฐ„์„ ์น ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ํšŸ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚œ๋‹ค.
  • ๋ฐ”๋กœ ๊ทธ ์ž๋ฆฌ์—์„œ ๋กค๋Ÿฌ๋ฅผ ์น ํ•˜๋Š” ์ด์œ 
    • i์—์„œ ๋กค๋Ÿฌ๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด, [i ~ (i + m - 1)] ๊ตฌ๊ฐ„์„ ํ•œ ๋ฒˆ์— ์น ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์ด ๊ตฌ๊ฐ„ ์•ˆ์— ์•ž์œผ๋กœ ์น ํ•ด์•ผ ํ•  ์นธ์ด ์—ฌ๋Ÿฟ ๋“ค์–ด์žˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ํฌ๊ณ ,
      ๊ทธ๋ ‡๋‹ค๋ฉด ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ƒ‰์น ๋˜์ง€ ์•Š์€ ์นธ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์ฆ‰, ๊ฐ™์€ ์นธ์„ ๋‘ ๋ฒˆ ์ด์ƒ ๋ฎ์„ ์œ„ํ—˜ ์—†์ด, ๊ฐ€์žฅ ๋ฉ€๋ฆฌ ์˜ค๋ฅธ์ชฝ๊นŒ์ง€ ๋ฎ๋Š” ๊ฒƒ์ด ์ตœ์ ์ธ ๊ฒƒ์ด๋‹ค.
  • ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋ฉด ์ตœ์†Œ ํšŸ์ˆ˜ ๋ณด์žฅ
    • ์ด๋ฏธ ๋ฎ์ธ ์นธ์€ ๋‹ค์‹œ ๋ณผ ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ, ๋‹ค์Œ ์ƒ‰์น ๋˜์ง€ ์•Š์€ ์นธ์—์„œ ๋‹ค์‹œ ๋กค๋Ÿฌ๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด ๋œ๋‹ค.
    • ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ค‘๋ณต ์—†์ด ํ•„์š”ํ•œ ์ง€์ ์—์„œ๋งŒ ๋กค๋Ÿฌ๋ฅผ ์“ฐ๊ฒŒ ๋˜๊ณ ,
      ๋ถˆํ•„์š”ํ•œ ์ƒ‰์น  ํšŸ์ˆ˜๋ฅผ ์ค„์—ฌ์„œ ํ•ญ์ƒ ์ตœ์†Œ ํšŸ์ˆ˜๋ฅผ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

 


๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป ์ตœ์ข… ์ฝ”๋“œ

class Solution {
    public int solution(int n, int m, int[] section) {
        int answer = 0;
        
        boolean[] not_painted = new boolean[n];        
        for(int s : section){
            not_painted[s - 1] = true;
        }
        
        for(int i = 0; i < n; i++){
            if(not_painted[i]){
                answer++;
                    
                for(int j = 0; j < m && i + j < n; j++){
                    not_painted[i + j] = false;
                }
            }
        }      
        
        return answer;
    }
}

 


๐Ÿ•‘ ์‹œ๊ฐ„ ๋ณต์žก๋„

1๏ธโƒฃ ๋‹ค์‹œ ์น ํ•  ๊ตฌ์—ญ ๋งˆํ‚น

boolean[] not_painted = new boolean[n];
for (int s : section) {
    not_painted[s - 1] = true;
}

 

section ๋ฐฐ์—ด์„ ํ•œ ๋ฒˆ ์ˆœํšŒํ•˜๋ฉฐ ํ•„์š”ํ•œ ์œ„์น˜๋งŒ true๋กœ ํ‘œ์‹œํ•˜๋ฏ€๋กœ,

์ด ๋ถ€๋ถ„์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(k) ์ด๋‹ค.

(์ด๋•Œ k๋Š” section.length)

 

2๏ธโƒฃ ๋กค๋Ÿฌ๋กœ ๋ฎ๊ธฐ

for (int i = 0; i < n; i++) {
    if (not_painted[i]) {
        answer++;
        for (int j = 0; j < m && i + j < n; j++) {
            not_painted[i + j] = false;
        }
    }
}

 

๋ฐ”๊นฅ ๋ฃจํ”„๋Š” 0 ~ n-1 ๋ฅผ ํ•œ ๋ฒˆ ํ›‘์œผ๋ฏ€๋กœ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ O(n)์ด๋‹ค.

 

์•ˆ์ชฝ ๋ฃจํ”„๋Š” ๋กค๋Ÿฌ๋ฅผ ์‹ค์ œ๋กœ ์น ํ•  ๋•Œ๋งŒ ์ตœ๋Œ€ m ์นธ์„ false๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ,

๋กค๋Ÿฌ๊ฐ€ ์‹คํ–‰๋œ ํšŸ์ˆ˜๋ฅผ U๋ผ๊ณ  ๋‘๋ฉด,

์•ˆ์ชฝ ๋ฃจํ”„์˜ ์ด ์ž‘์—…๋Ÿ‰์€ O(Um)์ด๋‹ค

 

์ตœ์•…์ธ ์ƒํ™ฉ์€ m=1์ด๊ฑฐ๋‚˜,

์„น์…˜ ์นธ๋“ค์ด ์„œ๋กœ m์นธ ์ด์ƒ ๋–จ์–ด์ ธ ์žˆ์–ด์„œ ๋งค๋ฒˆ ์ƒˆ๋กœ ์น ํ•ด์•ผ ํ•  ๋•Œ์ธ๋ฐ,

์ด ๋•Œ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(km)์ด ๋  ๊ฒƒ์ด๋‹ค.

 

 

 

๐Ÿ‘‰๐Ÿป ๋”ฐ๋ผ์„œ ์ตœ์ข… ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(k) + O(n) + O(Um)์ด๋‹ค.

     (์ด๋•Œ, n์€ ๋ฒฝ์˜ ๊ธธ์ด, k๋Š” ๋‹ค์‹œ ์น ํ•ด์•ผ ํ•˜๋Š” ๊ตฌ์—ญ์˜ ์ˆ˜, m์€ ๋กค๋Ÿฌ์˜ ๊ธธ์ด์ด๋‹ค.)

 

์ฐธ๊ณ ๋กœ ์ตœ์•…์„ ๊ธฐ์ค€์œผ๋กœ ์ •๋ฆฌํ•œ ์ตœ์ข… ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(n + km)์ด ๋  ๊ฒƒ์ด๋‹ค.

 

 


๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป๋‹ค๋ฅธ ํ’€์ด (์ปค์„œ๋ฅผ ๋‘๋Š” ๊ทธ๋ฆฌ๋”” ํ’€์ด)

import java.util.*;

class Solution {
    public int solution(int n, int m, int[] section) {
        int answer = 0;

        // ์ปค์„œ: ์ง€๊ธˆ๊นŒ์ง€ ์น ํ•ด์ง„ "๋งˆ์ง€๋ง‰ ๊ตฌ์—ญ ๋ฒˆํ˜ธ" (1-based, ์•„๋ฌด๊ฒƒ๋„ ์•ˆ ์น ํ–ˆ์œผ๋‹ˆ 0๋ถ€ํ„ฐ ์‹œ์ž‘)
        int paintedEnd = 0;

        for (int pos : section) {
            // ์ด๋ฏธ ์น ํ•ด์ง„ ๋ฒ”์œ„ ์•ˆ์ด๋ฉด ํŒจ์Šค
            if (pos <= paintedEnd) continue;

            // pos์—์„œ ๋กค๋Ÿฌ ํ•œ ๋ฒˆ: [pos .. pos + m - 1]์„ ๋ฎ๋Š”๋‹ค
            answer++;
            paintedEnd = pos + m - 1;
        }

        return answer;
    }
}

 

  • pintedEnd: ์ง€๊ธˆ๊นŒ์ง€ ๋กค๋Ÿฌ๋กœ ์น ํ•ด์ง„ ๋งˆ์ง€๋ง‰ ๊ตฌ์—ญ ๋ฒˆํ˜ธ๋ฅผ ์ €์žฅํ•œ๋‹ค.
  • ์™ผ์ชฝ๋ถ€ํ„ฐ ๋ณด๋ฉฐ pos(๋‹ค์‹œ ์น ํ•  ๊ตฌ์—ญ)๊ฐ€ paintedEnd ์•ˆ์ด๋ฉด ์ด๋ฏธ ํ•ด๊ฒฐ๋œ ๊ฒƒ์ด๋ฏ€๋กœ ๊ฑด๋„ˆ๋›ด๋‹ค.
  • paintedEnd ๋ฐ–์—์„œ ์ƒˆ pos๋ฅผ ๋งŒ๋‚˜๋ฉด, ๊ทธ ์ž๋ฆฌ์—์„œ ๋กค๋Ÿฌ๋ฅผ ํ•œ ๋ฒˆ ์น ํ•œ๋‹ค.
    (paintedEnd = pos + m - 1 ๋กœ ๋ฐ”๋€๋‹ค.)
  • ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด, ํ•œ ๋ฒˆ ์น ํ•  ๋•Œ ์ตœ๋Œ€ํ•œ ์˜ค๋ฅธ์ชฝ๊นŒ์ง€ ๋ฎ์œผ๋ฏ€๋กœ, ์ค‘๋ณต ์—†์ด ์ตœ์†Œ ํšŸ์ˆ˜๊ฐ€ ๋ณด์žฅ๋œ๋‹ค.

 

์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด,
section์„ ํ•œ ๋ฒˆ๋งŒ ์ˆœํšŒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(k)๋กœ ๋‹จ์ถ•๋œ๋‹ค.

(์ด๋•Œ k๋Š” section.length)

๋ฐ˜์‘ํ˜•