알고리즘

[CodeWars] 5Kyu : Directions Reduction

또롱또 2024. 12. 5. 04:32
728x90

https://www.codewars.com/kata/550f22f4d758534c1100025a/train/python

 

Codewars - Achieve mastery through coding practice and developer mentorship

A coding practice website for all programming levels – Join a community of over 3 million developers and improve your coding skills in over 55 programming languages!

www.codewars.com

 

5kyu고 태그로는 Fundamental 외엔 없다.

 

그러니까, 서로 반대되는 방향을 찾아서 지우고 나머지를 반환하는거다.

 

남 <-> 북 / 동 <-> 서 이렇게 반대되는 케이스를 찾아서 배열에서 빼면 된다.

 

라고 이해했다가 내가 이해를 잘못해서 시간을 많이 버렸고, 그래서 그냥 제출해서 정답을 보게 되었다.

 

이게 인접한 엘리먼트중에서 반대되는 방향일 경우 지우는거 였다.

 

정답은 아래와 같다. 스택을 이용하는 문제였다. 스택은 먼저 들어간게 나중에 나온다.

def dir_reduc(arr):
    opposite = {"NORTH": "SOUTH", "SOUTH": "NORTH", "EAST": "WEST", "WEST": "EAST"}
    stack = []
    
    for direction in arr:
        if stack and stack[-1] == opposite[direction]:
            stack.pop()  
        else:
            stack.append(direction)  
    return stack

 

원리는 이렇다.

 

빈 스택을 하나 준비하고, 배열을 돌면서 하나씩 집어넣는다.

 

["NORTH", "SOUTH", "EAST", "WEST", "EAST", "WEST"] 이게 입력됬다 가정하면,

 

처음에 스택에는 NORTH 하나가 들어간다.

 

그리고 다음에 SOUTH를 넣기전에 if stack, 즉 스택에 무언가가 차 있으니, 스택에 가장 마지막에 넣은 stack[-1] 하고, 이번에 들어오는 방향이 같은지 체크한다.

 

만약 같으면 스택에 있는걸 제거하고, 다르면 스택에 집어넣는 식이다.

 

답을보면 간단한데, 뭐 일단 문제 해석에 실패했고, 스택을 이용해야지는 생각을 못했던거 같다.

 

그래서 그냥 한번 더 써보는 식으로 하고 마무리를 해야겠다.

 

 

728x90

'알고리즘' 카테고리의 다른 글

[CodeWars] 7Kyu : Descending Order  (1) 2024.12.06
[CodeWars] 6Kyu : Who likes it?  (1) 2024.12.06
[CodeWars] Factorial - 7Kyu  (0) 2024.12.05
[CodeWars] Multiplication table - 6Kyu  (0) 2024.12.05
[CodeWars] Simple Pig Latin- 5Kyu  (1) 2024.12.05