# 문제
# 풀이
일반적인 큐의 정책에 따라서 pop되어야 하는 원소를 기준으로 그 뒤의 원소들 중 큰 값이 있다면 큐의 맨뒤에 줄을 세우는 과정을 반복하면 된다.
그러나 출력해야하는 문서의 초기 인덱스 값인 M 큐가 계속해서 update됨에따라서 인덱스 번호가 바뀐다. 이 것을 해결하는 것이 문제를 푸는 가장 중요한 포인트라고 생각했다.
M이 맨앞에오는 시점(인덱스가 0일때) 즉 출력되어야하는지 맨 뒤로 가야하는지를 결정하는 시점또한 중요 포인트다.
# 실패한 풀이
def unsolve(n):
result = []
for _ in range(n):
cnt = 0
N,M = list(map(int, sys.stdin.readline().strip().split()))
data = list(map(int, sys.stdin.readline().strip().split()))
# print(N,M,data,result)
if N == 1 :
result.append(1)
continue
while M != -1:
target = data[0]
if M == 0:
for i in range(1,len(data)):
if target < data[i]:
pop_data = data.pop(0)
data.append(pop_data)
M += len(data)-1
break
if i == len(data)-1:
cnt+=1
result.append(cnt)
M = -1
else:
for i in range(1, len(data)):
if target < data[i]:
pop_data = data.pop(0)
data.append(pop_data)
M -= 1
break
if i == len(data)-1:
data.pop(0)
M -=1
cnt+=1
return result
초기 인덱스 값인 M이 0일때, 문서가 출력되면 더이상 while문이 돌 필요가 없기 때문에 큐가 update될때마다 M을 빼주거나, 맨뒤의 인덱스값으로 바꿔주는 과정들을 거치는 풀이를 사용했다.
어찌보면 틀린 풀이같지는 않다는 생각이 든다. 테스트케이스도 넘었다. 그러나 제출하면 시간초과가 떴다.
# 정답 풀이
def solve(n):
result = []
for _ in range(n):
cnt = 0
break_flag = True
N, M = list(map(int, sys.stdin.readline().strip().split()))
data = list(map(int, sys.stdin.readline().strip().split()))
data = [(item,index) for index,item in enumerate(data)]
while break_flag:
for i in range(0, len(data)):
if data[0][0] < data[i][0]:
# 뒤에 큰게 하나라도 있으면 맨뒤로 보냄
data.append(data.pop(0))
break
if i == len(data)-1:
#끝까지 탐색했는데도 제일 큰거인 경우
if data[0][1] == M:
# 그게 M인경우 M을 출력하고 While문을 멈추게 해야함
cnt +=1
result.append(cnt)
break_flag = False
break
else:
data.pop(0)
cnt+=1
return result
if __name__ == '__main__':
n = int(input())
a = solve(n)
for i in a:
print(i)
튜플을 사용해서 묶어서 저장하면 M에대한 값을 따로 판단할 필요가 없었다. 보다 쉽게 문제를 해결 했다.
# 마치며
'•알고리즘(Algorithm ) > 문제풀이' 카테고리의 다른 글
[백준-4195] 친구 네트워크 파이썬, union-find풀이, 파이썬 set을 이용한 풀이 (0) | 2022.08.06 |
---|---|
[백준-5397] 키로거 파이썬 (0) | 2022.08.05 |
[백준-1874] 스택 수열 파이썬 (0) | 2022.08.05 |
[백준-2798] 블랙잭 파이썬, 3중 반복문 사용 (0) | 2022.08.03 |
[백준-2920] 음계 파이썬, 오름차순 내림차순 판단하기 (0) | 2022.08.03 |