ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 큐, 덱 - 백준 5430
    Code Etc/코딩테스트 2023. 4. 16. 18:43
    반응형

    큐와 덱은 하나의 자료구조인데

    큐는 First In First Out의 구조를 가진 형태이다.

    먼저 들어온 게 먼저 나가는 구조이다.

    덱은 이와 비슷하지만 나가는 출구가 2개인 녀석이다

    보통 앞에서 뽑아내는 경우 메모리를 정렬하는 과정에서 많이 소모되는데

    덱은 빠져나간 메모리 삭제까지 알아서 해주니 꽤 빠르고 좋다.

    문제를 하나 풀어보자

     

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

     

    5430번: AC

    각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다. 만약, 에러가 발생한 경우에는 error를 출력한다.

    www.acmicpc.net

    입력으로 testCase와 수행할 명령어, 배열의 길이, 배열이 주어지고

    이에 따라 알맞은 동작을 수행하면 알고리즘을 작성하면 된다.

     

    풀 때 입력받은 배열이 0인 경우를 해결하기가 까다로웠지만

    if조건문을 추가해서 해결했다

    그리고 error을 출력하고 또 []이 출력되는 경우가 있었는데

    이는 error을 출력한 뒤 해당 for문을 종료해야하는데 그렇지 않아서

    아래에서 출력이 한 번 더 된 경우였다. 그래서 breakPoint변수를 추가해줬다.

     

    import sys
    input = sys.stdin.readline
    
    from collections import deque
    cases = int(input().rstrip())
    for _ in range(cases) :
        func = input().rstrip() #함수를 입력받는다.
        length = int(input().rstrip()) #배열의 길이
        arr = input().rstrip().split(',') #배열
        arr[0] = arr[0].strip('[')
        arr[length-1] = arr[length-1].strip(']')
        deq = deque(arr) #위에서 만든 배열을 원소로하는 덱 생성
        if deq == deque(['']) : #입력받은 배열의 원소가 없을 때
            if 'D' not in func : #D가 아니라면 회전만 하므로 빈 배열 출력
                print('[]')
            else :			#D가 있다면 출력해야하는데 출력할 원소가 없으므로 error출력
                print('error')
            continue
        isError = False #breakPoint로 사용할 변수 설정
        isRev = False	#앞에서 추출할지 뒤에서 추출할지 결정할 변수 설정
        for i in range(len(func)) : #앞에서 입력받은 func수행
            if func[i] == 'R' : 
                isRev = not(isRev) #R이라면 isRev변수의 값을 반전시켜준다
            else :
                try : #try except를 사용한 이유는 다 출력하여 뽑을 원소가 없는 경우를 대비
                    if isRev : #isRev가 True이면 뒤에서 추출
                        deq.pop() 
                    else :	#아니면 앞에서 추출
                        deq.popleft()
                except :	#Error발생 시 breakPoint변수 True대입하고 error출력 후 break
                    print('error')
                    isError =True
                    break
        if isError : #breakPoint동작, except에서 error을 출력했으니 바로 continue로 넘어감
            continue 
        else :	#정상 동작의 경우
            if isRev : #Rev가 True이면 배열 전체를 뒤집어준다
                deq.reverse()
            print('['+','.join(map(str,deq)) + ']') #정답출력
    반응형

    댓글

Designed by Tistory.