CodeWars 12 : Take a Ten Minute Walk

문제설명

You live in the city of Cartesia where all roads are laid out in a perfect grid. You arrived ten minutes too early to an appointment, so you decided to take the opportunity to go for a short walk. The city provides its citizens with a Walk Generating App on their phones -- everytime you press the button it sends you an array of one-letter strings representing directions to walk (eg. ['n', 's', 'w', 'e']). You always walk only a single block for each letter (direction) and you know it takes you one minute to traverse one city block, so create a function that will return true if the walk the app gives you will take you exactly ten minutes (you don't want to be early or late!) and will, of course, return you to your starting point. Return false otherwise.

Note: you will always receive a valid array containing a random assortment of direction letters ('n', 's', 'e', or 'w' only). It will never give you an empty array (that's not a walk, that's standing still!).

요약 : 리스트를 파라미터로 준다. 리스트에는 동서남북('e','w','s','n')을 뜻하는 문자들이 들어있다.
문자 1개당 1분의 시간이 소요되며 해당 방향으로 1칸 움직이게 된다. 리스트 전체를 돌렸을 때 '정확하게' 10분을 소모하면서, 최종적으로 출발지점으로 돌아오는 리스트면 True 그 외는 False를 리턴하시오.

제한사항

리스트에 무조건 문자하나는 들어있음

풀이

def is_valid_walk(walk):
    direction_dic = {'n': 1, 's': -1, 'w': 10, 'e': -10}
    return True if len(walk) == 10 and sum([direction_dic[v] for v in walk]) == 0 else False

주어진 조건대로 식을 세우면 됩니다. 리스트 length가 10(10분)이고, direction_dic 계산값이 0(출발지점)이면 True아니면 False를 반환시켜주면 완료!

n,s(남북)과 w,e(동서)를 10의 배수로 설정한 것은 어짜피 10걸음 내로 통과하니까 만약 동쪽 1번(-10) 남쪽 9번(9)이여도 결과값이 0이 되지않으므로 계산이 겹치지 않기 때문입니다. 반대로 숫자를 10의배수를 안쓰고 동일하게 1,-1,1,-1이나 혹은 차이가 적은 1,-1,2,-2쓴다면 출발지점이 아니여도 계산값이 0일 경우의 수가 발생가능하므로 반드시 동,서와 남,북의 숫자의 자리수를 다르게 써야합니다.

다른풀이

def isValidWalk(walk):
    return len(walk) == 10 and walk.count('n') == walk.count('s') and walk.count('e') == walk.count('w')

남-북 / 동-서가 같으면 되므로 리스트컴프리헨션이아니라 count와 등호를 활용해서도 똑같은 결과값을 도출할 수 있습니다. 게다가 삼항연산자를 쓰지않아도 되겠네요.

좋은 웹페이지 즐겨찾기