해당 시리즈는 이것이 코딩 테스트다
라는 책의 내용을 기반으로 작성된 글이며 알고리즘의 기본 개념이 되는 방법론들의 기본 개념을 학습하고 포스팅 할 예정입니다. 모든 소스 코드는 여기서 확인하실 수 있습니다.
알고리즘 문제를 풀다 보면 이런 생각이 들 때가 있었을 것이다. 어떻게 풀어야 할지는 알겠는데 이걸 코드로 어떻게 옮기지..?
이러한 유형이 구현 알고리즘에 속한다. 즉 해당 유형에서는 풀이 과정은 생각해내기 상대적으로 쉬우나, 이를 코드로 구현함에 있어서 여러가지 장애물이 존재하는 알고리즘을 의미한다.
예를 들어 복잡한 문자열 처리나 큰 정수 처리가 포함된 문제는 C, Java 로 문제를 푸는 이들에게는 상대적으로 어려울 수 있다. 문자를 어떻게 처리 해야 할지는 생각했으나 이를 실제로 구현하는 과정에서 어려움이 존재하기 때문이다. 반대로 자신이 사용하는 언어에 충분히 익숙하고 자신의 생각을 코드로 작성할 수 있다면 쉬운 문제라고 볼 수 있다.
시뮬레이션과 같은 문제들이 구현 알고리즘에 속할 수 있다. 시뮬레이션이란 문제에서 제시하는 알고리즘을 단계별로 직접 수행해야 하는데 이 과정에서 어려움이 존재하기 때문이다. 아래의 예제를 보며 이해해보자.
a b c d e f g h
, Y축은 순서대로 1 2 3 4 5 6 7 8
이라고 가정하자.a1
에 위치한 나이트는 오른쪽 두칸 + 아래로 한칸(C2), 아래로 두칸 + 오른쪽 한칸(B3) 으로 움직일 수 있다. (수평 혹은 수직으로 두칸 이동한 뒤 수직, 수평 방향으로 한칸 이동만 가능하다고 가정한다)위 문제는 나이트가 이동할 수 있는 경로의 경우의 수를 모두 찾아서 판을 벗어나는 곳을 제외하면 된다. 하지만 이를 코드로 구현할 때 여러가지 어려움이 따를 수 있다.(물론 잘하시는 분들에겐 너무 쉬울 것이다) 아래의 코드를 보며 얘기해보자.
def solution():
location = input()
numbers = [1, 2, 3, 4, 5, 6, 7, 8]
chars = ['a', 'b', 'c', 'd', 'e', 'g', 'h']
x = numbers[chars.index(location[0])]
y = int(location[1])
answer = 0
dxy = [
(x - 2, y - 1), (x - 2, y + 1), (x - 1, y + 2), (x + 1, y + 2),
(x + 2, y + 1), (x + 2, y - 1), (x - 1, y - 2), (x + 1, y - 2)
]
for index in range(len(dxy)):
if (0 < dxy[index][0] < 9) and (0 < dxy[index][1] < 9):
answer += 1
return answer
print(solution())
문제를 해결하는 과정에 있어서 아래의 두가지 방법을 생각하고 코드로 옮겨야 한다. 이는 익숙한 사람에겐 쉬울 수 있지만 초보자에겐 어려울 수 있다.
dxy
라는 변수에 위와 같은 형태로 담은 뒤 탐색을 시작한다.개인적으로 구현 알고리즘을 해결할 때는 아래와 같은 방식으로 접근하면 좋을 것 같다. 즉 단계를 세분화하고 작은 단계를 해결하는 과정에서 발생하는 어려움을 학습하며 풀어 간다면, 실력이 늘지 않을까 라고 생각해 본다.(모든 알고리즘이 똑같을거 같기도 하네요..)