반응형
확실히 과거와는 문제 푸는 방식이 달라진 듯 하다.
무작정 코드 먼저 쳐서 모든 출발지에서 출발했던 코드
하지만 이번 코드는 도착지를 선정해서 그 도착지에서 1가지 출발지를 찾는 방식으로 진행했다.
1. 문제 출처
2. 설계
- 도착지를 먼저 찾고, 그 도착지를 거슬러 올라가 출발지를 찾자
//1. 맨 밑에서 도착 2를 찾는다.
int goal_col = 0; //row는 99로 fix
for(int i=0;i<100;i++) {
if(arr[99][i]==2) {
goal_col=i;
break;
}
}
- 기본은 위로 올라가는 방향이다.
- 위로 올라가다가 좌/우로 틀 수 있다면, 튼다.
if(direction==0) {
curr_location[0][0]--;
//다음 갈 방향 선정
//하나 올라갔는데 좌가 있어
if(curr_location[0][1]-1>=0 && arr[curr_location[0][0]][curr_location[0][1]-1]==1) {
direction=1;
}
//하나 올라갔는데 우가 있어
else if(curr_location[0][1]+1<100 && arr[curr_location[0][0]][curr_location[0][1]+1]==1) {
direction=2;
}
}
- 좌로 가다가 또 좌로 갈 수 있으면 계속 좌로 간다.
- 좌로 가다가 좌로 갈 수 없고, 위로 갈 수 있으면 위로 간다.
- 좌로 가다가 좌로 갈 수 없고, 위로도 갈 수 없으면 위치를 다시 원상복귀한 뒤 우로 간다. (좌/우의 갈림길 같은 녀석들)
else if(direction==1) {
curr_location[0][1]--;
//다음 갈 방향 선정
//좌가 더 있냐 그럼 좌로 가
if(curr_location[0][1]-1>=0 && arr[curr_location[0][0]][curr_location[0][1]-1]==1) {
direction=1;
}
//좌로 갔는데 좌가 또 없고, 위가 있어
else if(curr_location[0][0]-1>=0 && arr[curr_location[0][0]-1][curr_location[0][1]]==1) {
direction=0;
}
//좌로 갔는데 좌도 없고, 위도 없어 그럼 다시 원상복구하고, 우로 갈 수 있게 해야함
else {
curr_location[0][1]++;
direction=2;
}
}
- 우로 가다가 또 우로 갈 수 있으면 계로 우로 간다.
- 우로 가다가 우로 갈 수 없고, 위로 갈 수 있으면 위로 간다.
- 우로 가다가 우로 갈 수 없고, 위로도 갈 수 없으면 위치를 다시 원상복구한 뒤 좌로 간다.
else if(direction==2) {
curr_location[0][1]++;
//다음 갈 방향 선정
//우가 더 있냐 그럼 우로 가
if(curr_location[0][1]+1<100 && arr[curr_location[0][0]][curr_location[0][1]+1]==1) {
direction=2;
}
//우로 갔는데 우가 또 없고, 위가 있어
else if(curr_location[0][0]-1>=0 && arr[curr_location[0][0]-1][curr_location[0][1]]==1) {
direction=0;
}
//우로 갔는데 우도 없고, 위도 없어 그럼 다시 원상복구하고, 좌로 갈 수 있게 해야함
else {
curr_location[0][1]--;
direction=1;
}
}
3. 전체 코드
package Ladder1;
import java.util.*;
public class Ladder1 {
static int[][] arr;
static int[][] direc = {{1,0}, {0,-1}, {0,1}};
static int[][] curr_location;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
for(int T=1;T<=10;T++) {
int test_num = sc.nextInt();
arr = new int[100][100];
for(int i=0;i<100;i++) {
for(int j=0;j<100;j++) {
arr[i][j]=sc.nextInt();
}
}
//입력 끝
//1. 맨 밑에서 도착 2를 찾는다.
int goal_col = 0; //row는 99로 fix
for(int i=0;i<100;i++) {
if(arr[99][i]==2) {
goal_col=i;
break;
}
}
//2. 기본 위로 가다가 양 옆에 갈 수 있는 선택지가 나오면
//기본 위로 가다가 좌 우 둘다 있으면 좌로
//상(0) 좌(1) 우(2)
int direction = 0;
curr_location = new int[1][2];
curr_location[0][0] = 99;
curr_location[0][1] = goal_col;
while(curr_location[0][0]>0) {
if(direction==0) {
curr_location[0][0]--;
//다음 갈 방향 선정
//하나 올라갔는데 좌가 있어
if(curr_location[0][1]-1>=0 && arr[curr_location[0][0]][curr_location[0][1]-1]==1) {
direction=1;
}
//하나 올라갔는데 우가 있어
else if(curr_location[0][1]+1<100 && arr[curr_location[0][0]][curr_location[0][1]+1]==1) {
direction=2;
}
}
else if(direction==1) {
curr_location[0][1]--;
//다음 갈 방향 선정
//좌가 더 있냐 그럼 좌로 가
if(curr_location[0][1]-1>=0 && arr[curr_location[0][0]][curr_location[0][1]-1]==1) {
direction=1;
}
//좌로 갔는데 좌가 또 없고, 위가 있어
else if(curr_location[0][0]-1>=0 && arr[curr_location[0][0]-1][curr_location[0][1]]==1) {
direction=0;
}
//좌로 갔는데 좌도 없고, 위도 없어 그럼 다시 원상복구하고, 우로 갈 수 있게 해야함
else {
curr_location[0][1]++;
direction=2;
}
}
else if(direction==2) {
curr_location[0][1]++;
//다음 갈 방향 선정
//우가 더 있냐 그럼 우로 가
if(curr_location[0][1]+1<100 && arr[curr_location[0][0]][curr_location[0][1]+1]==1) {
direction=2;
}
//우로 갔는데 우가 또 없고, 위가 있어
else if(curr_location[0][0]-1>=0 && arr[curr_location[0][0]-1][curr_location[0][1]]==1) {
direction=0;
}
//우로 갔는데 우도 없고, 위도 없어 그럼 다시 원상복구하고, 좌로 갈 수 있게 해야함
else {
curr_location[0][1]--;
direction=1;
}
}
}//while end
//y좌표 출력
System.out.println("#"+T+" "+curr_location[0][1]);
}//test case end
}
}
주의점
- 우로 갈 때는 99 인덱스가 넘는지 확인하고, 위나 좌로 갈 때는 0 인덱스를 안넘는지를 확인해야한다.
- 우로 갈 때도 0인덱스를 안넘는지만 확인했다면 오버 플로우 에러가 날 것이다.
ex)
curr_location[0][0]-1>=0 (위)
curr_location[0][1]-1>=0 (좌)
curr_location[0][1]+1<100 (우)
반응형
'알고리즘 > SWEA' 카테고리의 다른 글
2001. 파리 퇴치 [#2차원 배열] (0) | 2023.10.10 |
---|---|
16546. Baby-gin_실습 [#1차원 배열] (1) | 2023.10.10 |
1979. 어디에 단어가 들어갈 수 있을까 (0) | 2023.10.09 |
1208. Flatten [#1차원 배열] (0) | 2023.10.09 |
16504. Gravity (1차원 배열), 2월의 나와 10월의 나의 풀이 차이 (1) | 2023.10.09 |