하나의 문제를 여러가지 알고리즘을 통해서 풀 수 있다. 중요한 것은 문제를 가장 효율적으로 푸는 알고리즘이 무엇인가이다.
여기에서 출발한 개념이 알고리즘의 복잡도이다. 시간복잡도와 공간복잡도는 알고리즘을 평가하는 척도로써 사용된다.
내가 할줄 아는 컴퓨터 언어는 C와 JS가 있다. NodeJS와 JS를 엄격하게 구분지어야 한다면 그 중 NodeJS일거다.
학부생때 자료구조와 알고리즘을 C로 공부한적이 있기에 코딩테스트 언어에서는 배제하였다. 공부하는 목적에서는 정말 좋았지만 구현에 있어서는 그다지 좋은 기억이 되질 못했다. JS가 나의 첫 객체언어였는데 C만 하던 나에게 이렇게 코딩을 편하게 해도 되나 싶을정도의 죄책감을 심어주기도 했던것 같다.
알고리즘에 들어가기 앞서 언어의 자료형에 대해서 짚고 넘어가는 시간을 가져보려 하다.
파이썬에는 원시 타입(Primitive Type)이 존재하지 않는다. 객체에 더 중심을 둔 언어로 모든 것이 객체이다. 공식문서에 다음과 같은 말로 설명되어 있다.
All data in a Python program is represented by objects or by relations between object.
현재상황에 제일 좋은 것만 고르는 방법을 Greedy algorithm이라고 한다. 아주 단순하다. 대신 해당 문제가 그래도 되는가에 대한 대답에 예라고 할 수 있어야 한다. 가장 큰 혹은 가장 작은의 단어가 나온다면 한번쯤 Greedy algorithm으로 풀리는 문제인가 고민해볼 가치가 있다. 예시 문제들을 3–1, 3–2..와 같이 이어지는 story에서 풀어보겠다.
속이 상하는 일이 있다. 처음으로 알고리즘 테스트를 실행해보았는데 공부했던 Python보다는 JS로 문제를 풀고 있는 나를 발견할 수 있었다.
시험이 끝나고 이 상황에 빗댈만한 것이 생각이 났다. 비록 영어를 10년을 넘게 배웠어도 위급한 상황이 닥치면 Help me 보다는 살려주세요를 외친다는 사실을.
따라서 급하게 Python을 적용하기 보다는 비록 지금 구매한 책들은 Python으로 알고리즘 테스트를 기술한 책들이지만 개념만을 챙기고 구현은 JS로 하는 노력을…
문제 링크
문제 분석:이 문제가 왜 Greedy algorithm으로 분류되었는지 살펴보자. 만약 n=5, lost가 [1, 3]이고 reserve가 [2, 4]이라고 생각해보자. 여벌의 체육복이 있는 2는 1과 3 모두에게 체육복을 빌려줄 수 있다. 체육복을 3에게 빌려주는 경우 여벌의 체육복이 있는 4는 1에게 체육복을 빌려줄 수 없게 되어 체육수업을 들을 수 있는 학생은 총 [2, 3, 4, 5]의 4명이 된다…
웹 서버와 브라우저가 data를 주고받기 위한 프로토콜이다. 80번 port를 사용한다.