반응형
문제출처: 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);
}
}
반응형
'PS 문제 풀이 > Baekjoon' 카테고리의 다른 글
[BOJ] 백준 7575 바이러스 (0) | 2021.02.17 |
---|---|
[BOJ] 백준 10840 구간성분 (0) | 2021.02.17 |
[BOJ] 백준 1475 방 번호 (0) | 2021.02.17 |
[BOJ] 백준 20061 모노미노도미노 2 (0) | 2021.02.17 |
[BOJ] 백준 19235 모노미노도미노 (0) | 2021.02.17 |
댓글