[백준/ 파이썬] 5430번 AC

김민구·2022년 5월 8일
0

백준 풀이

목록 보기
12/18

백준 5430번 AC

5430번 문제는 이해하기 쉽고 머릿속으로 금방 어떻게 풀어야 할지가 그려집니다.

'R'일때 뒤집고, 'D'일때 첫 번째 요소를 지우면 됩니다.
주의할 점은 입력받은 문자열은 리스트가 아닙니다. 그래서 리스트의 형태로 만들어줘야합니다.
단순히 list()을 활용해서는 만들수 없습니다. 그래서 저는 범위를 지정해주면 리스트의 형태로 반환하기 때문에 범위를 이용해서 문자열을 리스트로 만들었습니다.

  1. 문자열을 리스트로 바꿔줘야합니다.

그 다음에 고려할 부분은 배열에 들어있는 수가 0일때 입니다.
이때 리스트는 "[]"의 모습을 띄고 있는데, 수행할 함수에 "D"가 있으면 'error" 그렇지 않다면 비어있는 형태 그대로 출력해주면 됩니다.

배열에 들어있는 수가 0이라면
1. 수행할 함수에 'D'가 들어있다면 에러 출력
2. 'D'가 들어있지 않다면 비어있는 모습 출력

이제 우리는 명령어를 수행할 차례입니다.
저는 처음에 풀었을때 시간초과가 떠서 통과를 못했습니다. 그 이유는 'R'명령에 대해서 받을때마다 뒤집어 버려서 그랬습니다. 우리는 결과를 반환할때만 'R'명령어를 몇번 받았는지 고려해서 반환시켜 주면 됩니다.
따라서 원소를 지울때는 'R'이 몇번 입력 받았는지에 따라 뒤집은 상태를 고려해서 지워야할지 아닐지를 생각해줘야 합니다.

  1. 'R'이 등장할때마다 뒤집어 주는것이 아니다!!
  2. 'D'을 할때는 지금 이 문자가 뒤집어진 문자에서 지우는것인지 아닌지를 잘 생각해주고 지워준다.
  3. 마지막에는 'R'이 몇번 이루어졌는지 파악해서 문자를 뒤집을지 안뒤집을지 생각해준다.

제 코드가 다소 복잡하고 가독성이 떨어진다는 점 죄송합니다.
더욱 발전해나가겠습니다.

전체코드

def play(order, iterable):
    ans = "error"
    flag = 0    #R의 명령어가 몇번 등장하는지 짝수번 등장하면 그대로 출력 홀수번 등장하면 마지막에 뒤집어서 출력
    for el in order:
        if el == 'R':
            flag += 1
        else:
            if len(iterable) >= 1:
                #뒤집은 상태가 짝수번일때는 원래상태와 같기때문에 맨 첫번째 원소를 지워준다.
                if flag % 2 == 0:
                    iterable.pop(0)
                #뒤집은 상태가 홀수번일때는 뒤집은 상태를 고려해서 마지막 원소를 제거해준다.
                else:
                    iterable.pop()
            else:
                return ans

    if flag % 2 == 0:
        return iterable
    else:
        return iterable[::-1]

n = int(input())
arr = []
for _ in range(n):
    order = input() #R, D
    length = int(input()) #리스트의 길이
    case = input()  #리스트 입력받기
    temp = case[1:len(case) - 1].split(',') #스트링을 리스트로 변환해주는 작업.
    res = play(order, temp)
    #길이가 0일때는 order에 지우라는 명령이 있는지 확인해주면됨.
    if length == 0:
        if 'D' in order:
            print("error")
        else:
            print("[]")
    else:
        if res != "error" and len(res) > 0:
            print("[", end='')
            for i in range(len(res) - 1):
                print(res[i], end='')
                print(",", end='')
            print(res[-1], end='')
            print("]")
        #지웠는데 리스트안에 아무것도 없을때.
        elif res != "error" and len(res) <= 0:
            print(res)
        #res가 반환받은 값이 error일때
        else:
            print(res)
profile
성장하는 개발자가 되고싶어요😀

0개의 댓글