프로그래머스

[프로그래머스] 덧칠하기 (JAVA)

코 밑 2024. 12. 28. 19:20
Contents

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

정해진 구역을 다시 브러쉬로 칠해야 한다. 근데 최소한의 브러쉬질로 칠해야 한단다.

n -> 페인트가 칠해져야 하는 구역

m -> 브러쉬가 한 번에 칠할 수 있는 길이

section -> n의 길이 중 다시 칠해야 하는 곳이 담긴 배열

 

만약 section에 2, 3, 6이 있고 브러쉬가 한번에 칠할 수있는 길이가 4라면

한번 칠할 때 2, 3, 4, 5 칠하고

두번째 칠할 때 6부터 칠할 수 있으니까

2번만에 브러쉬질을 마무리지을 수 있는 것이다.

 

좀 어렵게 푼 거 같기도 하다 다른 사람들 풀이 보니까 나처럼 안풀었다더라

 

반복은 구지구지 n만큼 할 필요가 없다 section의 최소값부터 최대값까지 하면 된다.

last를 선언해서 브러쉬질한 끝 섹션을 넣어줘서 last보다 크거나 같을 때만 브러쉬질 카운트를 올려주었다.

 

// 프로그래머스 덧칠하기
// n -> 페인트가 칠해져야 하는 총 섹션. 칠해진 곳, 다시 칠해져야 하는 곳이 있다
// m -> 브러쉬가 한 번에 칠할 수 있는 길이
// section -> 다시 칠해야 하는 곳
// 최소 브러쉬질이 반환되어야 함
class Solution {
    public int solution(int n, int m, int[] section) {
        // s = section 배열 길이, last = 브러쉬한 마지막 섹션
        // 반복은 n의 길이만큼 안해도 됨. section의 처음과 끝까지만 함
        int s = 0, last = 0, answer = 0;
        for (int i = section[0]; i <= section[section.length - 1]; i++) {
            if (i == section[s] && i >= last) {
                last = i + m;
                // 다음 section
                s++;
                answer++;
            }
            // 겹치는 곳은 패스
            else if (section[s] == i)
                s++;

        }
        return answer;
    }
}

 

스키장 가야징