문제
https://www.acmicpc.net/problem/5430
풀이
[내 코드]
import sys
input=sys.stdin.readline
T = int(input())
for _ in range(T):
s = list(input())
n = int(input())
if n==0:
arr = input()
if 'D' in s: # 길이가 0인데 D가 있을 경우 에러 발생
print("error")
continue
else: # 길이가 0인데 D가 없을 경우에는 []출력
print("[]")
continue
arr = list(input()[1:-2].split(',')) # 앞 뒤 []을 잘라주고 ,로 나눠준다.
isRe = False # reverse 여부
start,end=0,0 # index 선언
for index in s[:-1]:
if index=="R":
isRe = not isRe
else:
if n==0:
print("error")
break
n-=1
if isRe: end+=1
else: start+=1
else:
if isRe:
arr.reverse()
if start==0: arr = arr[end:]
else: arr = arr[end:-start]
else:
if end==0: arr = arr[start:]
else: arr = arr[start:-end]
print("["+",".join(arr)+"]")
pop을 사용하면 시간이 오래걸릴것같아 인덱스를 구해서 slice 하는 방법으로 풀었다.
방법은 사진과 주석 참고!
cf) 출력부분에서 join으로 안하고 list를 바로 출력하니 틀렸다고 나왔다..
[다른사람 코드]
for _ in range(int(input())):
f=list(map(len,input().replace('RR','').split('R')))
n=int(input())
a=input()[1:-1].split(',')
s,e=sum(f[0::2]),n-sum(f[1::2])
a=a[s:e] if len(f)%2==1 else a[s:e][::-1]
print(f"[{','.join(a)}]" if s<=e else "error")
출처는 백준 숏코딩이다.
- 2번 뒤집으면 같은 모양이니 ''로 치환 , R을 기준으로 나눠준다. 나눠준 것들의 길이를 구해서 리스트로 만들어준다.
- a의 리스트를 slice해서 구해줄것이다. 왼쪽(s), 오른쪽(e) 인덱스를 구해야한다. 왼쪽은 R을 짝수번째로 뒤집은 것(0,2,4...), 즉 f[0::2]의 합이다. 오른쪽은 홀수번째로 뒤집은 것(1,3,5...), 즉 f[1::2]을 n에서 뺀 것이다.
- f의 길이가 홀수이면 뒤집지 않아도되므로 a[s:e]로 slice해준다. 짝수이면 한번 뒤집어야하므로 a[s:e][::-1]을 해준다.
- 만약 왼쪽 인덱스가 오른쪽 인덱스보다 크면 error를 출력해준다. 아니면 답을 출력해준다.
느낀점
그래도 이문제는 골드 문제중에서 쉬운편에 속하는거같음.. 골드치곤 막힘없이 풀었다..
백준 숏코딩을 보기전까진 이렇게 생각함^^! 쩝;; 숏코딩을 보고나니 내 코드는 무슨,. 허접 코드 ㅠ
인덱스로 접근하는 것 까지는 좋았으나.. RR을 ''로 치환하는 것과 R로 나눠 길이를 구하는 것은 상상도 못했다.
언제쯤이면 나도 저렇게 짤 수 있을까
'코딩테스트 > Python' 카테고리의 다른 글
[Python] 백준 #1463 - 1로 만들기 (0) | 2021.12.12 |
---|---|
[Python] 백준 #2667 - 단지번호붙이기 (0) | 2021.12.12 |
[Python] 백준 #1021 - 회전하는 큐 (0) | 2021.12.11 |
[Python] 백준 #1966 - 프린터 큐 (0) | 2021.12.11 |
[Python] 백준 #1152 - 단어의 개수 (1) | 2021.12.08 |