Algorithm/Problem Solving

[한개라도 제대로] 구현(2)

Jinlib 2022. 1. 9. 16:51

서론

구현 2번째 문제이다. 이번 문제는 dx dy 방향벡터를 활용해서 문제를 풀어보도록 하겠다.

본론

1) a -> 1, b->2 ... h->8 으로 해석할 수 있겠구나!
이를위해 ord()함수를 써서 문자열을 아스키 코드로 바꿔서 행렬계산해보자(*chr()은, 숫자를 아스키코드로 바꾸는데 사용)

def kingKnight(S):
    x = ord(S[0]) - 96
    y = int(S[1])
    cnt = 0
    if x - 2 > 0 and y - 1 > 0:
        cnt+=1
    if x - 2 > 0 and y + 1 > 0:
        cnt += 1
    if x + 2 > 0 and y - 1 > 0:
        cnt += 1
    if x + 2 > 0 and y + 1 > 0:
        cnt += 1
    if x - 1 > 0 and y - 2 > 0:
        cnt += 1
    if x - 1 > 0 and y + 2 > 0:
        cnt += 1
    if x + 1 > 0 and y - 2 > 0:
        cnt += 1
    if x + 1 > 0 and y + 2 > 0:
        cnt += 1
    return cnt
print(kingKnight('a1'))
print(kingKnight('c2'))

반성할점: 수많은 if문도 타인이 코드 이해하는 면에서 나쁘진않은데, 좌표값을 활용해서 코드를 단축시켜보자

def kingKnight_refactoring(S):
    x = ord(S[0]) - 96
    y = int(S[1])
    cnt = 0
    move =[[-2,-1],[-2,1],[2,-1],[2,1]]
    for m in move:
        if x + m[0] > 0 and y + m[1] > 0:
            cnt += 1
        if x + m[1] > 0 and y + m[0] > 0:
            cnt += 1
    return cnt
print(kingKnight_refactoring('a1'))
print(kingKnight_refactoring('c2'))

반성할점: 8x8인데 이점을 제대로 파악 못하고 계산했다.

def kingKnight_dongbinna(S):
    x = ord(S[0]) - ord('a') + 1
    y = int(S[1])
    move =[(-2, -1), (-2, 1), (2, -1), (2, 1), (-1, 2), (-1, -2), (1, 2), (1, -2)]
    cnt = 0
    for m in move:
        new_x = x + m[0]
        new_y = y + m[1]
        if new_x >= 1 and new_x <= 8 and new_y >= 1 and new_y <= 8:
            cnt += 1
    return cnt
print(kingKnight_dongbinna('a1'))
print(kingKnight_dongbinna('c2'))

배운점: 타인이 코드를 봤을때, x값에서 -96을 한게 뭔소린지 모를만하다. ord('a')하는게 타인이 보았을때 더 이해하기 쉬울것이다.
또한 리스트아넹 리스트보다는 수정이 불가능한 튜플을 사용하는것이 좀 더 좋을것같다.

마무리

속도면에서 많이 발전했다.
다만, 코드 시안성까지는 바라지 않더라도 반례에 대해서 좀 더 깊은 생각이 필요해보인다.
꾸준히 잘하고 있다.