본문 바로가기

Developer/Algorithm

[코딩테스트] 자바스크립트에서 파이썬으로 바꾸기

이번 하반기를 준비하면서 코테의 중요성을 크게 느낀다. 

그 동안의 주언어를 자바스크립트를 사용하다가 3주 전부터 급하게 파이썬으로 바꿨다.

자바스크립트를 사용하지않는 기업도 있었고 자바스크립트만 사용하는 기업도 있었지만

가장 큰 이유는 제공하는 라이브러리가 파이썬이 많기 때문에 코테 문제를 풀 때 수월하다는 것이다. 

 

예를 들어 순열, 조합을 계산할 때 자바스크립트는 재귀함수로 함수를 만들어야하지만
파이썬은 라이브러리를 통해 한 줄로 작성가능하다. 

 

코테처럼 시간을 중요시하고 경우의 수를 많이 생각하는 부분에서 당연히 파이썬이 유리할 수 밖에 없다는 나의 판단이다(뇌피셜) 

아무튼 학부 때  주언어가 파이썬이었어서 그래도 바꾸는데에 큰 무리는 없었지만 헷갈리기는 했다.
그래서 기본 파이썬 문법들 중 꼭 필요한 것을 여기 정리할 것이다.

( 사실 노션으로 공부를 많이 했는 데 옮겨 정리하는 것 뿐~~~  )

 

파이선 기본 중요 문법

1. map (lambda)

list(map(**lambda** x,y:x**+**y, in1, in2))

2. reduce

from functools import reduce
target = list(range(1, 21))
print(reduce(lambda x, y: x + y, target))

*# 실행 결과: 210*
  1. index
  2. print(a.index(10,2,9)) # index(value, start, end)

📌 람다 (lambda)

기본적 활용

lambda x: int(x)

문자열 변수를 정수형으로 변환.

lambda x,y: x>y

x, y 값을 비교.

lambda x: x['key']

딕셔너리에서 key를 이용해 value를 얻음.

다른 내장함수와의 활용

min, max

# min, max 함수
names = ['Suh', 'Adrian', 'Bill', 'Jonathan']

# longest : 길이가 가장 긴 이름
longest = max(names, key= lambda n: len(n))

print(longest)
# Jonathan

key 를 lambda n: len(n) 로 부여해 가장 길이가 긴 이름을 리턴한다.

sort, filter, map

keys = [{'key': 8}, {'key': 5}, {'key': 9}, {'key': 3}]
# sort 함수
keys.sort(key = lambda x: x['key'])
# [{'key': 3}, {'key': 5}, {'key': 8}, {'key': 9}]

👉 keys 리스트를 내부의 'key' 들의 value를 기준으로 정렬하였다.

# filter 함수
filter(lambda x: x['key']<5, keys)

👉 'key' 들의 value가 5보다 작은 요소들을 가져온다.

# map 함수
map(lambda x: x['key']+5, keys)

👉 모든 'key' 의 value에 5를 더한다.

2. list 원소 삭제

  • del 키워드를 통한 삭제
>>> a = [1, 2, 3, 4, 5, 6, 7]
>>>del a[1]
>>> a
[1, 3, 4, 5, 6, 7]

  • list의 remove메소드에 의한 삭제
  • list.remove(찾을아이템)
  • 찾을 아이템이 없으면 ValueError 발생
>>> a = [1, 2, 3, 4, 5, 6, 7]
>>> a.remove(3)
>>> a
[1, 2, 4, 5, 6, 7]
>>> a.remove(9)
Traceback (most recent call last):
  File "<stdin>", line 1,in <module>
ValueError: list.remove(x): xnotin list

 

 

순열과 조합 with Python

순열

permutation

순열은 순서를 고려하기 때문에 [A, B, C]의 리스트에서 2개의 원소를 골라 순서를 정해 나열하면[(A, B), (A, C), (B, A), (B, C), (C, A), (C, B)] 가 나오게 된다. 즉 순열에서는 (A, B)와 (B, A)는 다른 것이다.

import itertools

arr = ['A', 'B', 'C']
nPr = itertools.permutations(arr, 2)
print(list(nPr))

결과 : [('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'C'), ('C', 'A'), ('C', 'B')]

조합

combination

조합은 순서를 고려하지 않기 때문에 [A, B, C]의 리스트에서 2개의 원소를 골라 나열하면[(A, B), (A, C), (B, C)] 가 나오게 된다. 조합은 (A, B)와 (B, A)는 같은 것으로 취급한다.

import itertools

arr = ['A', 'B', 'C']
nCr = itertools.combinations(arr, 2)
print(list(nCr))

결과 : [('A', 'B'), ('A', 'C'), ('B', 'C')]


이외에 유용한 함수

  1. zip()
    • 동일한 개수로 이루어진 iterable한 객체들을 인수로 받아 묶어서 iterator로 반환
        z = zip([1, 2, 3], ('A', 'B', 'C'))
        print(next(z)) # (1, 'A')
        print(next(z)) # (2, 'B')
        print(next(z)) # (3, 'C')
    
  2. all()
    • iterable한 객체를 인수로 받아서 원소가 모두 참이면 True, 아니면 False를 반환
        a = all([1, 2, 3]) # True
        a = all([0, 1, 2]) # False
    
  3. any()
    • iterable한 객체를 인수로 받아서 원소가 하나라도 참이면 True, 아니면 False를 반환
        a = any([0, 1, 2]) # True
        a = any([0, False, []] # False
    
  4. chain()
    • iterable한 객체들을 인수로 받아 하나의 iterator로 반환
        c1 = [1, 2]
        ca = ['A', 'B']
        c = itertools.chain(c1, ca)
        print(next(c)) # 1
        print(next(c)) # 2
        print(next(c)) # A
        print(next(c)) # B