문제를 풀기 전에, 코드를 적어내려 가거나 칠판에 적기 전에, 즉 무엇을 하던지 간에 먼저 한 발짝 뒤로 가서 내가 해야 하는 일이 무엇인지 이해하는 것이 제일 중요하다. 그냥 달려들었을 때 함정에 빠지거나 혼란에 빠질수도 있기 때문이다.
내가 특히 이런 방식으로 문제에 접근을 많이 했던것 같다. 일단 시작하고, 코드를 써내려 가다보면 해결책을 알게 되겠지라는 정말 위험한 생각을 가지고 있었는데 이렇게 문제에 접근할 때 풀린 경우도 있었지만 내가 생각했던 데로 흐르지 않으면 당황하고 혼란에 빠졌던 경험이 많았다 이미 한가지 접근법으로만 몰두했기 때문에 하나씩 지우면서 하다보면 결국 전체 코드를 다 지우고 새로 작성한것 같다. 이것만으로 벌써 시간을 많이 날리게 된 것이다.
문제해결 접근법
- 문제를 이해하자 (문제를 나만의 표현으로 바꿔서 정확히 이해하자)
- 문제에 입력하는 값은 무엇인가?
- 출력값은 어떤가? (정수인가 스트링인가 등등)
- 출력값이 입력값에 의해 결정될 수 있나?
- 출력값이 무엇이 되어야 하나?
- 문제를 이해했으면 구체적인 예시를 탐색하자
- 간단한 예시부터 시작해서 복잡한 예시를 탐색하자
- 경계조건은 비어있는 입력값부터 시작하자 (
유효하지 않은 값을 입력하면 어떻게 될까?라는 생각은 항상 가지자!) - 대소문자 구분 등등
- 문제를 쪼개자
- 문제를 해결하기 위한 실제 단계들을 따라가면서 적어보자
- 완벽한 문법대로 적을 필요도 없고 가이드 역할을 할 수 있는 정도로 적어보자
- 모든것이 엄청나게 자세할 필요도 없다
- 해결 방법의 가장 기본적인 구성요소들을 적기만 하면 된다
- 이렇게 문제를 쪼개서 적는다면 실제 코드를 작성하기 전에 작성해야 할 코드에 대해서만 생각할 수 있고 마음 내키는 대로 하거나 떠오르는 대로 하는것이 아니라 어렵거나 이해가 잘 되지 않는 부분을 제대로 알아내는데 도움이 된다
- 이렇게 하고 문제에 직접 달려들자
- 문제 풀기
- 이게 마지막 단계는 아니다
- 내가 모르는 것이 있거나 어려운 부분이 있다면 문제를
간단히 만들기를 해야 한다. - 만약 이 문제를 내가 구글링 없이 절대 풀지못할 것 같다? 그럼 일단 넘어가고 내가 풀 수 있는 부분을 먼저 보고 해결되면 다시 돌아오자
- 뒤돌아보기, 리팩토링
- 코드 퀄리티가 어찌됐든 문제를 풀었거나 조금 간단하게 만들었을 것이다 그렇다면 뒤돌아서 확인 하고 리팩토링을 해야한다
- 만약 정상적으로 잘 동작했다고 바로 끝내버리는 경우가 있는데 그래도 이왕 내가 짠 코드 개선해보면 손해볼것은 없다
- 하지 않는다면
좋은 기회를 날리는 것! - 그리고 효율성과 가독성이라는 두 요소 사이에는 적절한 균형이 필요하다
- 다른 접근법이 있는지, 빼먹은 것은 없는지 면접에서 물어볼 수도 있다
결론
- 가장 중요한 것은 문제를 이해하는 것이다 코딩테스트 뿐만 아니라 그냥 일을 할때나 토이프로젝트를 진행할 때도 문제를 제대로 이해하고 있어야 제대로 된 해결방안을 알 수 있다.
- 문제를 바로 풀기 어렵다면 더 간단하더라도 할 수 있는 방법으로 접근해보자 해결하고 나중에 통합하면 된다
- 가장 중요한 것은 다 풀고나서 코드를 되돌아보고 교훈을 얻거나 수정하는 것이다
문제를 이해하고 예시를 탐색하는 첫 두가지에서 시작하자