본문 바로가기
Algorithm

[2022.09.13] 필독! 코딩 테스트 사전 준비 작성 중

by injekim97 2022. 9. 13.
반응형

[2022.09.13] 필독! 코딩 테스트 사전 준비 작성 중

 

 

이번 게시글은 코딩 테스트 준비를 하기에 앞서 개발 언어 및 도구에 대한 설명과  공부 방법에 대해 기재하려고 한다. 

 

 

 

 

개발 언어 및 도구

언어 : 파이썬 (v3.7)

공식 인터프리터 : CPython 

알고리즘 사이트 : LeetCode & Programmers

IDE : 파이참(PyCharm) - 커뮤니티 에디션

https://www.jetbrains.com/ko-kr/pycharm/download/#section=windows

 

다운로드 PyCharm: JetBrains가 만든 전문 개발자용 Python IDE

 

www.jetbrains.com

 

 

 

 

 

 

 

공부 방법

    - 리트코드는 문제 풀이 연습만 가능하기 때문에 추후 취업을 위한 코테 준비는 프로그래머스로 대체한다

    - 알고리즘 문제들을 푼 후 다른 사람들의 풀이 방법을 참고하자(알고리즘, 속도 차이 등)

 

 

 

 

리트코드에서 실행 가능한 코드

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 

 

Leetcode

 

www.youtube.com

 

 

 

-------------------------------------------------------------------------------------------------------------- 

목차

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

 

 

반응형

댓글