본문 바로가기

알고리즘/BOJ

[백준] 1449번 수리공 항승

[문제]

파이프의 가장 왼쪽에서 정수만큼 떨어진 거리만 물이 샌다. 각 새는 포인트를 길이가 L인 테이프를 붙여 막는다.

막을때 앞뒤 각 0.5의 간격을 두어야 하고 테이프를 자르거나 겹쳐붙일 수 없다. 사용되는 테이프의 개수는?

 

[풀이]

간단한 문제인데 생각보다 너무 복잡하게 풀어서 재정리 후 코드를 간소화 시켜보았습니다.

테이프의 시작점을 잡고 start(시작점) + L(테이프길이)로 비교하며 두가지 케이스로 나누었습니다.

1. 현재 구멍난 곳이 start + L 보다 크거나 같을 때

2. 현재 구멍난 곳이 start + L 보다 작을 때

1번의 경우는 마지막 구멍일 경우에 tape 개수를 한번 더 + 해주었고

2번의 경우는 마지막 구멍이 아닐 경우에는 continue, 마지막일 경우에만 + 해주어 마무리 했습니다.

 

아래는 풀이한 코드입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
using namespace std;
int main(void) {
    int n, l;
    cin >> n >> l;
    int leak[1000];
    int tape_cnt = 0;
    for (int i = 0; i < n; i++cin >> leak[i];
    sort(leak, leak + n);
    int start = leak[0];
    for (int i = 0; i < n; i++) {
        if (i - 1 >= 0 && start+<= leak[i]) {
            tape_cnt++;
            if (i == n - 1) tape_cnt++;
            start = leak[i];
        }
        else if (start+> leak[i] && i == n-1) {
            tape_cnt++;
        }
    }
    cout << tape_cnt;
    return 0;
}
 
cs

 

질문이나 지적하실 부분은 댓글로 부탁드립니다:)

'알고리즘 > BOJ' 카테고리의 다른 글

[백준] 1202번 보석도둑  (0) 2019.07.26
[백준] 1969번 DNA  (0) 2019.07.18
[백준] 2352번 반도체 설계  (0) 2019.07.13
[백준] 1700번 멀티탭 스케줄링  (0) 2019.07.12
[백준] 1946번 신입 사원  (0) 2019.07.12