BOJ 5430.AC

moong·2021년 9월 16일
0

알고리즘

목록 보기
5/5

문제

선영이는 주말에 할 일이 없어서 새로운 언어 AC를 만들었다. AC는 정수 배열에 연산을 하기 위해 만든 언어이다. 이 언어에는 두 가지 함수 R(뒤집기)과 D(버리기)가 있다.
함수 R은 배열에 있는 숫자의 순서를 뒤집는 함수이고, D는 첫 번째 숫자를 버리는 함수이다. 배열이 비어있는데 D를 사용한 경우에는 에러가 발생한다.
함수는 조합해서 한 번에 사용할 수 있다. 예를 들어, "AB"는 A를 수행한 다음에 바로 이어서 B를 수행하는 함수이다. 예를 들어, "RDD"는 배열을 뒤집은 다음 처음 두 숫자를 버리는 함수이다.
배열의 초기값과 수행할 함수가 주어졌을 때, 최종 결과를 구하는 프로그램을 작성하시오.

해결

처음에는 list + slicing으로 풀었지만 시간초과났다.
그 외에도 입출력 등 문제가 많았는데, 평소에도 헷갈리던 개념들을 한번에 정리하는 기회가 됐다.

❗ 에러 1 : split이 되지 않는다.

split()은 문자열을 나눈다. list를 나눌 수 X

    nums = [arr[i] for i in range(1, len(arr)-1, 2)]
    nums = nums.split(',') #==> 취소

❗ 에러 2 : 마지막 원소 제거 시, 2개씩 제거된다.

slicing의 범위가 [a:b]일 때, a이상 b미만 (b는 포함하지 X)

                if R % 2 == 0:  
                    nums = nums[1:]  
                    print('R=0->{}'.format(nums))
                else:
                    nums = nums[:len(nums)-2] #==> [:len(nums)-1]
                    print('R=1->{}'.format(nums))

❗ 에러 3 : reverse 한 값들이 'None' 으로 출력된다.

reverse는 값을 반환X, 단지 해당 list를 섞어준다.

    if err:
        print('error')
    else:
        if R % 2 == 1:
            print(nums.reverse()) #==> nums.reverse(); print(nums)
        else:
            print(nums)

참고

  • reverse는 list 타입에서 제공하는 함수
    • 값을 반환 X
  • reversed는 내장함수
    • list 외에도 sequencial(idx로 접근 가능)하면 적용 가능 (문자열, 튜플)
    • reversed 객체를 반환 `<reversed object at 0x1010...>
    • 리스트를 츨력하려면 list(reversed(리스트))
    • 문자열로 출력하려면 ''.join(reversed(리스트))
  • 출처: https://itholic.github.io/python-reverse-reversed/

❗ 에러 4 : 출력에 공백 존재

list 형태는 ,뒤에 한칸 띄우고 다음 값이 온다. 따라서 ','.join(리스트) 하여 합쳐진 문자열로 출력

출력형태가 [1,2,3,4] 형태인데, [1, 2, 3, 4] 형태로 출력된다.

    if err:
        print('error')
    else:
        if R % 2 == 1:
            nums.reverse()
        print(nums) #==> result = ','.join(nums); print('['+result+']')

❗ 에러 5 : 시간초과

list 대신 양방향 queue인 deque 사용

slicing -> pop, popleft

❗ 에러 6 : 런타임 에러 (AttributeError)

nums = nums.extend([arr[i] for i in range(1, len(arr)-1, 2)])
#==> nums.extend([arr[i] for i in range(1, len(arr)-1, 2)])

❗ 에러 7 : 틀렸습니다

65 -> '6','5'

두자리 수 입력 시, 각각의 숫자를 하나로 인식하므로 int로 받기

    arr = sys.stdin.readline().rstrip()
    arr = arr.replace('[', '')
    arr = arr.replace(']', '')
    arr = list(map(int, arr.split(',')))
    nums = deque()
    # 수정 전: nums.extend([arr[i] for i in range(1, len(arr)-1, 2)])
    nums.extend(arr)

❗ 에러 8. 런타임 에러 (ValueError)

빈 문자열이 들어올 경우 예외처리

    arr = sys.stdin.readline().rstrip()
    arr = arr.replace('[', '')
    arr = arr.replace(']', '')
    # 수정 전: arr = list(map(int, arr.split(',')))
    if arr != '':
        arr = list(map(int, arr.split(',')))
    else:
        arr = ''
profile
When life gives you lemons, make lemonade

0개의 댓글