BOJ 5430.AC
문제
선영이는 주말에 할 일이 없어서 새로운 언어 AC를 만들었다. AC는 정수 배열에 연산을 하기 위해 만든 언어이다. 이 언어에는 두 가지 함수 R(뒤집기)과 D(버리기)가 있다.
함수 R은 배열에 있는 숫자의 순서를 뒤집는 함수이고, D는 첫 번째 숫자를 버리는 함수이다. 배열이 비어있는데 D를 사용한 경우에는 에러가 발생한다.
함수는 조합해서 한 번에 사용할 수 있다. 예를 들어, "AB"는 A를 수행한 다음에 바로 이어서 B를 수행하는 함수이다. 예를 들어, "RDD"는 배열을 뒤집은 다음 처음 두 숫자를 버리는 함수이다.
배열의 초기값과 수행할 함수가 주어졌을 때, 최종 결과를 구하는 프로그램을 작성하시오.
해결
선영이는 주말에 할 일이 없어서 새로운 언어 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 = ''
Author And Source
이 문제에 관하여(BOJ 5430.AC), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@moong3871/BOJ-5430.AC저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)