반응형
출처: SWEA
Input
3
0 0 1 0
-1 -1 0 0
0 0 0 2
Output
#1 1
#2 2
#3 4
①에서 ②로 갈 때, 『가로 이동』과 『세로 이동』 최소 횟수를 출력하는 문제이다.
『가로 이동』은 좌우 이동 / 『세로 이동』은 상하 이동을 의미한다.
이동할 때는 『가로 이동』과 『세로 이동』 순차적으로 이루어진다.
(처음 출발은 임의로 지정 가능)
Brute Force 이용도 가능하지만 규칙을 이용하여 처리.
위와 같이 ②에 도달하기 위해서는 『가로 이동』 3번만 하면 되지만
규칙상 세로 이동을 중간에 2번(↑ ↓) 하면 된다.
① 좌표 (x1, y1) / ②의 좌표 (x2, y2)
최소 필요한 세로이동 |x2 - x1| → 'rowMove'
최소 필요한 가로이동 |y2 - y1| → 'colMove'
주어진 규칙으로 인해 추가된 이동 횟수를 추가 반영
import java.util.Scanner;
public class Solution {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = Integer.parseInt(sc.next());
for(int tc=1; tc<=T; tc++) {
Vertex A = new Vertex(sc.nextInt(), sc.nextInt());
Vertex B = new Vertex(sc.nextInt(), sc.nextInt());
int rowMove = difference(A.x, B.x);
int colMove = difference(A.y, B.y);
System.out.print("#" + tc + " ");
int answer;
if(difference(rowMove, colMove) == 0) {
answer = rowMove + colMove;
}
else {
answer = Math.min(rowMove, colMove) * 2;
if(difference(rowMove, colMove) % 2 == 0)
answer += difference(rowMove, colMove) * 2;
else
answer += difference(rowMove, colMove) * 2 - 1;
}
System.out.println(answer);
}
}
private static int difference(int a, int b) {
return Math.abs(a - b);
}
}
class Vertex{
int x, y;
public Vertex(int x, int y) {
this.x = x;
this.y = y;
}
}
반응형
'PS 문제 풀이 > SWEA' 카테고리의 다른 글
[SWEA] 1868 파핑파핑 지뢰찾기 (0) | 2021.03.01 |
---|---|
[SWEA] 1249 보급로 (0) | 2021.03.01 |
[SWEA] 1974 스도쿠 검증 (0) | 2021.03.01 |
[SWEA] 1954 달팽이 (0) | 2021.03.01 |
[SWEA] 3816 아나그램 (0) | 2021.03.01 |
댓글