파이썬 알고리즘 인터뷰
📚📚📚👈🏻 책 구매 링크
🤴🏻👸🏻👵🏻👴🏻 👈🏻 소스코드 깃허브
😥😱🤪👈🏻 책 정오표
🏓📡📺 👈🏻 유투브 채널
코딩 테스트 언어 선택
오프라인 화이트보드 코딩 인터뷰의 경우, 면접에서 실제 실행되는 언어로 코딩을 하기가 불가능하다.
일정한 규칙을 준수하는 코딩 체계를 보여주는 형식이 필요하다.
컴퓨터 프로그램의 작동 원리 또는 알고리즘을 형식이 정해져 있지 않은 고차원 언어로 기술한 것을 수도코드라 한다.(Pseudocode)수도코드는 대게는 일정한 규칙을 준수하지만 기계가 판독하려는 용도가 아닌, 사람이 쉽게 알아볼 수 있는 형태로 기술한다. 순서도를 활용해서 표현이 가능하지만, 수도코드를 활용하면 더 다양한 알고리즘을 표현할 수 있다.
합격자 언어도 C++이 가장 많았지만(25%), 코드의 길이가 가장 긴 것도 C++이었다.
파이썬의 합격자(24%)는 코드의 길이에 비해 합격자 비중이 훨씬 효율적이다.
코드의 길이, 합격자 비율을 봤을 때 파이썬을 사용하는 것이 유리하다.
각 언어별 루프 사용법 비교
// C++
int sum = 0;
for(int i = 1; i<=10; i++){
sum += i;
}
// Java
int sum = 0;
for(int i = 1; i<=10; i++){
sum+=i;
}
String[] foo = new String[]{"A", "B", "C"};
for ( String f : foo){
System.out.println(f);
}
# Python
sum = 0
for i in range(1, 10+1):
sum += i
sum = sum(i for i in range(1, 10+1))
sum = sum(range(1, 10+1))
foo = ['A', 'B','C']
for f in foo:
print(f)
// Go
var sum int = 0
for i := 1; i<=10; i++{
sum+=i
}
//Go 의 경우 변수 할당시 :=을 사용한다. 문장 말미에 ;을 사용안한다.
제너릭 프로그래밍
Generic 이란 파라미터의 타입이 나중에 지정되게 해서 재활용성을 높일 수 있는 프로그래밍 스타일로서, 1989년 데이비드 무저와 알렉산더 프테파노프가 고안했다.
각 언어에는 제네릭 프로그래밍의 문법이 사용될 수 있다. 나는 파이썬을 사용하므로, 자바와 파이썬만 기록한다.
# Python
def are_equal(a,b):
return a==b
are_equal(10,10.0)
파이썬은 Dynamic Typing 동적 타이핑 언어이기 때문에 제네릭이 필요 없다. 하지만 타입을 아예 명시하지 않으면 가독성을 낮추고 버그 발생률이 높아진다. 따라서 다음과 같이 제너릭 표현을 사용할 수 있다.
# 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)
// Java
public static<T, U> boolean are_equal( T a , U b){
return a==b;
}
are_equal(10,10.0);
자바에서는 제너릭 표현이 가능하지만, 파이썬에서는 3.5 버전 부터 사용이 가능하게 되어있다.
PEP 484 에 추가되었다. ( Python Enhancement Proposals) - 이를 활용하면, 버그 발생률도 줄일 수 있다.
구조체
C에서 구조체 Struct 는 특별한 의미가 있다. 순차적으로 메모리를 할당하는 배열과 달리 구조체는 메모리의 어느 영역에나 어떤 크기로든 할당 할 수 있다. 사실상 유일한 복합 자료형이다.
C++ , Java의 코드를 보면 무슨 형태인지 감이 온다.
// C++
struct Product[
int weight;
double price;
};
Product apple;
apple.price = 10;
// Java
class Product{
private int weight;
private double price;
public void setPrice(double price){
this.price = price;
}
}
Product apple = new Product();
apple.setPrice(10);
구조체는 내가 원하는 형태로 변수를 구성하고 원하는 형태로 할당하는 느낌이다. 자바는 더 이상 구조체를 지원하지 않지만, 위와 같이 클래스만 지원하고 있다.
파이썬에서는 구조체가 없다. 클래스 또한 데이터 타입을 지정할 수 없다.
이를 사용하려면? 네임트 튜플 Named Tuple을 활용해야한다.
# Python
from collections import namedtuple
MyStruct = namedtuple("MyStruct", "field1 field2 field3")
m = MyStruct("foo", "bar", "baz")
파이썬 3.7 부터는 Data Class 를 지원하며 , @dataclass 데코레이션 Decoration(자바에서는 annotation이라 부르는 것)으로 타입 힌트와 함께 활용.
다음과 같이 Class를 이용해 구조체 형태를 정의 할 수는 있다.
# Python 3.7 +
from dataclasses import dataclass
@dataclass
class Product:
weight: int = None
price: float = None
apple = Product()
apple.price = 10
cmd 창에서 현재 파이썬 버전을 확인해보자.
cmd창을 연다.
python --version 을 친다.
Go는 제너릭은 제공하지 않지만, 구조체는 제공한다. (화자는 고급 C 언어 같다고 한다.)
클래스
실무에서는 하상 쓰이지만 코테에서는 클래스까지 사용할 일은 거의 없다.
대표적인 자바와 파이썬만 표기한다.
// Java
class Rectangle{
int width;
int height;
public Rectangle(int width, int height){
this.width = width;
this.height = height;
}
public int area(){
return this.width * this.height;
}
}
Rectangle rect = new Rectangle(3,4);
System.out.println(rect.area());
# Python
from dataclasses import dataclass
@dataclass
class Rectangle:
width: int
height: int
def area(self):
return self.width * self.height
rect = Rectangle(3,4)
print(rect.area())
굳이 dataclass를 사용안해도 클래스 선언이 되긴한다.
Go의 경우 클래스가 없다.
언어 | 루프 | 제네릭프로그래밍 | 배열반복 | 구조체 | 클래스 |
C++ | B | A | B | A | B |
Java | B | A | B | B | A |
Python | A | B | A | B | B |
Go | B | F | B | A | C |
TypeScript | B | A | B | A | A |
왜 파이썬을 써야하는가.
쉽다.
화이트보드 코딩 테스트에서도 수도코드 포맷으로 써도 좋다.
어렵지 않게 이해가 된다.
유연하다.
풍부한 라이브러리를 내장하고 있다.
'Algorithm > Algorithm' 카테고리의 다른 글
🧩 코딩 테스트 정복기 @21#B*03 (0) | 2021.01.29 |
---|---|
🧩 코딩 테스트 정복기 @21#B*01 (0) | 2021.01.28 |
😵 백준 9184번 신나는 함수 실행 풀이 ( Dynamic Programming, Memoization) (0) | 2021.01.26 |