connecting the dots
[SWEA / Java] 1210 : Ladder1 본문
문제
난이도 D4
풀이
- 처음 생각
0번째 행에서 출발하지 않고 99번째에 있는 값이 2인 지점(도착점)을 찾아서 위로 올라가는 방식으로 구현했다.
- 사다리 값을 모두 받으면서 도착지점(값이 2인 지점)의 위치를 저장해둔다.
- 가장 왼쪽에 있는 사다리 / 가장 오른쪽 사다리 / 나머지 사다리로 나누어 조건을 작성해주고 한 칸씩 올라갈 때마다 사현재 위치를 바꿔준다
- 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 |