Haribo ML, AI, MATH, Algorithm

방문 길이


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가지경우가 있다.

  1. board 밖으로 나가는 움직임

  2. 이미 지나쳐온 길을 중복해서 들어가는 길

  3. 방금 왔던방향 반대로 가는길

이 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를 그대로 유지하지만, 다른 잘못된 움직임일일 경우 현재 pointnext_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

Similar Posts

이전 포스트 멀리 뛰기

다음 포스트 불량 사용자

Comments