책읽기

[파이썬 알고리즘 인터뷰] 1부 - 코딩 인터뷰

pythaac 2021. 6. 23. 19:44
이 글은 "파이썬 알고리즘 인터뷰 (박상길 지음)"을 읽고 주관적으로 요약한 글입니다. 

출처 : http://www.yes24.com/Product/Goods/91084402

1장 코딩 인터뷰

1) 코딩 인터뷰 종류

  1. 오프라인 코딩 인터뷰
    면접관들 앞에서 오프라인으로 라이브 코딩하는 인터뷰
  2. 오프라인 화이트보드 코딩 인터뷰
    면접관들 앞에서 화이트보드를 이용하여 설명/구현하는 인터뷰
  3. 온라인 코딩 인터뷰
    면접관들 앞에서 온라인으로 라이브 코딩하는 인터뷰
  4. 온라인 코딩 테스트
    플랫폼을 통해 문제를 푸는 테스트

※ 라이브 코딩 / 화이트 보드 / 코딩 테스트

2) 코딩 인터뷰를 위한 온라인 테스트 플랫폼

  • 해커랭크 (카카오)
  • 코딜리티 (네이버)
  • 리모트인터뷰
  • 프로그래머스 (대부분 기업들이 많이 사용하는듯, 네이버도 최근에 사용)
  • 리트코드 (해당 책에서 사용)

3) 온라인 코딩 테스트

  • 사전 준비사항
    • 연습장 / 스니펫(Snippet)
      최근 겪어본 코딩 테스트에서는 사용할 수 있는 경우가 거의 없었다.
  • 테스트 팁
    • 모든 테스트케이스 통과
      TDD가 아닌 문제에 맞는 효율적인 알고리즘 사용을 요구
    • 타임아웃
      파이썬은 다른 언어에 비해 알고리즘 최적화가 더욱 요구됨
    • 예외처리
      처음부터 예외 처리를 하고 진행
    • 제한 시간
      한 문제에 대해 잘못 접근한 경우, 시간을 정하여 다음 문제로 넘어가기
    • 메일 보내기
      테스트 시간이 끝난 후 문제를 풀어도 끝까지 메일로 제출해보기 (경우에 따라 다르겠지만, 스스로에게 좋을듯)
    • IDE 사용하기 (+REPL)
      최근 겪어본 코딩 테스트에서 사용을 금지하는 경우도 보았다.

※ 알고리즘 분류 -> 설계 -> 예외처리 -> 구현 -> 검증 -> 제출

4) 화이트보드 코딩인터뷰

  • 핵심을 관통하는 알고리즘을 중심으로 구현
  • 모르는 알고리즘은 면접관에게 끊임없이 질문 필요
  • 실제 실행되는 수준의 정확한 구현 요구
  • 평가 요소
    1. 문제해결
    2. 코딩
    3. 검증
    4. 커뮤니케이션
  • 수도코드(Pseudocode) 사용

 


2장 프로그래밍 언어 선택

1) 코딩 테스트 중심 파이썬 특징

  • 루프
    • range() 사용
    • 한 줄 처리가 가능하지만 가독성 주의
# 예시 1
sum = 0
for i in range(1,10 + 1):
	sum += i
    
# 예시 2
sum = sum( i for in range(1, 10 + 1))

# 예시 3
sum = sum(range(1, 10+1))​
  • 제네릭 프로그래밍
    • 파라미터 타입이 나중에 지정되어 재활용성을 높이는 프로그래밍
    • 파이썬은 동적 타이핑(Dynamic Typing) 언어이므로 제네릭이 필요없음
    • 코드의 복잡도가 높아질수록 혼란을 가중
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)
  • 배열 반복
    • 자료형 선언이 필요 없으므로 매우 간결
      ex. Java의 foreach
    • 지나친 간결함이 코드의 복잡도에 따라 가독성을 낮춤
// Java
String[] foo = new String[]("A", "B", "C");
for (String f : foo){
	System.out.println(f);
}​
# Python
foo = ['A', 'B', 'C']
for f in foo:
	print(f)​
  • 구조체
    • Python 3.7+부터 Decoration(Annotation)으로 타입 힌트와 함께 class를 구조체 형태로 정의
    • 이렇게 선언할 경우
      1) 초기화 함수를 사용할 수 있음
      2) 읽기 쉬운 포맷으로 출력 가능
# Python 3.7+
from dataclasses import dataclass

@dataclass
class Product:
    weight: int = None
    price: float = None
    
apple = Product()
apple.price = 10​
  • 클래스
    • 코딩 테스트에서는 클래스를 많이 사용하지 않음
    • dataclass decoration을 이용해 class 선언
      - dataclass 선언 없이 클래스 구현 가능
      - dataclass 선언시 여러 가지 내부 함수의 기능이 자동으로 구현
from dataclasses import dataclass

@dataclass
class Rectangle:
    width: int
    hegith: int

def area(self):
    return self.width * self.height

rect = Rectangle(3, 4)
print(rect.area())​

※ 제너릭 / 구조체 / 클래스

※ 코드의 복잡도에 따라 가독성이 떨어질 수 있음

2) 코딩테스트 중심 파이썬의 장단점

  • 면접관이 쉽게 이해할 수 있는가?
    - 쉬워서 익숙하지 않은 사람도 간단한 문법만 알려주면 금방 이해할 수 있음
    - pseudo code 포맷으로도 사용 가능
  • 코딩 플랫폼에서 지원하는가?
    - 일부 기업에서 제한하는 경우가 있음
  • 유연한 언어인가?
    - 정적 타이핑 언어는 알고리즘을 빠르게 구현해야하는 환경에서 생산성을 저해하는 요인
    - 파이썬은 동적 타이핑 언어
    - 그러나 가급적 구현 후 잘못 선언한 변수나 사용하지 않는 변수를 검토할 것 (실무에서도 좋은 습관)
  • 언어 레벨에서 풍부한 기능을 지원하는가?
    - 코딩 테스트는 외부 라이브러리를 전혀 사용할 수 없음
    - C 같은 경우, 모든 자료구조를 직접 구현해야하기 때문에 불리함
    - 파이썬은 언어 레벨에서 이미 풍부한 기능을 내장하고 있음
    - 이 때문에 일부 기업에서 파이썬으로 코딩 테스트를 제한함

※ 알고리즘을 빠르게 구현해야하는 코딩 테스트 측면에서는 동적 타이핑 언어인 파이썬의 생산성이 비교적 더 높음