본문 바로가기
Algorithm/알고리즘 강의 자료

dx dy technique & inRange

by 눈오는1월 2024. 4. 8.
728x90

dx dy technique

 

예를 들어서 주어진 숫자(N)에 따라 현재위치에서 동서남북 한 칸씩 이동한다고 했을 때 어떻게 코드로 작성할 수 있을까요?

N = 0일때 북쪽, N = 1일 때 동쪽, N = 2일 때 서쪽, N = 3일 때 남쪽으로 간다고 했을 때 현재 위치는 3,3입니다. 배열의 크기는 5 * 5로 하겠습니다.

 

 

exam 1(그냥 구현 코드)

package study1;

import java.util.*;
import java.io.*;

import static javax.swing.text.html.HTML.Attribute.N;


public class Exam1 {

    public static int N;

    public static int x,y;
    public static int nx, ny;


    public static void main(String[] args)throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());
        x = 3;
        y = 3;

        if(N == 0) { // 북쪽 이동
            nx = x - 1;
            ny = y;
        }
        else if(N == 1) { // 동쪽
            nx = x;
            ny = y + 1;
        }
        else if(N == 2) { // 서쪽
            nx = x + 1;
            ny = y;
        }
        else if(N == 3) { // 남쪽
            nx = x;
            ny = y - 1;
        }

        System.out.println(nx + " " + ny);

    }
}

단순히 이렇게 짤 수 있으나 이럴경우 코드가 더럽고 문제가 만약에 북동, 북서, 남동, 남서 방향 즉 8방향이 생기면 밑에 코드 4개를 추가해야 합니다.

이것을 간결하게 작성하기 위해 나온 방식이 dx dy technique라고 합니다.

 

dx dy 를 사용했을 때 예시

package study1;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Exam2 {

    public static int N;

    public static int x,y;
    public static int nx, ny;

    public static int[] dx = {-1, 0, 1, 0}; // 북동남서 방향
    public static int[] dy = {0, 1, 0, -1};
    
    public static void main(String[] args)throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());
        x = 3;
        y = 3;
        nx = x + dx[N];
        ny = y + dy[N];
        System.out.println(nx + " " + ny);

    }
}

Exam1 예시에 비해 코드의 길이가 많이 줄어드는 것을 볼 수 있습니다. 이런 식으로 격자 내에서 방향을 움직일 때 dx, dy를 정말 많이 이용하면 됩니다.

 

inRange()

2차원 배열의 격자 문제를 탐색하는 문제를 풀어보면 indexoutofrangeexception 라는 아주 익숙하고 보기 싫은 에러 메시지를 보게 될 겁니다. 이러한 에러를 마주치지 않을 방법이 inRange()라는 메서드를 통해 보기 싫은 에러메시지를 안 볼 수 있습니다.

public static boolean inRange(int x, int y) {
	return 0 <= x && x < n && 0 <= y && < m;
}

이러한 메서드를 만들고 반복문에 사용을 하게 되면 격자에서 탈출할 일은 없을겁니다.( 추후 그래프 탐색 문제에서 자주 보게 될 겁니다)

728x90