반응형
<문제 소개>
<소스 코드>
#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를 리턴한다.
<코멘트>
어려워 보이는 문제였는데 다행히 잘 풀어냈다!
<제출결과>