문제
문제 풀이
문제 조건중 한 막대에서 출발한 가로선이 다른 막대를 가로질러서 연속하여 이어지는 경우는 없다. 라는 조건 덕에, 복잡한 케이스 고려X
사다리 맨 마지막의 도착지로부터 역으로 추적
현재 이동 방향을 표시하는
direction
변수를 사용하여 유동적으로 방향 전환현재 방향이 위로 향하는 경우
- 위로 향하던 도중, 양 옆에 길이 있으면 그 길로 빠져야함
- 가로선이 다른 막대를 가르는 경우는 없기 때문에, 왼쪽 또는 오른쪽 길이 발견되면 바로 그쪽 길로 향하면 됨
update direction
- 옆의 길이 발견되지 않으면 계속 위로 이동
- 위로 향하던 도중, 양 옆에 길이 있으면 그 길로 빠져야함
현재 방향이 오른쪽으로 향하는 경우
- 현재 위치의 오른쪽에 길이 있으면 계속 오른쪽으로 이동
- 길이 막히면 위로 이동,
update direction
현재 방향이 왼쪽으로 향하는 경우
- 마찬가지로, 왼쪽에 길이 있으면 계속 왼쪽으로 이동
- 길이 막이면 위로 이동,
update direction
코드
/*
X에서부터 역으로 검사
*/
import java.util.*;
import java.io.FileInputStream;
class Solution
{
public static void main(String args[]) throws Exception
{
Scanner sc = new Scanner(System.in);
sc.nextInt();
// 입력
for(int test_case = 1; test_case <= 10; test_case++)
{
int[][] arr = new int[100][100];
int dest = 0;
for (int i = 0; i < 100; i++){
for (int j = 0; j < 100; j++){
arr[i][j] = sc.nextInt();
// 도착지 검색
if (i == 99 && arr[i][j] == 2) dest = j;
}
}
int i = 100;
int j = dest;
// direction: 검사하던 방향
// 0: i-1
// 1: j-1
// 2: j+1
int direction = 0;
// 목적지에서 부터 탐색
while (i >= 0){
// 위로 이동 중
if (direction == 0){
// 양 옆으로 빠질 수 있으면 빠짐
if (i <= 99 && j-1 >= 0 && arr[i][j-1] == 1){
j--;
direction = 1;
}
else if (i <= 99 && j+1 <= 99 && arr[i][j+1] == 1){
j++;
direction = 2;
}
// 옆에 길이 없으면 계속 올라감
else i--;
}
// 왼쪽으로 이동 중
else if (direction == 1){
// 왼쪽으로 길이 있으면 계속 이동
if (j-1 >= 0 && arr[i][j-1] == 1) j--;
// 길이 없으면 위로 올라감
else{
i--;
direction = 0;
}
}
// 오른 쪽으로 이동 중
else if (direction == 2){
// 오른쪽으로 길이 있으면 계속 이동
if (j+1 <= 99 && arr[i][j+1] == 1) j++;
// 길이 없으면 위로 올라감
else{
i--;
direction = 0;
}
}
}
System.out.printf("#%d %d\n", test_case, j);
try{sc.nextInt();}catch(Exception e){}}
}
}
실행 결과
느낀 점
해결 로직은 쉽게 떠올렸으나, i를 업데이트 하는 부분에서 오타가 발생해서 해맴
'알고리즘' 카테고리의 다른 글
[SWEA/Java] 1824. 혁진이의 프로그램 검증 (0) | 2024.06.02 |
---|---|
[SWEA/Java] 1226. [S/W 문제해결 기본] 7일차 - 미로1 (0) | 2024.06.02 |
[SWEA] 3752. 가능한 시험 점수(Java) (0) | 2024.06.02 |
[프로그래머스] 정수 삼각형(Java) (0) | 2024.06.02 |
[프로그래머스] 기능개발(Java) (0) | 2024.06.02 |