connecting the dots

[SWEA / Java] 1210 : Ladder1 본문

algorithm/SWEA

[SWEA / Java] 1210 : Ladder1

林 : 2021. 2. 7. 23:22

문제

난이도 D4

swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV14ABYKADACFAYh&categoryId=AV14ABYKADACFAYh&categoryType=CODE&problemTitle=1210&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=1

 

SW Expert Academy

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

swexpertacademy.com

 

 

풀이

- 처음 생각

0번째 행에서 출발하지 않고 99번째에 있는 값이 2인 지점(도착점)을 찾아서 위로 올라가는 방식으로 구현했다. 

  1. 사다리 값을 모두 받으면서 도착지점(값이 2인 지점)의 위치를 저장해둔다.
  2. 가장 왼쪽에 있는 사다리 / 가장 오른쪽 사다리 / 나머지 사다리로 나누어 조건을 작성해주고 한 칸씩 올라갈 때마다 사현재 위치를 바꿔준다
  3. 0번째 행에 도달하면 현재 위치의 열번호를 return 해준다
import java.util.Arrays;
import java.util.Scanner;

public class SW1210 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		for (int tc = 1; tc <= 10; tc++) {
			int N = sc.nextInt();
			
			int i_idx=0;
			int j_idx=0;
			
			int[][] arr = new int[100][100];
			for (int i = 0; i < 100; i++) {
				for (int j = 0; j < 100; j++) {
					arr[i][j] = sc.nextInt();
					if(arr[i][j] == 2) {
						i_idx = i;
						j_idx = j;
					}
				}
			}

			int i = i_idx;
			int j = j_idx;
			
			while (i > 0) {

				if (j == 99) {
					if (arr[i][j - 1] == 1) {
						while (arr[i][j] == 1) {
							j--;
							if(j==0) break;
						}
					}
					i--;
				}
				if (j == 0) {
					if (arr[i][j + 1] == 1) {
						
						while (arr[i][j+1] == 1) {
							j++;
							if(j==99) break;
						}
					}
					i--;
				}
				if (j != 99 && j != 0) {
					if (arr[i][j - 1] == 0 && arr[i][j + 1] == 0) {
						i--;
					} else if (arr[i][j - 1] == 1) {
						while (arr[i][j-1] == 1) {
							j--;
							if(j==0) break;
						}
						i--;
						
					} else if (arr[i][j + 1] == 1) {
						while (arr[i][j + 1] == 1) {
							j++;
							if(j==99)
								break;
						}
						i--;
					}
				}

			}
		
			System.out.println("#" + tc + " " + j);
		}
	}
}

 

- 다음 생각

다시 풀어보며 위 코드가 불필요한 부분이 있음을 알게 됐다. 다른 사다리로 넘어가더라도 결국은 다시 위칸으로 올라가야하고, 넘어갈 다리가 없으면 그대로 위로 올라가기 때문에 다리를 다 넘어가고 나면 i--를 통해 위로 올라가고 조건을 만족하지 않으면(넘어갈 다리가 없는 경우) 바로 i--를 통해 올라갈 수 있게 구현했다. 또한 0번째 열과 99번째 사다리를 따로 고려하지 않아도 다리를 넘어갔을 경우 배열 범위를 벗어나지 않는지만 확인해주면 된다.

다시 작성한 코드는 다음과 같다.

import java.util.Arrays;
import java.util.Scanner;

public class SW1210RE {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		for(int i = 1; i <= 10; i++) {
			sc.nextLine(); //사용 안 함
			String[][] ladder = new String[100][100];
			//입력-행 단위로 입력
			for(int j = 0; j < 100; j++) {
				ladder[j] = sc.nextLine().split(" ");
			}
		
			//도착점 위치 찾기 ladder[99][]
			int end = 0;
			for(int j = 0; j < 100; j++) {
				if(ladder[99][j].equals("2")) {
					end = j;
					break;
				}
			}
			//ladder[99][end] 위치~출발점까지 조사
			int x = 99, y = end; // 도착점 좌표
			while(x >= 0) {
				//1. 오른쪽으로 이동 가능한지-> 계속 오른쪽으로 이동
				if((y+1<100) && ladder[x][y+1].equals("1")) {
					do {
						y++;
					}while((y+1<100) && ladder[x][y+1].equals("1"));
				}
				//2. 왼쪽으로 이동 가능한지-> 계속 왼쪽으로 이동
				else if((y-1>=0) && ladder[x][y-1].equals("1")) {
					do {
						y--;
					}while((y-1>=0) && ladder[x][y-1].equals("1"));
				}
				//3. 위로 이동
				x--;
			}
		}
	}
}

 

느낀점

  • 사다리를 타고 올라갈 때 배열을 벗어나지 않도록 조건문을 꼼꼼하게 작성해주어야 error가 안 난다.
  • 자주 사용하는 변수를 나에게 맞게 정해두는 것의 중요성을 느꼈다. 조건문을 작성할 때 다른 변수를 사용하는 바람에 조건이 제대로 작동하지 않아 애를 먹었다.

'algorithm > SWEA' 카테고리의 다른 글

[SWEA/Java] 1247 : 최적경로  (0) 2021.02.18
[SWEA/Java] 1974 : 스도쿠 검증  (0) 2021.02.10
[SWEA / Java] 1861 : 정사각형 방  (0) 2021.02.08
[SWEA / Java] 1208 : Flatten  (0) 2021.02.07
[삼성 기출/C++] 14501번 : 퇴사  (0) 2020.12.20