728x90
반응형
2024.08.27기준 - 실버5
728x90
백준, BEAKJOON, BOJ, JAVA, 자바
풀이
이 문제는 x, y길이가 75, 100인 축구장 잔디를 깍을 때, 모든 면적을 잘 깍았는지 출력하는 문제입니다.
주어진 좌표를 중앙으로 가지면서 양 옆을 (폭 / 2) 만큼 잔디를 깍을 수 있습니다.
1. 입력이 "0 0 0.0"이 들어오면 반복문을 종료 시켜줍니다.
// "0 0 0.0"이 들어오면 반복문을 종료한다.
while (!(s = br.readLine()).equals("0 0 0.0")) {
...
}
2. 입력의 순이 x좌표가 들어온 뒤 y좌표가 들어오기 때문에 x좌표 먼저 완벽하게 잔디를 깍는지 확인합니다.
3. 잔디를 시작 위치 0을 기준으로 깍기 위해 정렬을 통해 천천히 잔디를 깍기 시작합니다.
4. 현재 까지 깍은 위치와 다음 잔디를 깍는 폭 사이에 공간이 있는지 확인을 하며 반복문을 돌려줍니다.
5. 만약 모든 면적을 하지 못했거나, 중간에 빈 공간이 있다면 NO를 출력하고 나머지 y좌표를 출력하며 멈춰줍니다.
// x좌표 먼저 확인.
st = new StringTokenizer(br.readLine());
for (int i = 0; i < nx; i++) {
arr.add(Double.parseDouble(st.nextToken()));
}
// 앞에서 부터 잔디 정리를 위해 정렬
Collections.sort(arr);
// 현재 까지 잔디 정렬을 한 위치
now = 0;
for (int i = 0; i < nx; i++) {
// 현재 까지 잔디 정리를 한 위치에서 연속적으로 연결이 된다면
if (arr.get(i) - (w / 2) <= now) {
now = arr.get(i) + (w / 2);
} else { // 중간에 빈 공간이 있다면
check = false;
break;
}
}
// 모든 면적을 하지 못했거나, 중간에 빈 공간이 있다면
if (!check || now < 75) {
br.readLine();
sb.append("NO\n");
continue;
}
6. 그 다음 y좌표도 x좌표와 동일하게 실행 후 출력을 해줍니다.
arr = new LinkedList<>();
// y좌표 계산
st = new StringTokenizer(br.readLine());
for (int i = 0; i < ny; i++) {
arr.add(Double.parseDouble(st.nextToken()));
}
// 아래에서 부터 위로 잔디 정리를 위해 정렬
Collections.sort(arr);
// 현재까지 정리한 위치
now = 0;
for (int i = 0; i < ny; i++) {
// 현재 까지 잔디 정리를 한 위치에서 연속적으로 연결이 된다면
if (arr.get(i) - (w / 2) <= now) {
now = arr.get(i) + (w / 2);
} else { // 중간에 빈 공간이 있다면
check = false;
break;
}
}
// 모든 면적을 하지 못했거나, 중간에 빈 공간이 있다면
if (!check || now < 100) {
sb.append("NO\n");
} else {
sb.append("YES\n");
}
코드
package Main;
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));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb = new StringBuilder();
String s = "";
int nx, ny;
double w, now;
boolean check;
List<Double> arr;
StringTokenizer st;
// "0 0 0.0"이 들어오면 반복문을 종료한다.
while (!(s = br.readLine()).equals("0 0 0.0")) {
st = new StringTokenizer(s);
nx = Integer.parseInt(st.nextToken()); // 가로를 평행하게 깍은 횟수
ny = Integer.parseInt(st.nextToken()); // 세로를 평행하게 깍은 횟수
w = Double.parseDouble(st.nextToken()); // 폭
check = true;
arr = new LinkedList<>();
// x좌표 먼저 확인.
st = new StringTokenizer(br.readLine());
for (int i = 0; i < nx; i++) {
arr.add(Double.parseDouble(st.nextToken()));
}
// 앞에서 부터 잔디 정리를 위해 정렬
Collections.sort(arr);
// 현재 까지 잔디 정렬을 한 위치
now = 0;
for (int i = 0; i < nx; i++) {
// 현재 까지 잔디 정리를 한 위치에서 연속적으로 연결이 된다면
if (arr.get(i) - (w / 2) <= now) {
now = arr.get(i) + (w / 2);
} else { // 중간에 빈 공간이 있다면
check = false;
break;
}
}
// 모든 면적을 하지 못했거나, 중간에 빈 공간이 있다면
if (!check || now < 75) {
br.readLine();
sb.append("NO\n");
continue;
}
arr = new LinkedList<>();
// y좌표 계산
st = new StringTokenizer(br.readLine());
for (int i = 0; i < ny; i++) {
arr.add(Double.parseDouble(st.nextToken()));
}
// 아래에서 부터 위로 잔디 정리를 위해 정렬
Collections.sort(arr);
// 현재까지 정리한 위치
now = 0;
for (int i = 0; i < ny; i++) {
// 현재 까지 잔디 정리를 한 위치에서 연속적으로 연결이 된다면
if (arr.get(i) - (w / 2) <= now) {
now = arr.get(i) + (w / 2);
} else { // 중간에 빈 공간이 있다면
check = false;
break;
}
}
// 모든 면적을 하지 못했거나, 중간에 빈 공간이 있다면
if (!check || now < 100) {
sb.append("NO\n");
} else {
sb.append("YES\n");
}
}
bw.write(sb.toString());
bw.flush();
bw.close();
br.close();
}
}
728x90
반응형
'코딩테스트 일기 (BAEKJOON)' 카테고리의 다른 글
BEAKJOON / 백준 - JAVA 25562번 차의 개수 (0) | 2024.08.29 |
---|---|
BEAKJOON / 백준 - JAVA 28353번 고양이 카페 (3) | 2024.08.28 |
BEAKJOON / 백준 - JAVA 9465번 스티커 (0) | 2024.08.26 |
BEAKJOON / 백준 - JAVA 1932번 정수 삼각형 (0) | 2024.08.25 |
BEAKJOON / 백준 - JAVA 15663번 N과 M (9) (0) | 2024.08.24 |