zero-wiki Help

코딩 테스트를 준비하기

언어 선택하기

언어는 코딩 테스트에서 그렇게 중요한 요소는 아닙니다. 언어를 활용할 때는 다음만 기억하면 됩니다.

  • 변수 선언하기

  • 함수 정의하기

  • 컨테이너 자료형 다루기

  • 조건문, 반복문 사용하기

그러나 자바스크립트로 코딩 테스트를 볼 때 장단점이 있는 것은 분명합니다. 자바나 C++과 같은 언어와 달리 동적 타이핑 언어이므로 타입을 잘 타지 않는다는 장점이 있습니다. 또 여러가지 클래스들이 지원이 되므로 코드 작성이 편해진다는 점도 있습니다.

그러나 불리한 점으로는 heap, dequeue 와 같이 흔하게 쓰이는 자료구조, 알고리즘이 클래스로 제공이 되지 않습니다. 이런 부분은 직접 공부를 해야 구현을 할 수 있으므로 타 언어에 비해 매우 불리하다고 할 수 있습니다.

단순한 예시로 프로그래머스 레벨 2의 매운 맛의 경우, 파이썬으로 풀이를 진행할 경우 지원하는 모듈을 이용하여 20줄 이내의 코드가 나오지만 자바스크립트로 구현할 경우 80줄 이상의 코드가 나오기도 합니다.

다만 구현에 익숙해질 경우 문제에 맞춰 변형할 필요가 있는 경우 이 점은 더 유리할 수 있습니다.

요즘은 점차 자바스크립트를 사용하는 회사가 많아지고 있습니다. 프런트엔드 개발은 대부분 자바스크립트나 타입스크립트를 사용하므로 코딩 테스트 언어를 자바스크립트로 제한하는 경우도 많습니다.

문제 분석 연습하기

따라서 무작정 코드를 작성하기보다 문제 분석에도 시간을 충분히 사용해야 합니다. 2시간에서 4시간을 준다고 가정하였을 때 50~60%는 문제 분석에 시간을 쓰는 것이 좋습니다.

첫 번째 문제를 쪼개서 분석하라

문제 전체를 한번에 분석하는 것보다 문제를 동작 단위로 쪼개서 분석하는 것이 유리합니다. 한번에 생각하는 양을 줄인다면 문제에 좀 더 유연하게 접근할 수 있습니다.

두 번째, 제약 사항을 파악하고 테스트 케이스를 추가하라

문제에는 보통 제약 사항이 있습니다. 제약 사항을 정리해두고 이를 고려해서 테스트 케이스를 추가하는 것이 좋습니다. 이 과정은 어떤 알고리즘을 사용할지, 추후 코드를 구현하는 단계에서 예외를 거를 때 도움이 됩니다.

세 번째, 입력값을 분석하라

보통 알고리즘의 시간 복잡도는 입력값이 결정하는 경우가 많습니다. 입력값 크기를 확인하면 문제를 제한시간에 풀 수 있는지 없는지, 알고리즘을 걸러낼 수 있습니다.

예제로 입력 데이터가 100만개라면 알고리즘으로는 맞는 코드를 작성해도 출력 값이 나오지 않아 테스트를 통과할 수 없습니다. 따라서 입력 값을 분석하는 시간을 가져야 합니다.

네 번째, 핵심 키워드를 파악하라

코딩 테스트 공부를 많이 한 사람들은 문제를 빨리 해석합니다. 그 이유는 핵심 키워드가 곧 특정 알고리즘을 암시하는 경우가 많기 때문입니다.

예를 들어 "최적의 해"라는 키워드가 있다면 너비 우선 탐색 알고리즘을 고려하는 것이 좋습니다. 왜냐하면 너비 우선 탐색 알고리즘 목적 자체가 최적의 해를 구하려는 것이기 때문입니다.

핵심 키워드에 따른 알고리즘 선택 방법

키워드

상황

스택

- 쌍이 맞는지


- 최근

- 무언가를 저장하고 반대로 처리해야 할 때


- 데이터의 조합이 균형을 이뤄야할 때


- 알고리즘이 재귀 특성을 가질 때


- 최근 상태 추적

- 순서대로 - ~대로 동작하는지


- 스케줄링 - 최소 시간

- 특정 조건에 따라 시뮬레이션 할 때


- 시작 지점부터 목표 지점까지 최단 거리

깊이 우선 탐색

- 모든 경로

- 메모리 사용량이 제한적일 때의 탐색


- 백트래킹 문제를 풀 때

너비 우선 탐색

- 최적 - 레벨 순회


- 최소 단계 - 네트워크 전파

- 시작 지점부터 최단 경로나 최소 횟수를 찾아야 할 때

백 트래킹

- 조합 - 순열


- 부분 집합

- 조합 및 순열 문제


- 특정 조건을 만족하는 부분 집합

최단 경로

- 최단 경로 - 최소 시간


- 최소 비용 - 트래픽


- 음의 순환 - 단일 출발점 경로

- 다익스트라: 특정 지점에서 나머지 지점까지 가는 최단 경로


- 벨만-포드: 음의 순환 탐지, 음의 가중치를 가진 그래프에서 최단 경로

다섯 번째, 데이터 흐름이나 구성을 파악하라

구현과 설계의 기준이 되는 데이터 흐름이나 구성을 파악하는 것도 중요합니다. 삽입과 삭제가 빈번하게 일어날 것 같으면 힙 자료구조를 고려하는게 좋습니다. 데이터의 입력 값이 적다면 충분히 제한 시간 내에 결괏값을 낼 수 있습니다.

만약 해결책이 떠오르지 않는다면 모든 경우를 확인하거나 하드 코딩 방식으로 풀이하는 것도 하나의 전략입니다. 접근성도 중요합니다. 만약 전화번호 검색을 구현 한다면 객체를 만들고 키값으로 이름을 넣는 식으로해야 접근성이 좋습니다.

이와 같이 효율만큼 접근성도 중요한 것을 알 수 있습니다.

의사 코드로 설계하는 연습하기

문제 분석을 끝낸 다음에 분석 내용을 바탕으로 전체적인 코드를 설계해야 합니다. 즉 코딩 테스트에서 설계의 의미는 의사 코드를 작성하라는 것입니다. 의사 코드는 프로그램의 논리를 설명하고 알고리즘을 표현하기 위해 작성한 일종의 지침이라 보면 됩니다.

의사 코드를 작성할 때 구현 단계가 아닌 추상 단계에서 설계를 진행할 수 있는 것을 확인 할 수 있다. 또한 추상 단계에서 의사 코드를 수정하는 건 수정 시간이 더 짧아 시간에서도 큰 이득을 보는 것을 알 수 있다.

첫 번째, 세부 구현이 아닌 동작 중심으로 작성하라

의사 코드는 동작 중심으로 작성하는 것이 중요합니다.

예를 들어, 성적 관리 프로그램을 만든다고 하였을 때. 성적을 입력받는 부분을 의사 코드로 작성한다고 한다면 다음과 같이 작성하면 됩니다.

  • 국영수 점수를 입력을 받는다.

하지만 다음과 같이 받는 경우도 있습니다. "크기가 256바이트인 문자열 배열을 3개 선언해서 입력..." 실제 프로그래밍 요소는 의사 코드에 추가하면 안된다.

두 번째, 문제 해결 순서로 작성하라

의사 코드가 완성된다면 이를 토대로 코드를 구현할 것이므로 문제 해결 순서대로 작성해야 합니다.

예를 들어 수학 점수를 입력받아 통과, 실패를 판별하는 의사 코드가 있다면 다음과 같이 작성할 수 있습니다.

    1. 수학 성적을 입력 받는다.

    1. 수학 성적이 80점을 넘는지 확인한다. (분기)

    • 80점 이상이면 통과

    • 80점 미만이면 실패

세 번째, 충분히 테스트하라

구현 전 마지막 단계는 충분히 테스트를 하라는 것입니다. 구현 단계로 갈수록 잘못된 부분을 수정하는 데 드는 비용은 점점 커지므로 의사 코드가 미리 생각해본 테스트 케이스를 통과할 수 있을지 고민해야합니다.

Last modified: 07 August 2024