728x90
문제
https://www.codeground.org/practice
문제해결
처음 고안한 방법으로는 다이나믹 프로그래밍으로 1~N까지 그때그때마다 최소로 점프할 수 있는 횟수를 업데이트해줘서 마지막 목적지까지 구해주는 방식으로 했으나 시간초과로 80점을 받았다... O(N)으로 풀어야 했기에 한번에 반복문만을 사용해야만 한다.
다음위치 <= 현재 위치에서 최대로 점프가능한 위치 < 다다음 위치을 찾아서 가면 O(N)으로도 충분히 가능하다.
처음 생각은 점프을 무조건 많이 뛰다보면 목적지에 도달 못 할 수도 있겠구나 싶었는데 그게 아니었다.
무조건 멀리가는것이 맞다!!
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
#include <iostream>
#include <algorithm>
using namespace std;
int N,K;
int bridge[1000001];
int main(int argc, char** argv)
{
int T, test_case;
cin >> T;
for(test_case = 0; test_case < T; test_case++)
{
cin >> N;
for(int i = 1;i<=N;i++){
cin >> bridge[i];
}
cin >> K;
int temp = 0; // 현재자리수+K를 저장 즉 최대로 건넜을때 위치임
int location = 0; //위치, 즉 최대로 건널 수 있는 돌다리의 위치를 저장한것(현재 와있는 위치라고 생각하면됨)
int sol = 0; // 점프한 횟수
for(int i = 1;i<=N;i++){
temp = location+K; //최대로 건넜을 떄 위치
if(temp>=bridge[i]){ //만약 돌다리 위치가 최대로 건넜을때의 위치보다 작거나 같을떄
if(i == N){ // 만약 마지막 위치라면 sol을 +1해주고 종료
sol++;
break;
}
if(temp<bridge[i+1]){ //만약 다다음 돌다리보다 작으면 최대로 건너는 것이므로 현재 위치를 수정하고 돌다리를 점프하므로 sol +1
location = bridge[i];
sol++;
}
}
else{ //최대로 건너는 위치보다 돌다리가 멀리 있으면 앞으로 못가므로 -1해준다.
sol = -1;
break;
}
}
cout << "Case #" << test_case+1 << endl;
cout << sol<<"\n";
}
return 0;//Your program should return 0 on normal termination.
}
|
cs |
728x90
'삼성sw역량테스트 기출문제' 카테고리의 다른 글
[Code Ground][SCPC 1차예선 방속의 거울] (0) | 2021.07.18 |
---|---|
미세먼지 안녕!(백준 17144번) (0) | 2021.05.25 |
치킨 배달(백준 15686번) (0) | 2021.05.24 |
컨베이어 벨트 위의 로봇(백준 20055번) (0) | 2021.05.23 |
스타트와 링크(백준 14889번) (0) | 2021.05.21 |