Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

Life Engineering

[SW Expert 1210] Ladder1 (Java) 본문

Problem Solving

[SW Expert 1210] Ladder1 (Java)

흑개 2022. 2. 4. 17:06

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV14ABYKADACFAYh 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

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

public class SW1210 {
	static int[] dr= {0,-1,0};
	static int[] dc= {-1,0,1};
	static int[][] ladder=new int[100][100];
	static int t;
	public static void main(String[] args) throws IOException {
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		for (int T=1; T<=10; T++) {
			t=Integer.parseInt(br.readLine());
			boolean[][] check=new boolean[100][100];
			int now_r=0;
			int now_c=0;
			int now_d=-1;
			for (int i=0; i<100; i++) {
				StringTokenizer st=new StringTokenizer(br.readLine());
				for (int j=0; j<100; j++) {
					ladder[i][j]=Integer.parseInt(st.nextToken());
					if (ladder[i][j]==2) {
						now_r=i;
						now_c=j;
					}
				}
			}
			while (now_r!=0) {
				int temp=now_d;
				check[now_r][now_c]=true;
				for (int i=0; i<3; i++) {
					int new_r=now_r+dr[i];
					int new_c=now_c+dc[i];
					if (new_r<0 || new_c<0 || new_r>=100 || new_c>=100) {
						continue;
					}
					if (ladder[new_r][new_c]==1 && !check[new_r][new_c]) {
						if (i!=temp) {
							now_d=i;
						}
					}
				}
				now_r+=dr[now_d];
				now_c+=dc[now_d];
			}
			System.out.printf("#%d #%d\n",T,now_c);
			
		}
	}
}

도착점에서부터 시작해 거슬러 가는 방식을 택했다.

위, 오른쪽, 왼쪽을 탐색해 1이면서 방문하지 않은 곳이면 해당 방향을 저장한다. (기존 방향과 다른 방향이 나타났을 경우 그 방향으로 방향을 바꾼다)

방향따라 계속 탐색해가면서 행이 0인 곳을 만나면 탐색을 종료한다.

 

다른 분들의 코드를 보니 시작점에서부터 출발해서, 아래쪽.왼쪽.오른쪽을 탐색한다(범위를 넘지 않으면서, 1이 있을 경우, 방문하지 않았을 경우). x,y 값을 점차 이동해가면서 도착점에 도달했을때 종료한다.