문제
You are given two strings start and target,
both of length n.
Each string consists only of the characters 'L', 'R', and '_' where:
The characters 'L' and 'R' represent pieces,
where a piece 'L' can move to the left only if there is a blank space directly to its left,
and a piece 'R' can move to the right only if there is a blank space directly to its right.
The character '_' represents a blank space that can be occupied by any of the 'L' or 'R' pieces.
Return true if it is possible to obtain the string target by moving the pieces of the string start any number of times. Otherwise, return false.
- 문자열이 주어지는데 문자열의 각 문자는 아래를 의미한다.
- L : 왼쪽 빈칸으로 이동할수 있다.
- R : 오른쪽 빈칸으로 이동할수 있다.
- _ : 빈칸
- start 와 target 문자열이 주어질때, 문자열의 문자를 원하는만큼 이동하여
start 문자열을 target 문자열과 동일하게 만들수 있는지 여부를 리턴하시오.
예시
start = "_L__R__R_", target = "L______RR"
- 한개의 L을 왼쪽으로 싹 옮기고 나머지 R을 오른쪽으로 밀면 완성된다.
제한
- n==start.length==target.length
- 1<=n<=105
- start와 end 문자열은 'L', 'R', '_' 로만 구성된다.
풀이
- 일단 start가 target이 되려면 아래의 조건을 충족해야 한다.
- L과 R의 상대적인 위치가 전부 동일할것
- Ex. L이 2개가 있고, R이 1개가 있고, L이 1개가 있을것
L__L_R__L
_L__LR___L_
- start의 L에 해당하는 target의 L은 반드시 start에 있는것과 같은 위치거나 왼쪽에 있어야 한다.
- start의 R에 해당하는 target의 R은 반드시 start에 있는것과 같은 위치거나 오른쪽에 있어야 한다.
- 위 조건들을 만족하는지만 검사하면 된다!
class Solution:
def canChange(self, start: str, target: str) -> bool:
start_indices = [(index, ch) for index, ch in enumerate(start) if ch != '_']
target_indices = [(index, ch) for index, ch in enumerate(target) if ch != '_']
if len(start_indices) != len(target_indices):
return False
for (s, sc), (t, tc) in zip(start_indices, target_indices):
if sc != tc:
return False
elif sc == 'L' and t > s:
return False
elif sc == 'R' and t < s:
return False
return True