본문 바로가기
PS 문제 풀이/Baekjoon

[BOJ] 백준 15920 선로에 마네킹이야!!

by 까망 하르방 2021. 2. 17.
반응형

문제출처: https://www.acmicpc.net/problem/15920

 Input 
8
PPPWWWPP  

 Output 

1 

'W'가 1초의 시간이 소요되는 '기다리는' 행위이며,

P 자체는 시간이 소요되지 않는다. 

광차는 A지점에서 시작하면 'W'가 있을 때 다음 지점으로 이동한다고 보면된다.

 

행동 : P - P - P - W - W - W - P - P

출력 : 1 - 5 - 1

광차 : A - A - A - B - B -  C (이미 광차는 도달) 

>> 1 (이미 한 개의 마네킹쪽으로 설정되어 C 구역에 도달)

 

행동 : P - P - P - W - P - P - P (행동종료)

>> 0 (선로가 B에 있을 때 행동이 종료 된 것)

 

행동: W - P - P - W (행동 종료)

>> 6 (광차가 B지점에 있을 때 레버를 움직였으므로 멀티트랙 드리프팅 현상이 발생한 셈이다.)

 

코드를 작성할 때는 아래의 사항을 고려한다.

- 레버를 한번도 동작하지 않은 경우

  (초기 설정대로 진행하게 된다. 행동 길이에 따라 C구역에 도달하거나 도달하지 않는다)

- 광차가 A구역에 있을 때, 레버를 동작시켰다면 어떤 상태인지에 따라 변경됨.

- 광차가 B 구역에 있을 때, 레버를 동작시켰는지 여부

  (어떤 상태인지는 관계없음)

- 광차가 C 구역에 이미 도달했는데도 행동이 끝나지 않은 경우

  → C 구역에 도착한 이후의 행동은 무시한다.

- 행동이 끝났을 때 광차가 C 구역에 도달하지 않은 경우.


import java.util.Scanner;
 
public class Main {
    public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(System.in);
         
        int N = Integer.parseInt(sc.next());
         
        String str = sc.next();
         
        // 1 = 'A'구역, 2 = 'B'구역, 3 = 'C'구역으로 정의
        int train = 1;
         
        // 처음 레버는 '당기지 않은 상태'이므로
        int answer = 5;
        boolean lever = false;
        for(int i=0; i<N; i++) {
            String action = str.substring(i, i+1);
             
            if(train == 3) { // 이미 C 구역에 왔다면 종료
                break;
            }
             
            if(action.equals("W")) {
                train++;
            }else if(action.equals("P")) {
                // 현재 광차의 위치에 따라 정의한다.
                // 광차가 A 구역에 있다면
                if(train == 1) {
                    if(lever) { // 기존의 레버가 당겨져 있는 상태라면 다시 초기의 상태로 돌리는 행위이다.
                        answer = 5;
                    }else { // 레버를 '당김' 상태로 두는 것.
                        answer = 1;
                    }
                    // 레버를 기존의 상태에서 반대로 전환
                    lever = !lever;
                }else if(train == 2) {
                    // 광차가 B 구역에 있다면 일단 멀티트랙 드리프팅 현상이 일어나 모든 경로로 가게 된다.
                    answer = 6;
                }
            }
        }
         
        // 광차가 C 구역에 도달하기 전에 행동이 끝났다면
        if(train < 3) {
            answer = 0;
        }
        System.out.println(answer);
         
    }
}

반응형

댓글