https://www.acmicpc.net/problem/23253
찬우는 스택을 배운 뒤 자료구조 과목과 사랑에 빠지고 말았다.
자료구조 과목만을 바라보기로 다짐한 찬우는 나머지 과목의 교과서 권을 방 구석에 개의 더미로 아무렇게나 쌓아 두었다. 하지만 중간고사가 다가오자 더 이상 자료구조만 공부할 수는 없었고, 결국 찬우는 팽개쳤던 나머지 과목의 교과서를 정리하고 번호순으로 나열하려 한다.
권의 교과서는 각각 부터 까지의 번호가 매겨져 있다. 찬우는 각 더미의 맨 위에 있는 교과서만 꺼낼 수 있으며, 반드시 교과서를 꺼낸 순서대로 나열해야 하기 때문에 번호순으로 나열하기 위해서는 번, 번, … 번, 번 교과서 순으로 꺼내야 한다. 교과서를 올바르게 나열할 수 없다면 중간고사 공부를 때려치겠다는 찬우를 위해 번호순으로 나열할 수 있는지 여부를 알려주는 프로그램을 작성해 주자.
첫째 줄에 교과서의 수 , 교과서 더미의 수 이 주어진다.
둘째 줄부터 줄에 걸쳐 각 더미의 정보가 주어진다.
번째 더미를 나타내는 첫 번째 줄에는 더미에 쌓인 교과서의 수 가 주어지며, 두 번째 줄에는 개의 정수가 공백으로 구분되어 주어진다.
각 정수는 교과서의 번호를 나타내며, 아래에 있는 교과서의 번호부터 주어진다.
교과서의 번호는 부터 까지의 정수가 한 번씩만 등장한다.
올바른 순서대로 교과서를 꺼낼 수 있다면 Yes를, 불가능하다면 No를 출력한다.
더미의 교과서 번호가 하나라도 역순이 되는 경우 False가 된다.
입력받은 번호는 더미의 밑에서부터 차례대로 나타낸 것이기 때문에 만약 한 구간이라도 오름차순이 된다면 교과서를 순서대로 꺼낼 수 없으므로 No를 출력한다.
import sys
input = sys.stdin.readline
n, m = map(int, input().split())
check = True
for _ in range(m):
i = int(input())
k = list(map(int, input().split()))
for j in range(i-1):
if k[j] < k[j+1]:
check = False
break
if not check:
break
print('Yes' if check else 'No')
빠른 입력을 사용하지 않으니 시간초과가 나서 sys모듈로 빠른 입력으로 받아준다.
교과서의 수 n과 교과서 더미의 수 m을 입력받는다.
m만큼의 더미에 쌓인 교과서의 수 i를 입력받고, i개의 교과서 번호를 k에 리스트 형태로 입력받는다.
k의 현재 인덱스의 값이 다음 인덱스의 값보다 작으면 내림차순이 아니므로 check 변수를 False로 바꿔주고 반복문을 빠져나온다.
만약, 끝까지 check가 True이면 ‘Yes’를 출력하고 False이면 ‘No’를 출력한다.
더미가 여러개면 각각 따로 계산해줘야 하는건가 싶었는데 더미의 개수랑 상관없이 모두 리스트에 넣고 하나라도 순서가 어긋나면 no가 되는 식으로 풀 수 있었다.