Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python에서 수정한 후 문자열의 최종 상태

<시간/>

문자열 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
  • m :=0
  • N - 1 ~ -1 범위의 i에 대해 1 감소, do
    • 문자열[i]가 'L'과 같으면
      • m :=N
    • 그렇지 않으면 string[i]가 'R'과 같을 때
      • m :=0
    • 그렇지 않으면
      • m :=최대 m - 1, 0
    • 움직임[i] :=움직임[i] - m
  • 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.