문자열 S가 있다고 가정합니다. 길이는 n입니다. 서로 인접한 이 n개의 상자, 위치 i의 문자 R은 i번째 상자가 오른쪽으로 밀고 있음을 나타냅니다. 마찬가지로, 위치 i의 L은 i 번째 상자가 왼쪽으로 밀고 있음을 나타냅니다. 점 '.' 빈 공간을 나타냅니다. 초기 설정부터 매 시간 단위마다 오른쪽으로 밀린 상자는 다음 상자를 오른쪽으로 밀 수 있으며 왼쪽에도 같은 동작을 적용할 수 있습니다. 더 이상 움직일 수 없을 때 모든 상자의 최종 위치를 찾아야 합니다.
따라서 입력이 R..R...L.과 같으면 출력은 RRRRR.LL이 됩니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- N :=문자열의 크기
- 움직임 :=크기가 N인 배열, 0으로 채우기
- m :=0
- 0~N 범위의 i에 대해 다음을 수행합니다.
- 문자열[i]가 'R'과 같으면
- m :=N
- 그렇지 않으면 string[i]가 'L'과 같을 때
- m :=0
- 그렇지 않으면
- m :=최대 m - 1, 0
- 움직임[i] :=움직임[i] + m
- 문자열[i]가 'R'과 같으면
- m :=0
- N - 1 ~ -1 범위의 i에 대해 1 감소, do
- 문자열[i]가 'L'과 같으면
- m :=N
- 그렇지 않으면 string[i]가 'R'과 같을 때
- m :=0
- 그렇지 않으면
- m :=최대 m - 1, 0
- 움직임[i] :=움직임[i] - m
- 문자열[i]가 'L'과 같으면
- m이 0이면 점을 추가하여 문자열을 만들고, 그렇지 않으면 m> 0이면 'R'을, 그렇지 않으면 이동 중인 모든 요소 m에 대해 'L'을 반환합니다.
예제 코드
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
def get_final_pos(string): N = len(string) movement = [0] * N m = 0 for i in range(0, N): if string[i] == 'R': m = N elif string[i] == 'L': m = 0 else: m = max(m - 1, 0) movement[i] += m m = 0 for i in range(N - 1, -1, -1): if string[i] == 'L': m = N elif string[i] == 'R': m = 0 else: m = max(m - 1, 0) movement[i] -= m return "".join('.' if m == 0 else 'R' if m > 0 else 'L' for m in movement) print(get_final_pos('R..R...L.'))
입력
'R..R...L.'
출력
RRRRR.LL.