[자료구조+정렬] 1158번,1966번,5430번

조은지·2021년 10월 2일
0

1. 요세푸스 문제

https://www.acmicpc.net/problem/1158

코드

import sys
input = sys.stdin.readline
n,k = map(int,input().split())
arr = [i for i in range(1,n+1)]    

answer = []  
num = 0  

for t in range(n):
    num += k-1  
    if num >= len(arr):   
        num = num%len(arr)
        
    answer.append(str(arr.pop(num)))
print("<"+", ".join(answer)[:]+">")

인덱스를 잘 고려해주어야 하는 문제였다.
그리고 출력형식도 잘 맞춰주고..

2. 프린터 큐

https://www.acmicpc.net/problem/1966

코드

from collections import deque
import sys

input = sys.stdin.readline

t = int(input())
for _ in range(t):
    n, m = map(int,input().split())
    priority = list(map(int,input().split()))
    q1 = deque() #값을 넣음
    q2 = deque() #인덱스를 넣음
    for i in range(len(priority)):
        q1.append(priority[i])
        q2.append(i)
    count=1
    while True:
        #첫번째 애가 최대 
        if q1[0]==max(q1):
            if q2[0]==m: #얘가 답이면
                print(count)
                break
            else:
                q1.popleft() #아니면 걍 출력
                q2.popleft()
                count+=1
        else:
            q1.rotate(-1)
            q2.rotate(-1)
            #q1.append(q1[0])
            #q2.append(q2[0])
            #q1.popleft()
            #q2.popleft()

rotate함수가 있다는 걸 몰라서 append와 popleft를 사용해서 풀었었다.
m번째 숫자가 출력이 되었는지 확인하기 위한 인덱스 큐를 만들어주었다.

AC

https://www.acmicpc.net/problem/5430

코드

import sys
input = sys.stdin.readline
from collections import deque
t = int(input())

for _ in range(t):
    #조건들 입력
    ac = input().rstrip()
    n = int(input())
    s= input().rstrip()
    isError=False
    
    if n!=0:
        li = deque(s[1:-1].split(","))
    else:
        li = deque()
        
    rev=0
    for i in range(len(ac)):
        if ac[i]=="R":
            rev+=1
        else:
            if len(li)<1:
                isError=True
                print("error")
                break
            else:
                if rev%2==0: #앞에거 뺀다
                    li.popleft()
                else:
                    li.pop()
    if isError is False:
        if rev%2==1:
            li.reverse()
            print('['+','.join(li)+']')
        else:
            print('['+','.join(li)+']')

조낸 많이 틀렸었다 ㄱ-

처음에는 R표시가 나올 때 마다 reverse를 해주었는데, 이 부분에서 시간초과가 났었다.

그래서 R이 표시된 횟수를 세고 홀수면 뒤집고 짝수면 그대로 두는 방식으로 바꿨다.

두번째는 출력형식이였다.
그냥 list로 바꿔서 그대로 출력하도록 했는데 그 때 틀렸습니다 혹은 런타임에러가 발생했었다....

0개의 댓글