๐ ๋ฌธ์ ๋ฐ๋ก๊ฐ๊ธฐ
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 ํด์ค๋ค.
- i = 0๋ถํฐ n-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)
'๐ป ์ฝํ > ๐ JAVA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [ํ๋ก๊ทธ๋๋จธ์ค/JAVA] ์นด๋ ๋ญ์น (3) | 2025.08.14 |
|---|---|
| [ํ๋ก๊ทธ๋๋จธ์ค/JAVA] ๋์ถฉ ๋ง๋ ์ํ (3) | 2025.08.14 |
| [ํ๋ก๊ทธ๋๋จธ์ค/JAVA] ์ถ์ต ์ ์ (5) | 2025.08.11 |
| [ํ๋ก๊ทธ๋๋จธ์ค/JAVA] ๋ฌ๋ฆฌ๊ธฐ ๊ฒฝ์ฃผ (6) | 2025.08.10 |
| [ํ๋ก๊ทธ๋๋จธ์ค/JAVA] ๋ฐ์ดํฐ ๋ถ์ (5) | 2025.08.09 |