본문 바로가기
코딩테스트 준비/프로그래머스

[프로그래머스][C++] 덧칠하기

by 스테디코디스트 2023. 9. 13.
반응형

<문제 소개>


<소스 코드>

#include <string>
#include <vector>

using namespace std;

int solution(int n, int m, vector<int> section) 
{
    int answer = 0;
    int index = 0;
    
    for(int i = section[index++]; i <= n;)
    {
        answer++;
        
        // 다음 섹션이 롤러의 길이를 넘어간 구간이 나올 때까지 반복
        while(section[index] < i + m)
        {
            index++;
            
            // 더 이상 색칠할 섹션이 없는 경우 -> 리턴
            if(index >= section.size()) return answer;
        }
            
        i = section[index]; // 현재 섹션을 반복자로 재정의
    }    
    
    return answer;
}

<풀이과정>

1. answer과 index를 선언

2. 반복자 i가 섹션의 0번째 인덱스부터 시작해 n이 될 때까지 반복을 진행한다.

3. 매 반복은 페인트칠을 하는 횟수를 의미하므로 answer을 1씩 증가시킨다.

4. 이후 섹션의 다음 수가 현재 수에 롤러의 길이를 더한 구간, 즉 현재 수에서 칠할 수 있는 범위내에 들어온다면 페인트칠을 하지않고, 섹션만 다음으로 넘겨준다.

5. 4번 과정을 섹션을 넘겨가며 반복하다가 더 이상 칠할 섹션이 없는 경우에는 현재 페인트칠을 한 횟수인 answer을 리턴해주고, 칠할 수 없는 범위의 섹션이 되면 내부 반복을 끝내고 나온다.

6. 내부 while 반복문이 끝난 이후, 다음으로 페인트칠을 할 때 최대의 길이로 칠하기 위해 반복자 i를 현재 섹션의 수로 해준 뒤 다음 반복을 진행해준다.

7. 모든 반복이 끝나면 페인트칠을 한 횟수 answer를 리턴한다.


<코멘트>

어려워 보이는 문제였는데 다행히 잘 풀어냈다!


<제출결과>