시간 & 메모리 제한
문제
입력 & 출력
구현을 이용한 문제풀이
package com.Back;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Back_2564_2 {
static ArrayList<point> arr = new ArrayList<>();
static int C,R,num,ans;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
R = Integer.parseInt(st.nextToken());
C = Integer.parseInt(st.nextToken());
num = Integer.parseInt(br.readLine());
for (int i = 0; i < num+1; i++) {
st = new StringTokenizer(br.readLine());
int dir = Integer.parseInt(st.nextToken());
int len = Integer.parseInt(st.nextToken());
if(dir==1) {
arr.add(new point(0, len));
}else if(dir==2) {
arr.add(new point(C, len));
}else if(dir==3) {
arr.add(new point(len, 0));
}else if(dir==4) {
arr.add(new point(len,R));
}
}
search();
System.out.println(ans);
}
private static void search() {
for (int i = 0; i < num; i++) {
if(Math.abs(arr.get(num).x-arr.get(i).x)==C) {
ans+=C;
ans+=Math.min(arr.get(num).y+arr.get(i).y, 2*R-arr.get(num).y-arr.get(i).y);
}else if(Math.abs(arr.get(num).y-arr.get(i).y)==R) {
ans+=R;
ans+=Math.min(arr.get(num).x+arr.get(i).x, 2*C-arr.get(num).x-arr.get(i).x);
}else {
ans+=Math.abs(arr.get(num).x-arr.get(i).x);
ans+=Math.abs(arr.get(num).y-arr.get(i).y);
}
}
}
static class point{
int x;
int y;
public point(int x, int y) {
super();
this.x = x;
this.y = y;
}
}
}
- step1. 값을 받아오는 경우 방향과 길이값을 받아옵니다. 받는 동시에 ArrayList에 위치를 넣어줍니다.
- step2. 각각의 값을 계산하는 함수를 만들어 줍니다.
- step3. 고려해봐야 하는 사항은 정 반대에 있는 경우입니다. 동쪽, 서쪽인 경우와 서쪽, 북쪽인 경우로 나눠서 풀이를 진행하면 됩니다.
그림과 같이 두 값을 비교해서 최솟값을 선택해주면 됩니다.
'Algorithm > 백준 알고리즘' 카테고리의 다른 글
백준_14503 로봇 청소기(자바) / 구현 + 재귀 (0) | 2021.04.17 |
---|---|
백준_17144 미세먼지 안녕! (자바) / BFS + 구현 (0) | 2021.04.16 |
백준_14500 테트로미노(자바) / DFS + 예외/브루트포스 (0) | 2021.04.15 |
백준_1107 리모컨 (자바) / 브루트포스 (0) | 2021.04.15 |
백준_17471 게리맨더링(자바) / BFS + 조합 (0) | 2021.04.14 |