문제
선영이는 주말에 할 일이 없어서 새로운 언어 AC를 만들었다. AC는 정수 배열에 연산을 하기 위해 만든 언어이다. 이 언어에는 두 가지 함수 R(뒤집기)과 D(버리기)가 있다.
함수 R은 배열에 있는 숫자의 순서를 뒤집는 함수이고, D는 첫 번째 숫자를 버리는 함수이다. 배열이 비어있는데 D를 사용한 경우에는 에러가 발생한다.
함수는 조합해서 한 번에 사용할 수 있다. 예를 들어, "AB"는 A를 수행한 다음에 바로 이어서 B를 수행하는 함수이다. 예를 들어, "RDD"는 배열을 뒤집은 다음 처음 두 숫자를 버리는 함수이다.
배열의 초기값과 수행할 함수가 주어졌을 때, 최종 결과를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다. T는 최대 100이다.
각 테스트 케이스의 첫째 줄에는 수행할 함수 p가 주어진다. p의 길이는 1보다 크거나 같고, 100,000보다 작거나 같다.
다음 줄에는 배열에 들어있는 수의 개수 n이 주어진다. (0 ≤ n ≤ 100,000)
다음 줄에는 [x1,...,xn]과 같은 형태로 배열에 들어있는 수가 주어진다. (1 ≤ xi ≤ 100)
전체 테스트 케이스에 주어지는 p의 길이의 합과 n의 합은 70만을 넘지 않는다.
해설
백준 알고리즘의 10866번을 풀때 작성해놓은 Deque 클래스를 그대로 활용하여 코드를 작성하였다. Deque 클래스에 print() 함수를 추가하였다. print함수는 방향을 True, False값으로 받아 출력을 할 수 있도록 만들었다.
이 문제를 풀다 막혀서 검색을 하는 경우에는 class의 내용보다는 아래 입력을 받고 처리하는 코드를 먼저 보고, 필요에 따라 클래스에서 해당 함수가 어떤 작업을하는지 확인하면 편하게 확인이 가능할것 같다.
코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | import ast class Deque(): def __init__(self, size): self.queue = [0 for x in range(size + 1)] self.front_flag = 0 self.rear = 0 self.max_size = size self.list_size = size + 1 def push_back(self, num): if (self.rear + 1) % self.list_size == self.front_flag: return -1 self.queue[self.rear] = num self.rear = (self.rear +1) % self.list_size def push_front(self, num): if (self.rear + 1) % self.list_size == self.front_flag: return -1 self.front_flag = self.list_size - 1 if self.front_flag == 0 else self.front_flag - 1 self.queue[self.front_flag] = num def pop_front(self): if self.size() == 0: return -1 temp = self.queue[self.front_flag] self.front_flag = (self.front_flag + 1) % self.list_size return temp def pop_back(self): if self.size() == 0: return -1 self.rear = self.list_size - 1 if self.rear == 0 else self.rear - 1 return self.queue[self.rear] def size(self): if self.front_flag == self.rear: return 0 elif self.rear > self.front_flag: return self.rear - self.front_flag else: return self.max_size - (self.front_flag - self.rear) + 1 def empty(self): return 1 if self.front_flag == self.rear else 0 def front(self): if self.size() == 0: return -1 return self.queue[self.front_flag] def back(self): if self.size() == 0: return -1 return self.queue[self.rear - 1] def print(self, isFront): if self.size() == 0: print("[]") return output = "[" if isFront: i = self.front_flag while(True): output = output + "%d"%self.queue[i] i = (i + 1) % self.list_size if i == self.rear: output = output + "]" break output = output + "," else: i = self.rear while(True): i = (i - 1) % self.list_size output = output + "%d"%self.queue[i] if i == self.front_flag: output = output + "]" break output = output + "," print(output) #n개의 테스트 케이스 n = int(input()) for i in range(n): #명령어 리스트 operator = list(input()) #m크기의 배열 m = int(input()) deque = Deque(m) #배열 str = input() array = ast.literal_eval(str) for i in array: deque.push_back(i) isFront = True isValid = True for op in operator: if op == "R": isFront = not isFront elif op == "D": temp = 0 if isFront: temp = deque.pop_front() else: temp = deque.pop_back() if temp < 0: print("error") isValid = False break else: print("unacceptable op") if isValid: deque.print(isFront) | cs |
'끄적 > Algorithm' 카테고리의 다른 글
[알고리즘] 백준 - 11718 그대로 출력하기 파이썬 구현 (0) | 2019.01.23 |
---|---|
[알고리즘] 백준 - 1003 피보나치 함수 파이썬 구현 (0) | 2019.01.18 |
[알고리즘] 백준 - 1021 회전하는 큐 파이썬 구현 (0) | 2019.01.16 |
[알고리즘] 백준 - 11866, 1158 조세퍼스 문제 파이썬 구현 (0) | 2019.01.13 |
[알고리즘] 백준 - 1966 프린터큐 파이썬 구현 (0) | 2019.01.12 |