Starship Syncopation
시간 제한1초메모리 제한1024 MB
여러 규칙이 바뀌는 T턴의 전투를 시뮬레이션하면서 주어진 턴 종료 시점의 피해량, 별의 힘, 남은 해적선 수를 출력한다.
문제
우주전함 스타십은 오늘도 별무리 사이를 항해한다. 지금은 운수가 좋지 않아 척의 우주 해적선에 포위되고 말았지만... 스타십에는 별의 힘으로 작동하는 광자포가 탑재되어 있다. 이를 최대 출력으로 발사하면 우주 해적을 무찌르는 것쯤은 식은 죽 먹기다. 하지만 우주 항해 시대부터 전해져 오는 우주 전투 규칙에 따르면 이런 전법은 “낭만이 없기 때문에” 사용할 수 없다. 우주 전투 규칙을 중요시하는 스타십과 우주 해적은 다음의 방법으로 전투를 진행한다.
-
전투 개시
전투의 개시는 우주 해적이 스타십을 포위함으로써 선언된다. 이때 스타십은 저장해 두었던 별의 힘을 모두 잃는다. 각 우주 해적선에는 이상 이하의 서로 다른 정수 번호가 매겨져 있다. 우주 해적선마다 내구도가 정해져 있으며, 피해량이 내구도 이상이 되면 즉시 침몰한다. 스타십은 내구도가 매우 높아 아무리 큰 피해를 입어도 침몰하지 않는다.
-
전투의 진행
전투는 개의 턴으로 구성되며, 실행 순서대로 부터 까지의 번호를 붙여 표기한다. 각 턴에는 별의 힘 저장, 스타십의 행동, 우주 해적선의 행동, 턴 종료가 순서대로 진행된다.
-
별의 힘 저장
스타십이 별의 힘을 침몰한 우주 해적선의 수지금까지 별에 기도한 횟수 만큼 저장한다. 스타십에 저장할 수 있는 별의 힘의 최댓값은 이다. 이를 초과하는 별의 힘을 저장한 경우, 초과분의 별의 힘은 사라진다.
-
스타십의 행동
스타십이 다음 중 하나의 행동을 선택해 수행한다.
-
대기하기
아무것도 하지 않는다. 별의 힘을 소모하지 않는다.
-
전함 수리
스타십에 저장된 별의 힘을 소모해 스타십이 받은 피해량을 만큼 회복한다. 피해량을 초과해 회복하는 경우 초과한 회복량만큼 별의 힘을 돌려받는다. 스타십에 저장된 별의 힘이 미만인 경우 대신 대기하기를 수행한다.
-
별에 기도하기
별의 힘을 소모해 기도를 올린다. 저장된 별의 힘이 미만인 경우 대신 대기하기를 수행한다.
-
광자포 발사
별의 힘을 소모해 침몰하지 않은 우주 해적선 중 번호가 가장 작은 것에 만큼 피해를 준다. 저장된 별의 힘이 미만이면 대신 싱코페이션을 수행한다. 이 행동을 수행할 때 침몰하지 않은 우주 해적선이 항상 존재함을 증명할 수 있다.
-
싱코페이션
저장된 별의 힘을 모두 소모하고, 침몰하지 않은 우주 해적선 중 번호가 가장 작은 것에 소모한 별의 힘만큼 피해를 준다. 이번 턴 종료 시 광자포가 과부하 상태에 빠진다. 이 행동을 수행할 때 침몰하지 않은 우주 해적선이 항상 존재함을 증명할 수 있다. 광자포가 과부하 상태에 빠진 경우, 별의 힘 저장과 광자포 발사, 싱코페이션이 각각 다음과 같이 변경된다.
-
별의 힘 저장 (과부하)
기존과 동일하게 별의 힘 저장을 진행한 뒤, 스타십에 저장된 별의 힘이 미만이 될 때까지 다음 두 행동을 번갈아 수행한다.
-
침몰하지 않은 모든 우주 해적선과 스타십에 의 피해를 준다.
-
스타십에 저장된 별의 힘을 소모한다.
-
-
광자포 발사 (과부하)
스타십에 저장된 별의 힘이 이상인 경우, 저장된 별의 힘을 모두 소모해 그만큼 침몰하지 않은 모든 우주 해적선에 피해를 준다. 스타십에 저장된 별의 힘이 이하인 경우, 광자포 발사에 실패하고 저장된 모든 별의 힘을 잃으며, 스타십이 의 피해를 입는다. 그 뒤 광자포 발사의 성공 여부와 관계없이 광자포의 과부하 상태가 해제된다.
-
싱코페이션 (과부하)
저장된 모든 별의 힘을 잃고, 스타십이 의 피해를 입는다. 그 뒤 광자포의 과부하 상태가 해제된다.
-
-
-
우주 해적선의 행동
침몰하지 않은 모든 우주 해적선은 다음의 두 행동을 차례로 수행한다.
-
해적선의 현재 피해량이 이라면 스타십에 피해를 준다.
-
해적선의 현재 피해량이 이상이라면 피해량을 회복한다.
-
-
턴 종료
이번 턴을 종료하고, 상황에 따라 전투를 종료하거나 다음 턴을 진행한다.
-
-
전투 종료
턴 종료 시 모든 우주 해적선이 침몰했거나, 총 번의 턴 종료를 수행했다면 전투를 종료한다. 모든 우주 해적선이 침몰해 전투를 종료하는 경우 남은 턴은 진행되지 않음에 유의하라.
턴 동안 스타십이 수행할 행동이 순서대로 주어진다. 턴의 번호가 주어졌을 때, 그 턴이 종료되었을 때의 전황을 출력하는 프로그램을 만들어 보자!
입력
첫째 줄에 우주 해적선의 수 이 주어진다. ()
둘째 줄에 각 우주 해적선의 내구도를 나타내는 개의 수가 공백으로 구분되어 주어진다. 그중 번째 수는 번 우주 해적선의 내구도다. 각 내구도는 이상 이하의 정수다.
셋째 줄에 전투에서 진행할 턴의 수 가 주어진다. ()
넷째 줄에 길이 의 문자열이 입력된다. 그중 번째 문자는 번째 턴에 스타십이 수행할 행동을 의미한다. 이때 W는 대기하기, R은 전함 수리, P는 별에 기도하기, L은 광자포 발사, S는 싱코페이션을 의미한다.
다섯째 줄에 질의의 수 가 주어진다. ()
여섯째 줄에 질의로 턴의 번호를 나타내는 개의 정수 , , , 가 오름차순으로 주어진다. ()
출력
개의 줄에 걸쳐, 번째 줄에 번째 턴 종료 시 스타십이 받은 피해량, 스타십에 저장된 별의 힘, 침몰하지 않은 우주 해적선의 수를 공백으로 구분해 출력한다.
만약 번째 턴이 진행되지 않는다면 대신 번째 줄에 skipped를 출력한다.
힌트
입출력의 양이 많으므로, 빠른 입출력을 사용하는 것을 권장합니다. 다음은 대표적인 언어에서 빠른 입출력을 이용하는 방법입니다.
- C++:
cin,cout을 사용한다면main함수 첫 줄에std::cin.tie(0); std::cout.tie(0); std::ios::sync_with_stdio(false);를 추가하고, 줄바꿈 시endl대신'\n'을 출력해주세요. 이 경우scanf를 비롯한 C의 입출력 함수는 사용할 수 없음에 유의해 주세요.scanf/printf는 충분히 빠르므로 별도의 처리를 하지 않아도 괜찮습니다.
- Java:
Scanner와System.out.println대신BufferedReader와BufferedWriter를 사용해 주세요. - Python3, PyPy3:
input()대신sys.stdin.readline().rstrip()을 사용해 주세요.