본문 바로가기
PS 문제 풀이/SWEA

[SWEA] 8382 방향 전환

by 까망 하르방 2021. 3. 1.
반응형

출처: 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

댓글