https://www.acmicpc.net/problem/1449
1449번: 수리공 항승
첫째 줄에 물이 새는 곳의 개수 N과 테이프의 길이 L이 주어진다. 둘째 줄에는 물이 새는 곳의 위치가 주어진다. N과 L은 1,000보다 작거나 같은 자연수이고, 물이 새는 곳의 위치는 1,000보다 작거나
www.acmicpc.net
문제
코드
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int l = sc.nextInt(); sc.nextLine();
int arr[] = new int[n];
for(int i=0;i<n;i++)
arr[i] = sc.nextInt();
Arrays.sort(arr);
int sum=0;
for(int i=0;i<n;i++) {
int len=0;
for(int j=i;;j++) {
if(j==n-1) {
sum++;
i=j; break;
}
if(len+(arr[j+1]-arr[j]+1)<=l)
len+=arr[j+1]-arr[j];
else {
sum++;
i=j; break;
}
}
}
System.out.println(sum);
}
}
해결방법
물이 새는 곳의 위치 받아서 오름차순으로 정렬한 후에, 반복문을 사용해 "1개의 테이프로 붙일 수 있는 범위를 구하기"를 반복하여 테이프 수를 구해 문제를 해결하였다.
아쉬운 점은 이중 반복문 안에 if(j==n-1)을 사용하여서 코드가 더러워졌다. 한 번 다시 바꿔봐야겠다.
다른 사람의 코드
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] t = br.readLine().split(" ");
int N = Integer.parseInt(t[0]);
int L = Integer.parseInt(t[1]);
int pos[] = new int[1001];
int tape=0;
String[] input = br.readLine().split(" ");
for(int i=0; i<N; i++) {
pos[Integer.parseInt(input[i])] = 1;
}
for(int i=1;i<=1000;i++) {
if(pos[i]!= 0) {
i+=L-1;
tape++;
}
}
System.out.println(tape);
}
}
인덱스를 사용해 푼 코드인데 훨씬 간편한 것 같다.
"물이 샌 곳 위치 발견하면 테이프로 막아주고 막은 범위만큼 값 더하기"를 반복하여 해결한 코드.
'알고리즘 > 백준' 카테고리의 다른 글
1343번 : 폴리오미노 (0) | 2022.07.04 |
---|---|
2847번 : 게임을 만든 동준이 (0) | 2022.06.30 |
1543번 : 문서 검색 (0) | 2022.06.29 |
1339번 : 단어 수학 (0) | 2022.06.28 |
1049번 : 기타줄 (0) | 2022.06.28 |