[백준/Java] 1449번: 수리공 항승
문제 정보
제목 : 수리공 항승
번호 : 1449번
사용 언어 : Java
문제 링크
https://www.acmicpc.net/problem/1449
1449번: 수리공 항승
첫째 줄에 물이 새는 곳의 개수 N과 테이프의 길이 L이 주어진다. 둘째 줄에는 물이 새는 곳의 위치가 주어진다. N과 L은 1,000보다 작거나 같은 자연수이고, 물이 새는 곳의 위치는 1,000보다 작거나
www.acmicpc.net
시간 제한 | 메모리 제한 |
2 초 | 128 MB |
문제
항승이는 품질이 심각하게 나쁜 수도 파이프 회사의 수리공이다. 항승이는 세준 지하철 공사에서 물이 샌다는 소식을 듣고 수리를 하러 갔다.
파이프에서 물이 새는 곳은 신기하게도 가장 왼쪽에서 정수만큼 떨어진 거리만 물이 샌다.
항승이는 길이가 L인 테이프를 무한개 가지고 있다.
항승이는 테이프를 이용해서 물을 막으려고 한다. 항승이는 항상 물을 막을 때, 적어도 그 위치의 좌우 0.5만큼 간격을 줘야 물이 다시는 안 샌다고 생각한다.
물이 새는 곳의 위치와, 항승이가 가지고 있는 테이프의 길이 L이 주어졌을 때, 항승이가 필요한 테이프의 최소 개수를 구하는 프로그램을 작성하시오. 테이프를 자를 수 없고, 테이프를 겹쳐서 붙이는 것도 가능하다.
입력
첫째 줄에 물이 새는 곳의 개수 N과 테이프의 길이 L이 주어진다. 둘째 줄에는 물이 새는 곳의 위치가 주어진다. N과 L은 1,000보다 작거나 같은 자연수이고, 물이 새는 곳의 위치는 1,000보다 작거나 같은 자연수이다.
출력
첫째 줄에 항승이가 필요한 테이프의 개수를 출력한다.
입출력 예제

나의 풀이
입력을 받기 위해 BufferedReader을 사용했고, 문자열을 Token으로 나누기 위해 StringTokenizer을 사용했습니다. 문자열 한 줄을 입력받아 물이 새는 곳의 개수 N, 테이프의 길이 L을 각각 변수에 저장했습니다. N의 길이만큼 배열p를 선언하여 배열에 물이 새는 곳의 위치를 저장했습니다. 물이 새는 곳의 위치는 예제 입력 3으로 봤을때 오름차순으로 정렬되어있지 않기때문에 정렬도 했습니다. 이제 필요한 테이프 개수를 구해야합니다. 개수를 저장할 t_count에는 1을 저장하고, 구멍을 기준으로 테이프를 붙인 길이를 구하기 위해 tape를 선언하여 처음 위치의 구멍 - 0.5 + 테이프의 길이(L)을 저장했습니다. 그리고 1부터 N번 반복하는 for루프를 이용해 구멍의 위치 + 0.5가 tape보다 커지면 테이프를 또 붙여야하는 것이므로 t_count를 1증가시키고, tape에는 구멍의 위치 - 0.5 + 테이프의 길이(L)을 저장했습니다. 반복이 끝나면 t_count를 출력했습니다.
코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer( br.readLine() );
int N = Integer.parseInt(st.nextToken());
int L = Integer.parseInt(st.nextToken());
int[] p = new int[N];
st = new StringTokenizer( br.readLine() );
for(int i=0;i < N; i++) {
p[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(p);
int t_count = 1;
double tape = (p[0] - 0.5) + L;
for( int i =1; i < N; i++) {
if( tape < p[i]+0.5 ) {
t_count++;
tape = (p[i] - 0.5) + L;
}
}
bw.write(t_count+"\n");
bw.flush();
bw.close();
br.close();
}
}