내가 풀고있던 것..
function solution(n, m, section) {
if(section.length === 1) return 1;
const area = section[section.length - 1] - section[0] + 1;
let count = 1;
let remain = area - m;
let temp = true;
if(remain < m && remain > 0){
count++;
}else if(remain < 0){
return count;
}else{
while(temp){
remain = remain - m;
count++;
if(remain < m) temp = false;
}
}
return count;
주어진 문제는 최소한의 횟수로 롤러를 사용하여 벽을 페인트칠하는 것입니다. 롤러의 길이와 다시 페인트칠해야 하는 구역들이 주어졌을 때, 이를 최소한의 횟수로 해결하려는 것입니다.
문제를 이해하기 위해서 주어진 코드가 어떻게 동작하는지 단계별로 설명해 드리겠습니다.
주어진 코드 분석
let answer = 0; // 페인트칠 횟수를 저장할 변수
let painted = 0; // 마지막으로 페인트칠한 구역의 끝번호를 저장할 변수
for (const sec of section) {
if (painted < sec) {
answer++; // 새로운 페인트칠을 해야 하므로 횟수 증가
painted = sec + m - 1; // 현재 구역을 시작으로 롤러의 길이만큼 페인트칠 했을 때의 끝번호 저장
}
}
return answer; // 최소 페인트칠 횟수 반환
코드 동작 과정 설명
- 변수 초기화
answer
는 페인트칠 횟수를 저장하는 변수입니다.painted
는 마지막으로 페인트칠한 구역의 끝번호를 저장하는 변수입니다. 초기값은 0입니다.
- 구역 순회 (for loop)
- 주어진
section
배열을 하나씩 순회합니다. - 각 구역 번호
sec
를 확인합니다.
- 주어진
- 페인트칠 여부 확인 (if statement)
painted
가sec
보다 작다면 현재 구역sec
은 아직 페인트칠이 안 된 상태입니다. (즉, 롤러가 닿지 않은 상태)- 이 경우 새로운 페인트칠이 필요합니다.
- 페인트칠 수행
answer
를 1 증가시킵니다.- 현재 구역
sec
에서 시작하여 롤러의 길이m
만큼 페인트칠을 합니다. 페인트칠한 구역의 끝번호는sec + m - 1
이 됩니다. painted
변수에 새로 페인트칠한 구역의 끝번호를 저장합니다.
- 최소 페인트칠 횟수 반환
- 루프가 끝나면
answer
변수에 저장된 값이 최소 페인트칠 횟수가 됩니다.
- 루프가 끝나면
예제 분석
예제 1
- 입력:
n = 8
,m = 4
,section = [2, 3, 6]
- 과정:
sec = 2
:painted
는 0이므로 페인트칠 필요,answer++
-> 1,painted = 2 + 4 - 1 = 5
sec = 3
:painted
는 5로 이미 페인트칠이 되어 있으므로 건너뜀sec = 6
:painted
는 5이므로 페인트칠 필요,answer++
-> 2,painted = 6 + 4 - 1 = 9
- 결과: 2
예제 2
- 입력:
n = 5
,m = 4
,section = [1, 3]
- 과정:
sec = 1
:painted
는 0이므로 페인트칠 필요,answer++
-> 1,painted = 1 + 4 - 1 = 4
sec = 3
:painted
는 4로 이미 페인트칠이 되어 있으므로 건너뜀
- 결과: 1
예제 3
- 입력:
n = 4
,m = 1
,section = [1, 2, 3, 4]
- 과정:
sec = 1
:painted
는 0이므로 페인트칠 필요,answer++
-> 1,painted = 1 + 1 - 1 = 1
sec = 2
:painted
는 1이므로 페인트칠 필요,answer++
-> 2,painted = 2 + 1 - 1 = 2
sec = 3
:painted
는 2이므로 페인트칠 필요,answer++
-> 3,painted = 3 + 1 - 1 = 3
sec = 4
:painted
는 3이므로 페인트칠 필요,answer++
-> 4,painted = 4 + 1 - 1 = 4
- 결과: 4
이와 같이, 주어진 코드가 각 구역을 순회하면서 필요한 최소한의 페인트칠 횟수를 계산하는 과정을 이해할 수 있습니다. 각 구역을 확인하여 아직 페인트칠이 안 된 구역부터 롤러의 길이만큼 페인트칠하고 그 끝번호를 저장하여 다음 구역을 확인하는 방식입니다.
'algorithm' 카테고리의 다른 글
[240612 TIL] 완전탐색, 비트연산자 (0) | 2024.06.12 |
---|---|
[240529 TIL] 기사단원의 무기(코딩테스트) (0) | 2024.05.29 |
코테15 - 소수만들기 (0) | 2024.05.24 |
코테14 - 가장 가까운 같은 글자 (0) | 2024.05.24 |
코테13 - 짝수는 싫어요 (0) | 2024.03.21 |