Lv.5 방의갯수문제와 90% 이상 비슷한 문제다.
from collections import defaultdict
add = lambda x, y : (x[0]+y[0], x[1]+y[1])
check = lambda point, next_point, dir_ : (move[dir_][2] not in points[next_point]) and (dir_ not in points[point])
def solution(dirs):
global points, move
answer = 0
move = {'U':(-1, 0, 'D'), 'R':(0, 1, 'L'), 'D':(1, 0, 'U'), 'L':(0, -1,'R')}
points = defaultdict(set)
point = (0, 0)
for dir_ in dirs :
next_point = add(point, move[dir_])
if not(-5<=next_point[0]<=5 and -5<=next_point[1]<=5) :
continue
answer += 1 if check(point, next_point, dir_) else 0
points[point].add(dir_)
point = next_point
return answer
올바른 움직임인지?
올바르지 않은 움직임이란 움직임 count
를 해주지 않는 움직임을 말한다. 올바르지 않은 움직임은 딱 3가지경우가 있다.
board
밖으로 나가는 움직임이미 지나쳐온 길을 중복해서 들어가는 길
방금 왔던방향 반대로 가는길
이 3가지경우를 제외한 모든 움직임에 대해서만 count
해주면 된다.
Vector
모든 캐릭터움직임을 (h, w, direction)
으로 봅시다. 현재 캐릭터의 상태를 이렇게 표현할 수 있습니다.
board
밖으로 나가는 움직임
next_point
의 좌표가 -5 <= next_point <= 5
가 아니라면 올바르지 않은 움직임이 됩니다.
이미 지나쳐온 길을 중복해서 들어가는 길
캐릭터의 움직임을 {(h, w) : direction}
에 저장해놓고 중복되는 (h, w, direction)
이 발생하면 중복처리로 check한다.
방금 왔던방향 반대로 가는길
현재 point : direction
일 때, next_point : inv_direction
이 이미 지나온 길이면 중복처리를 한다.
잘못된 움직임에 대한 현재 point
board
밖으로 나가는 움직임일 경우 현재 point
를 그대로 유지하지만, 다른 잘못된 움직임일일 경우 현재 point
를 next_point
로 갱신한다.
from collections import defaultdict
add = lambda x, y : (x[0]+y[0], x[1]+y[1])
# check 첫번째 조건은 왔던방향 반대로 가는지 check
# check 두번째 조건은 이미 지나쳐온 길을 중복해서 들어오는지 check
check = lambda point, next_point, dir_ : (move[dir_][2] not in points[next_point]) and (dir_ not in points[point])
def solution(dirs):
global points, move
answer = 0
# move 는 역방향을 체크 + 움직임을 만드는 dictionary
move = {'U':(-1, 0, 'D'), 'R':(0, 1, 'L'), 'D':(1, 0, 'U'), 'L':(0, -1,'R')}
points = defaultdict(set) # {(h, w) : set(direction, direction, ...)}을 저장할 좌표
point = (0, 0)
for dir_ in dirs :
next_point = add(point, move[dir_])
if not(-5<=next_point[0]<=5 and -5<=next_point[1]<=5) :
continue # board 밖으로 나가는 경우커서는 고정
answer += 1 if check(point, next_point, dir_) else 0
points[point].add(dir_)
point = next_point
return answer