백준|5430번|AC

README·2022년 7월 31일
0

파이썬 PS풀이

목록 보기
41/136

문제설명
AC라는 언어를 만들었는데 그 언어의 명령어는 배열의 뒤집는 R과 마지막 자리에 있는 원소를 지우는 D가 있다. 이 언어를 이용할 때 배열과 명령어 R, D를 입력받고 모든 명령을 수행후의 배열을 출력하는 문제입니다.

작동 순서
1. 입력받을 테스트 케이스의 수를 입력받습니다.
2. 명령어를 입력받습니다.
3. 배열의 길이를 입력받습니다.
4. 배열을 입력받습니다. 이때 앞서 입력받은 배열의 길이가 0일경우 빈배열을 만들어줍니다.
5. 명령어를 R을 기준으로 나누어줍니다.
6. (명령어 전체의 길이)-(명령어를 R을 기준으로 나눈 마디수)를 D의 개수라고 할 때 n보다 D의 개수가 크면 error 출력 같은 경우 빈배열을 출력합니다.
7. D의 개수보다 n이 큰 경우 앞서 입력받은 명령어를 수행합니다.
8. D를 수행하는데 R로 나눈 마디수 만큼 반복문을 이용하고 j가 홀수인 경우 뒤집어진 상태, j가 짝수인경우 원래의 상태로 계산하여 해당 마디의 D의 개수만큼 원소를 삭제합니다.(이때 원래의 상태로 계산할 때는 실제로 원소를 삭제하는것이 아닌 삭제할 원소의 개수만을 저장합니다.)
9. 명령어 수행이 완료되면 R의 총개수에 따라 출력할 방식을 정합니다.
10. R로 나눈 마디수가 홀수인 경우 마지막상태가 원래대로인 상태이므로 앞에서부터 출력하고 짝수인 경우 마지막 상태가 뒤집어진 상태이므로 뒤에서 부터 출력을 합니다.

소스코드

import sys
for i in range(int(sys.stdin.readline())):
    cmd = sys.stdin.readline()
    n = int(sys.stdin.readline())
    input = sys.stdin.readline()
    arr = list(map(int, input[1:-2].split(sep=",")) if n != 0 else [])
    order = cmd[0:-1].split("R")
    if n < len(cmd)-len(order):
        print("error")
    elif n == len(cmd)-len(order):
        print("[]")
    else:
        front_del = 0
        for j in range(len(order)):
            if j % 2 == 1:
                del arr[len(arr)-order[j].count("D"):]
            else:
                front_del += order[j].count("D")
        print("[", end="")
        if len(order) % 2 == 1:
            for j in range(front_del, len(arr)):
                print(arr[j], ",", sep="", end="") if j != len(arr)-1 else print(arr[j], end="")
        else:
            for j in range(len(arr)-1, front_del-1, -1):
                print(arr[j], ",", sep="", end="") if j != front_del else print(arr[j], end="")
        print("]")

후기
제가 풀어본 문제들중에서는 상당히 어려웠던 문제였던것 같습니다. 많은 시간이 걸리고 다른 분의 도움도 받긴했지만 풀어낸것이 의미가 있는 것 같고 좀 더 공부를 하여서 이러한 문제도 충분히 풀 수 있을만큼 발전하고 싶습니다.

profile
INTP 개발자 지망생

0개의 댓글