Python 코딩 문제 풀이에 자주 사용하는 나만의 팁

2 minute read

코딩 문제 풀이 시 제가 자주 사용하는 기법을 정리해 보았습니다.

코딩 문제 풀이와 실질적인 프로그래밍은 약간 차이가 있습니다. 그래서 잘 쓰이지 않을 때도 있지만, 코딩 문제 풀이 위해서 꼭 알아두면 좋습니다.

Reversed List

List slice를 사용하여 ‘[::-1]’ 을 사용하면 reverse 된다.

L1 = [1, 2, 3, 4, 5]
print(L1[::-1])
# 출력 : [5, 4, 3, 2, 1]

lambda 함수를 이용한 map과 sort

map의 경우 기존의 리스트를 원하는 형태로 1차 가공할 때 많이 사용 된다.

예를 들어 입력 받은 리스트가 숫자 ‘문자’일 때, 숫자 형으로 일괄적으로 바꾸고 싶을 때 ‘map(int, L1)’식으로 ‘int’ 함수를 변수로 넣어주면 된다. 이 때, `map’은 iterator를 반환하므로 list로 받고 싶으면 전체에 ‘list()’ 해준다.

map에서 함수 받는 자리에 아래처럼 lambda를 사용하면 더 파워풀 하게 사용할 수 있다.

L1 = [1, 2, 3, 4, 5]
L3 = list(map(lambda x: x*3, L1))
print(L3)
# 출력 : [3, 6, 9, 12, 15]

이번에는 lambda를 이용한 정렬이다.

리스트의 정렬에는 ‘sorted()’를 사용하는데, 변수로 ‘key’와 ‘reverse’를 사용할 수 있다.

‘reverse=True’를 줄 경우에 내림차순으로 정렬하게 되며, ‘key’는 쉽게 말해 각 원소의 크고 작음을 판단하는데 기준이 되는 함수라고 생각하면 된다.

아래 리스트 ‘L4’와 같이 ‘tuple’을 원소로 하는 리스트를, 각 tuple의 두번째 값인 문자 순으로 배열하고 싶다면 아래와 같이 사용하면 된다.

L4 = [(1,'A'), (2,'C'), (3, 'AB'), (4, 'Z'), (5, 'D')]
L5 = sorted(L4, key=lambda x: x[1])
print(L5)
#출력 : [(1, 'A'), (3, 'AB'), (2, 'C'), (5, 'D'), (4, 'Z')]

list copy 주의 사항

기존 List를 복사하고 싶을 때, 단순하게 ‘L2 = L1’으로 copy를 만들면 안된다. 이 방법은 리스트가 참조하는 ‘주소’가 같다는 의미가 되어, 아래 예시 처럼 ‘L2.append()’가 원래의 리스트인 L1에도 영향을 주는 것을 볼 수 있다.

L1 = [1, 2, 3]
L2 = L1

L2.append(4)

print(L1)
print(L2)

# 출력 : 
# [1, 2, 3, 4]
# [1, 2, 3, 4]

이 점을 주의하고, copy를 하기 위해서는 아래의 방법을 사용하자

  • L2 = L1.copy()
  • L2 = list(L1)
  • L2 = L1[:]

python으로 코테를 보는데 계속 이 shallow copy 문제가 걸려서 개고생했다. 제발 deepcopy하자…

Note!! print(id(x))로 참조하는 주소값을 확인 할 수 있다.

f- string, format

string을 출력할 때 여러가지 방법이 있다. 그 중 꽤 편한 방법은 "string {}".format(var) 이 방법이라고 생각한다.

문자열 사이사이에 {}를 원하는 개수 만큼 넣고, 나중에 뒤에서 ‘.format()’안에 변수들을 넣어 주면 된다.

형식 지정은 {}안에 ‘:.2f’ 와 같은 형태로 추가하면 된다!

또 다른 방법으로는, 조금 더 읽기 쉬운 형태인 f-string 방법이 있다.

f"string {var}" 형태로, 변수를 넣을 위치에 바로 {}를 사용할 수 있어서 읽기 쉬운 장점이 있다.

형식 지정은 위의 format과 마찬가지로 ‘{var:.2f}’로 넣어주면 된다. (아래 예시 참고)

var = 3.123456
print(f"var = {var:.2f}")

# 출력 : var = 3.12