프로그래머스 2단계 문제인데 어떻게 접근해야 할지 몰라서 많이 헤매었던 문제라 정리해보고자 합니다. 조이스틱의 상하 움직임은 쉬우므로 생략하도록 하겠습니다.
맨 왼쪽에서 왼쪽으로 이동하면 맨 오른쪽으로 거리 1만에 이동할 수도 있는것이 이 문제의 핵심 같습니다.
++) 조이스틱의 맨 처음 시작위치에 대한 설명이 문제에 잘 명시되어 있지 않았는데,
조이스틱은 처음에 name[0]인 위치에서 시작합니다.!!!
위의 사진을 보시면 임의의 A가 아닌 점 C를 잡고, C 이후에 나오는 A가 아닌 지점 B를 잡습니다.
C의 인덱스를 i, B의 index를 idx라고 하면,
조이스틱의 최소 좌우 이동거리는
i) 한 방향으로 쭉 이동하는 경우(최대): n-1
ii) 2a+b
iii) 2b+a
조이스틱 최단 이동거리(좌,우)=min(2a+b,2b+a)=a+b+min(a,b)=i+n-idx+min(i,n-idx)
이라는 수식을 얻을 수 있다.
답은 조이스틱의 상하 이동 거리에, 조이스틱 좌,우 최단 이동거리를 더하면 된다.
코드는 아래와 같다
코드는 매우 간결한데, 수식을 생각해내기 어려운 문제였던 것 같다. 비슷한 문제를 많이 연습해봐야겠다는 생각이 들었다.😄