문제
- 여행가 A는 N X N 크기의 정사각형 공간 위에 서 있습니다. 이 공간은 1 X 1 크기의 정사각형으로 나누어져 있습니다. 가장 왼쪽 위 좌표는(1,1)이며, 가장 오른쪽 아래 좌표는 (N,N)에 해당합니다. 여행가 A는 상하좌우로 이동할 수 있으며, 시작 좌표는 항상 (1,1)입니다. 우리 앞에는 여행가 A가 이동할 계획이 적힌 계획서가 놓여 있습니다.
L - 왼쪽으로 한칸 이동
R - 오른쪽으로 한칸 이동
U - 위로 한 칸 이동
D - 아래로 한칸 이동- 이때 여행가 A가 N X N 크기의 정사각형 공간을 벗어나는 움직임은 무시됩니다. 예를 들어 (1,1)의 위치에서 L혹은 U를 만나면 무시됩니다.
입력조건:- 첫째 줄에 공간에 크기를 나타내는 N이 주어집니다.(1<=N<=100)- 둘째 줄에 여행가 A가 이동할 계획서 내용이 주어집니다.(1<=이동횟수<=100)ex)5R R R U D D
출력조건:- 첫째줄에 여행가 A가 최종적으로 도착할 지점의 좌표(X,Y)를 공백을 기준으로 구분하여 출력합니다.ex)3 4
문제해결
1) 내 풀이
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//n, 계획서 입력받기
int n = Integer.parseInt(sc.nextLine());
String plan = sc.nextLine();
String[] goal = plan.split(" ");
//방향 L R U D
int[] dx = { 0, 0, -1, 1 };
int[] dy = { -1, 1, 0, 0 };
int direction = 0;
//현재 좌표
int x = 0;
int y = 0;
int tmpX = 0;
int tmpY = 0;
for (int i = 0; i < goal.length; i++) {
switch (goal[i]) {
case "L":
direction = 0;
tmpX = x+dx[direction];
tmpY = y+dy[direction];
if(tmpX>=0 && tmpX<n && tmpY>=0 && tmpY<n) {
x = tmpX;
y = tmpY;
}
break;
case "R":
direction = 1;
tmpX = x+dx[direction];
tmpY = y+dy[direction];
if(tmpX>=0 && tmpX<n && tmpY>=0 && tmpY<n) {
x = tmpX;
y = tmpY;
}
break;
case "U":
direction = 2;
tmpX = x+dx[direction];
tmpY = y+dy[direction];
if(tmpX>=0 && tmpX<n && tmpY>=0 && tmpY<n) {
x = tmpX;
y = tmpY;
}
break;
case "D":
direction = 3;
tmpX = x+dx[direction];
tmpY = y+dy[direction];
if(tmpX>=0 && tmpX<n && tmpY>=0 && tmpY<n) {
x = tmpX;
y = tmpY;
}
break;
}
}
//처음 위치가 (1,1)이기 때문에 +1씩
System.out.print((x+1)+" "+(y+1));
}
2) 정답
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// N을 입력받기
int n = sc.nextInt();
sc.nextLine(); // 버퍼 비우기
String[] plans = sc.nextLine().split(" ");
int x = 1, y = 1;
// L, R, U, D에 따른 이동 방향
int[] dx = {0, 0, -1, 1};
int[] dy = {-1, 1, 0, 0};
char[] moveTypes = {'L', 'R', 'U', 'D'};
// 이동 계획을 하나씩 확인
for (int i = 0; i < plans.length; i++) {
char plan = plans[i].charAt(0);
// 이동 후 좌표 구하기
int nx = -1, ny = -1;
for (int j = 0; j < 4; j++) {
if (plan == moveTypes[j]) {
nx = x + dx[j];
ny = y + dy[j];
}
}
// 공간을 벗어나는 경우 무시
if (nx < 1 || ny < 1 || nx > n || ny > n) continue;
// 이동 수행
x = nx;
y = ny;
}
System.out.println(x + " " + y);
}
해설
- 시뮬레이션 유형, 완전 탐색 유형이라고도 불리는 구현 문제는 요구사항대로 충실히 구현하기만 하면 되는 문제이다. 딱히 어려운 점은 없었지만 코드가 길어지고, 변수가 많아짐에 따라 지금 맞게 하고 있는건가?... 라는 의구심은 든다....
'[알고리즘] > 이코테' 카테고리의 다른 글
구현 - 왕실의 나이트 (0) | 2021.02.23 |
---|---|
구현 - 시각 (0) | 2021.02.20 |
그리디 - 모험가 길드 (0) | 2021.02.18 |
그리디 - 곱하기 혹은 더하기 (0) | 2021.02.17 |
그리디 - 1이 될때까지 (0) | 2021.02.16 |