[2022.09.13] 필독! 코딩 테스트 사전 준비 작성 중
이번 게시글은 코딩 테스트 준비를 하기에 앞서 개발 언어 및 도구에 대한 설명과 공부 방법에 대해 기재하려고 한다.
개발 언어 및 도구
언어 : 파이썬 (v3.7)
공식 인터프리터 : CPython
알고리즘 사이트 : LeetCode & Programmers
IDE : 파이참(PyCharm) - 커뮤니티 에디션
https://www.jetbrains.com/ko-kr/pycharm/download/#section=windows
공부 방법
- 리트코드는 문제 풀이 연습만 가능하기 때문에 추후 취업을 위한 코테 준비는 프로그래머스로 대체한다
- 알고리즘 문제들을 푼 후 다른 사람들의 풀이 방법을 참고하자(알고리즘, 속도 차이 등)
리트코드에서 실행 가능한 코드
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
맨 첫 줄인 class Solution: 을 삭제할 경우 리트코드에서 코드가 돌아가지 않는다.
리트코드에서 기본 라이브러리
import collections
import heapq
import functools
import itertools
import re
import sys
import math
import bisect
from typing import *
리트코드에서는 위의 모듈들을 따로 import 하지 않아도 된다.
유튜브 - 리트코드 문제 풀이 영상 참고용
https://www.youtube.com/playlist?list=PL1iR1v6eNy5OO01XbQ1djo4P6gNG78wYH
--------------------------------------------------------------------------------------------------------------
목차
1. 코딩 인터뷰
2. 프로그래밍 언어 선택
3. 파이썬 특징
1장. 코딩 인터뷰
코딩 인터뷰(코딩 면접)
- 기술 직군 채용을 위한 기술 문제 중심의 개발 인터뷰
- 오프라인 면접장에서 화이트보드를 이용해 후보자의 기술 지식, 코딩 능력, 문제 해결 역량, 창의성 등을 테스트
코딩 테스트의 사전 준비사항
1. 연습장과 필기 도구
- 재귀 구조를 구현 시 연습장에 적어두면서 값의 변화를 추적하면 많은 도움이 된다.
- 또한 값의 변화, 최종 결과를 기록하고 머릿속에 떠올린 구조와 비교하면서 풀이하면 좀 더 정확하게 풀 수 있다.
2. 코드 스니펫 준비
- 자신에게 가장 어려운 알고리즘, 코드 위주로 직접 정리하는 편이 좋다
- 직접 만든 코드여야 원리나 동작을 제대로 이해하고 적용할 수 있다.
3. 모든 테스트 케이스를 통과하도록 풀어야 한다.
- 테스트 케이스
- 특정한 테스트 목표를 달성하기 위해 실행되는 압력, 실행 조건, 테스트 절차, 기대 결과 등의 스펙을 말한다.
- 적어도 코딩 테스트 시에는 충분히 생각하고 문제가 없는지 코드를 다시 한번 더 꼼꼼히 확인 후 제출하자.
예외 처리를 잊지 말자
- 입력값이 0이거나 널(NULL)이 들어오는 경우가 있는데, 입력값에 대한 검증과정을 누락했거나 고민하지 않는다면 분명히 에러가 발생한다.
- 예외 처리를 하지 않아서 일부 테스트 케이스가 실패하면 감점으로 처리되므로 유의해야 한다.
- 처음부터 상단에 예외 처리부터 해놓고 진행하자
잘못 접근한 풀이, 어떻게 대처할까
- 스스로 문제당 제한 시간을 정해두고 그 시간을 초과할 경우 바로바로 다음 문제로 넘어가자
풀이 시간을 초과했을 때, 포기해야 할까
- 제한 시간 내에 풀이하지 못하는 경우는 얼마든지 발생하는데 만약 시간이 초과됐고 2가지에 해당하는지 생각하자
1. 시간이 좀 더 주어지면 다 풀 수 있을 경우
2. 면접관의 이메일 주소를 알고 있을 경우
끝까지 답변을 제출한 것에 대해 면접관에게도 좋은 피드백을 받을 수 있다.
결론, 간절한 기업이면 제한시간이 초과되었더라도 끝까지 풀자.
--------------------------------------------------------------------------------------------------------------
2장. 프로그래밍 언어 선택
수도코드
- 프로그램의 작동 원리 또는 알고리즘을 형식이 정해져 있지 않은 고차원 언어로 기술한 것
- 사람이 쉽게 알아볼 수 있는 형태로 기술
- 훨씬 더 다양한 알고리즘을 표현 가능 (자유도 높음)
함수 fizzbuzz()
for i = 1 to 100
print_number = True
if i is 3으로 나눌 수 있다면
print "Fizz"
print_number = False
if i is 5로 나눌 수 있다면
print "Buzz"
print_number = False
if print_number = True
print i
print 빈 줄
제네릭 프로그래밍
- 파라미터의 타입이 나중에 지정되게 해서 재활용성을 높일 수 있는 프로그래밍 스타일
// C++
template<class T, class U>
bool are_equal(T a, U b) {
return (a == b);
}
are_equal(10, 10.0)
# Python
from typing import TypeVar
T = TypeVar('T')
U = TypeVar('U')
def are_equal(a: T, b: U) -> bool:
return a == b
are_equal(10, 10.0)
위와 같이 타입 힌트를 사용하여 파이썬에서 타입을 명시하게 되면 가독성이 좋아지며 버그 발생 확률을 줄일 수 있다.
구조체
// C++
struct Product {
int weight;
double price;
};
Product apple;
apple.price = 10;
# Python 3.7+
from dataclasses import dataclass
@dataclass
class Product:
weight: int = None
price: float = None;
apple = Product()
apple.price = 10
파이썬에서 구조체를 사용하려면 네임드 튜플을 사용
* @dataclass : 여러 가지 내부 함수의 기능도 자동으로 구현해주기 때문에 편리하게 활용
클래스
// C++
// 선언
class Rectangle {
int width, height;
public:
rectangle(int, int);
int area();
};
// 구현
Rectangle::Rectangle(int x, int y) {
width = x;
height = y;
}
int Rectangle::area() {
return width * height;
}
Rectangle rect(3, 4);
std::cout << rect.area() << std::endl;
이처럼 선언과 구현을 분리하는 방식은 컴파일 속도를 높일 수 있는 등 여러모로 장점이 있다.
# Python
from dataclasees import dataclass
@dataclass
class Rectangle:
width: int
heigth: int
def area(self):
return self.width * self.height
rect = Rectangle(3, 4)
print(rect.area())
* @dataclass : 여러 가지 내부 함수의 기능도 자동으로 구현해주기 때문에 편리하게 활용
--------------------------------------------------------------------------------------------------------------
3장. 파이썬 특징
변수명 선언
- 스네이크 케이스 (각 단어를 _로 구분)
- 소문자 변수명과 함수명을 기본
* 카멜 케이스 VS 스네이크 케이스
- 카멜 케이스 : 단어를 대소문자로 구분하여 섞어서 작명하는 방식(JAVA)
e.g : camelCase : int = 1
- 스네이크 케이스 : 각 단어를 언더스코어(_)로 구분,
일반적으로 모두 소문자로 표기하지만 경우에 따라 시작 문자를 대문자료 포기
e.g : snake_case: int = 1
타입 힌트
- 리턴 값으로 True, False를 리턴할 것을 확실하게 알 수 있다
- 가독성이 좋아지며 버그 발생 확률을 줄일 수 있다.
* 코드를 정리할 때 타입을 모두 지정해서 보기 좋게 제출한다면 코드 리뷰 시 면접관에게 좋은 점수를 받을 수 있다.
- mypy
- pip install mypy
* 온라인 코딩 테스트 시 mypy를 사용하면 타입 힌트에 오류가 없는지 자동으로 확인 할 수 있다.
* 실행 방법 : mypy filename.py
Incompatible return value type
타입 힌트가 잘못 지정된 경우 위와 같은 에러 발생
제너레이터(yield)
- 루프의 반복동작을 제어할 수 있는 루틴 형태
- 예를 들면 숫자 1억개를 만들어내는 로직에서, 제너레이터가 없다면 메모리 어딘가에 숫자 1억개를 보관해야 한다.
하지만, 제너레이터를 사용한다면 제너레이터만 생성해두고 필요할 때 언제든 숫자를 만들어 낼 수 있다.
def get_natural_number():
n = 0
while True:
n += 1
yield n
yield
- 제너레이터가 여기까지 실행 중이던 값을 내보낸다는 의미
- 중간값을 리턴한 다음 함수는 종료되지 않고 계속해서 맨 끝에 도달할 때까지 실행
g = get_natural_number()
for _ in range(0,100):
print(next(g))
range
댓글