본문 바로가기

자료구조와 알고리즘

알고리즘 문제를 쉽게 해결할 수 있도록 해주는 5가지 단계

udemy에서 인기 있는 강의 내용을 정리해 보았다.

1. Understand Problem

코딩에 들어가기 전에 문제를 명확히 이해하는 게 중요하다.

 

체크리스트

- 문제를 내 언어로 바꿔서 표현할 수 있는지

이해를 했는지 확인하기 위해서

- input이 무엇인지

- output은 어때야 하는지

- input을 이용해서 output을 뽑아낼 수 있는지?

혹은 뽑아낼 수 있는 정보를 갖고 있는지?

이는 당장에 답을 하지 못 할 수도 있다.

- 주요 데이터를 어떻게 정의해야 할지

 

예) 두 숫자를 받아서 더한 값을 return 하는 함수

- 문제를 내 언어로 바꿔서 표현할 수 있는지

덧셈 구현

- input이 무엇인지

두 숫자인지, int의 범위를 넘어야 하는지, float인지, number 타입만 처리해야 하는지 등

- output은 어때야 하는지

float으로 리턴할 것인지 등 (위와 유사)

- input을 이용해서 output을 뽑아낼 수 있는지?

인풋이 하나 들어오는 경우에는 불가

- 주요 데이터를 어떻게 정의해야 할지

2. Explore Concrete Examples

예제가 될 다양한 케이스들을 찾아보면 문제에 대한 이해도를 더 높일 수 있다.

- 간단한 예부터 시작해보기

- 더 복잡한 예도

- 빈 인풋일 때는 어떤지

- 유효하지 않은 인풋 예

 

예) string을 받아서 각 글자 수가 몇 개인지를 리턴하는 함수

⇒ 다양한 예제를 미리 적어볼 때 문제를 더 폭넓게 바라볼 수 있다.

- 'a a'의 경우 띄어쓰기를 포함시킬 것인지

- 'Aa'의 경우 대소문자를 구분할 것인지

- 리턴할 형식을 객체로 할 것인지 배열로 할 것인지

- undefined나 null과 같은 값은 어떻게 처리할 것인지

3. Break It Down

문제를 해결할 과정을 대략적으로 적어본다.

문법과 같은 제약에 구애받지 않고 한다.

코드를 작성하기 전에 적어 봄으로써

문제 이해에 도움을 주고

문제 해결 중에 놓치고 있는 것을 발견할 수 있고

신경 써야할 부분에는 어떤 것들이 있는지 파악할 수 있다.

 

처음에는 러프하게 step을 적고

필요하다면 코드를 복사한 다음에 아래에 디테일하게 step을 적을 수 있다.

계속 진행하다 수도 코드 단계까지 이를 수 있다.

복잡한 문제일수록 디테일하게 step을 적어야겠다.

 

인터뷰 시 이렇게 했을 때의 장점은 비록 구현에 시간이 부족하더라도

해결 방법을 이미 알고 있다는 게 보장이 돼 좋은 평가를 받을 수 있다는 것.

4. Solve Or Simplify

위까지 했음에도 해결하기 어려울 때 필요한 작업.

 

구현하기 어려운 부분은 일단 무시하고 진행한다.

그러면 문제가 간단해진다.

예를 들어 글자를 다루는 함수에서 대문자와 소문자를 구분하지 않고 같은 문자로 취급해야 한다고 해보자.

이 로직이 어렵다면 일단 다른 문자로 취급하고 함수를 구현해본다.

 

문제를 함수로 쪼개는 방법이 이와 비슷한 방식인듯하다.

5. Look Back & Refactor

회고 또는 퇴고

- 결과를 체크했는지?

- 다른 방법은 없는지?

- 한눈에 이해할 수 있는지?

- 다른 곳에서도 사용할 수 있는지?

- 성능을 더 높일 수 있는지?

- 리팩토링 할 수 있는지?

- 다른 사람들은 어떻게 문제를 해결했는지?

 

참고 :

https://www.udemy.com/course/js-algorithms-and-data-structures-masterclass/