728x90

http://WWW.acmicpc.net/problem/5430

 

5430번: AC

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

www.acmicpc.net

 

# 조건

  • AC 언어는 정수 배열에 연산을 하기 위해 만든 언어
  • R(뒤집기)와 D(버리기) 함수가 존재
  • R은 배열에 있는 수의 순서를 뒤집는 함수이고, D는 첫 번째 수를 버리는 함수
  • 비어있는데 D를 사용하면 에러
  • 첫줄 tc 개수 T
  • 각 테케의 첫 줄에는 수행할 함수 p (1<=p<=100,000)
  • 배열에 들어있는 수의 개수 n과 배열에 들어 있는 정수가 주어진다.
  • 함수를 수행한 결과를 출력하고, 에러가 발생할 경우 erro 출력
 

# 접근 방법

  • 정수 배열을 받아준 후 명령어 대로 수행하면 될 것 같다.
  • 다만, 리스트의 형태로 들어오기 때문에
    • -> reverse를 이용하여 대괄호 제거
    • rstrip을 통해 개행문자 제거
    • split(',') 이용 ,를 제거 해주면 된다.
  • R인 경우 [::-1], D인 경우 pop을 해주는데 시간 효율을 고려하여 deque를 이용 -> popleft와 reverse 사용
  • 또한 비어있는 경우가 있으므로 try, except을 이용해준다.
 

# 시간 초과

import sys  
sys.stdin = open('input.txt')  
input = sys.stdin.readline  
from collections import deque  
  
T = int(input())  
for tc in range(T):  
    oper = input().rstrip()  
    N = int(input())  
    # 대괄호 제거 후 ',' 기준 나눠주기  
    q = deque(input().replace('[',"").replace(']',"").rstrip().split(','))  
  
    # ''처럼 공백하나 있는 경우  
    if 'D' in oper and N == 0:  
        print('error')  
    else:  
        for i in oper:  
            if i == 'R':  
                q.reverse()  
            else:  
                try:  
                    q.popleft()  
                except:  
                    print('error')  
                    break  
  
        else:  
            print('[',end='')  
            for i in range(len(q)):  
                if i == len(q)-1:  
                    print(q[i],end='')  
                else:  
                    print(q[i], end=',')  
  
            print(']')

 

위의 방법으로 하면 시간초과가 발생한다. 따라서, reverse 메서드를 직접 구현해주자.

  • reverse method의 경우 시간복잡도가 -> O(N)이므로 자주 사용하면 좋지 않다.
  • R이 들어오는 카운트를 세어주며 현재 R이 홀수개라면 -> pop()
  • 현재 R이 짝수개라면 popleft()를 이용해준다.
  • 이후, R이 홀수개라면 뒤집어주고 아니면 그대로 출력
import sys  
sys.stdin = open('input.txt')  
input = sys.stdin.readline  
from collections import deque  
  
T = int(input())  
for tc in range(T):  
    oper = input().rstrip()  
    N = int(input())  
    # 대괄호 제거 후 ',' 기준 나눠주기  
    q = deque(input().replace('[',"").replace(']',"").rstrip().split(','))  
  
  
    # R 카운팅해주기  
    R_cnt = 0  
    # ''처럼 공백하나 있는 경우  
    if 'D' in oper and N == 0:  
        print('error')  
    else:  
        for i in oper:  
            if i == 'R':  
                R_cnt += 1  
            else:  
                try:  
                    if R_cnt % 2:  
                        q.pop()  
                    else:  
                        q.popleft()  
                except:  
                    print('error')  
                    break  
  
        else:  
            if R_cnt % 2:  
                q.reverse()  
  
            print('[',end='')  
            for i in range(len(q)):  
                if i == len(q)-1:  
                    print(q[i],end='')  
                else:  
                    print(q[i], end=',')  
  
            print(']')
728x90