[Python] 방문 길이

Saemi Min·2023년 1월 30일
0

Programmers Algorithm

목록 보기
4/29
post-thumbnail

문제

문제 링크

풀이

반대로 순회하는 경우를 대비하여 visit.add()할 때, 출발 좌표, 도착 좌표의 값으로만 봤을 때 출발 좌표가 도착 좌표보다 더 작은 값이어야 한다. 그리하여 UP 할때는 y값이 증가되니 visit.add((출발좌표), (도착좌표))로 추가되지만, DOWN일 경우 y값이 감소되니 visit.add((도착좌표), (출발좌표))로 추가된다는 것이다. 사실 출발, 도착이라는 개념으로 해석하면 더 헷갈릴 수 있으니 단순히 x1, y1은 x2, y2보다 크다는 것이 보장되어야 한다는 것이다.
또한, 좌표를 넘어가지 않도록 and 비교문을 넣어주었다!


갔던 길은 다시 가면 안되고, 또한 좌표계를 넘어가지 않는 조건으로 코드를 작성하면서 가장 먼저 떠오른 생각은 요소를 변경할 일이 없으니 튜플을 사용하고, 처음 이동한 좌표와 이후에 이동한 좌표를 넣어보자였다. 그리하여 첫번째 좌표 (0, 0)은 넣고, 움직인 좌표들을 튜플에 순서대로 넣어주었다. 리스트에 요소들을 출발 좌표, 도착 좌표로 구분하여 넣고, 이후 중복된 요소는 set으로 제거 후, 해당 리스트의 길이 값을 반환해야겠다는 생각이 들었다.


처음 쓴 코드는 아래와 같다.. 이 코드에서는 if문에서 좌표계를 넘어가지 않는 선에서 코드가 돌아가도록 제약을 걸었지만, 이후 입력 명령어에 따라 좌표가 +1로 더해지거나 -1로 빼지면서 좌표를 넘어가게 된다. 그래서 잘못된 코드임을 깨닫고 수정한다.

def solution(dirs):
    answer = 0
    x=0
    y=0
    t=(x, y)
    for i in range(len(dirs)):
        if(x<=5 and x>=-5 and y<=5 and y>=-5):
            if(dirs[i]=="U"):
                y+=1
            elif(dirs[i]=="D"):
                y-=1
            elif(dirs[i]=="L"):
                x-=1
            elif(dirs[i]=="R"):
                x+=1
            t+=(x, y)
    l=[]
    for j in range(0, len(t)-2, 2):
        l.append(t[j:j+4])
    res=set(l)
    answer=len(res)
    return answer

여러 번 생각하여 짠 코드는 아래와 같은 코드였다. 샘플 테스트 케이스는 통과했다. 하지만 제출 후 채점을 했을 때는 틀린 코드라고 나왔다. 분명 놓친 부분 경우의 수가 있다고 생각했다. 다른 사람들의 코드를 참고하면서 깨달은 것은 반대로 (0, 0)에서 (1, 0)로 갔는데 (1, 0)에서 다시 (0, 0)으로 돌아간 경우였다. 중복이 허용되지 않는 set()을 사용했으므로, ((0, 0), (0,1))과 ((0, 1), (0, 0))은 다른 값이다. 이 경우를 생각하여 짜려면 처음 내가 짠 방식인 도착 좌표만 순서대로 들어가서는 안된다는 것을 알았다.. 일방통행만 가능하다고 생각한 코드이기 때문에..ㅠ 다시 코드 작성을 해야했다.

//내가 생각하기에 최종 코드라고 생각하는데..ㅠㅠㅠ
def solution(dirs):
    answer = 0
    x=0
    y=0
    t=(x, y)
    for i in range(len(dirs)):
        if(dirs[i]=="U"):
            y+=1
        elif(dirs[i]=="D"):
            y-=1
        elif(dirs[i]=="L"):
            x-=1
        elif(dirs[i]=="R"):
            x+=1
        if(x<=5 and x>=-5 and y<=5 and y>=-5):
            t+=(x, y)
        else:
            if(dirs[i]=="U"):
                y-=1
            elif(dirs[i]=="D"):
                y+=1
            elif(dirs[i]=="L"):
                x+=1
            elif(dirs[i]=="R"):
                x-=1
    l=[]
    for j in range(0, len(t)-2, 2):
        l.append(t[j:j+4])
    res=set(l) #중복 제거한 이유는 겹치는 곳 없애려고
    after=len(res)
    answer= after
    return answer

결과

해석 및 기억할 부분

Git

  • set() : 중복을 제거해줌
  • 좌표1=(x1, y1) < 좌표2=(x2, y2)가 보장되어야 한다. 이러한 보장은 코드를 짜면서 내가 해주면 될 부분!

후기

접근은 잘 했지만 일어날 수 있는 경우의 수를 놓쳤고, 예시 코드만 생각하는 것이 아닌 좀 더 넓게 생각했으면 짤 수 있었겠다라는 아쉬움이 들었다.
참고한 코드를 보면서 아예 add를 할 때 저렇게 다르게 넣어주는 방식이 있다는 것을 알게되었다. 생각의 전환이 필요하다는 것도 알 수 있었다..ㅎ

profile
I believe in myself.

0개의 댓글