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
'Algorithm > 알고리즘 강의 자료' 카테고리의 다른 글
백트래킹이란 (0) | 2024.04.22 |
---|---|
재귀함수 분석 & 초 간단 트리 이론 (0) | 2024.04.22 |
스택의 활용(연산 표기법 : 중위 표기법, 전위 표기법, 후위 표기법) + 큐 연습문제 (0) | 2024.04.22 |
알고리즘 시간 복잡도 (0) | 2024.04.22 |