파이썬 - 코딩테스트에서 자주 사용되는 표현

‎육란·2023년 10월 9일

파이썬 알고리즘

목록 보기
5/8


오늘은 파이썬으로 코딩테스트 문제를 풀어가면서 파이썬 코딩테스트를 위해 알아야 할 기본 개념, 문법들을 정리하도록 하겠다.


코딩테스트를 풀며 자주 사용하거나, 다른 사람들의 풀이를 보고 알게 된 것들을 정리하였다.
또한 '파이썬 알고리즘 인터뷰' 교재에서도 알게된 유용한 것들을 정리하였다.


코딩테스트 문제는 주로 백준, 프로그래머스를 이용하였다.



입력 받기


파이썬에서 콘솔에서 입력 받는 방식이 내가 해오던 java의 방식과 많이 달라서 초반에 꽤 애를 먹었다.

기본적으로 파이썬에서 입력은 input()으로 받는다.
그러나 input()은 기본적으로 문자열로 입력을 받는다.


코딩테스트 문제에서는 정수로 입력을 받아야 하거나, 한 줄에 여러 개를 입력 받아서 나눠야 하는 상황이 많았기 때문에 이 부분에 있어서는 다른 방법이 필요했다.

정수 입력 받기


input() 을 이용하여 정수를 입력 받으려면


n = int(input())

앞에 int() 함수를 사용하면 된다.


n = input()
n = int(n)

이처럼 따로 작성해도 되지만, 나는 한 번에 작성하는 방법이 더 편리해서 그렇게 사용하고 있다.


리스트 입력 받기


한 줄에 여러개의 원소를 입력 받아 리스트로 만들고 싶다면, split() 함수를 사용하면 된다.


a = input().split()

정수 리스트 입력 받아서 나누기


리스트의 형태로 입력을 받아서 리스트로 놔두지 않고, 여러 개의 정수 원소로 나누려면 어떻게 해야 할까?


아까 리스트를 받은 형태에서 int() 함수를 사용해야 하는데, 여러 개의 원소에 모두 int() 함수를 적용해야 하므로 map() 을 이용하면 된다.


a, b = map(int, input().split())

map() 은 각각의 요소에 같은 함수를 적용해주므로 위와 같이 사용할 때 편리하다.


sys 모듈 사용하기


파이썬의 단점은 시간 초과가 아주 잘 난다는 것이다.
그래서 효율적인 코드를 짜는 것이 아주 중요하다.


그런데 단순히 입력을 받는 데에서 시간을 줄일 수 있다.

바로 sys 모듈을 사용하는 것이다.


import sys
list.append(int(sys.stdin.readline()))

sys 모듈의 sys.stdin.readline() 함수를 사용하면 input() 으로 입력 받는 거에 비해 불필요한 연산을 줄여 소요 시간이 많이 줄어든다.


sys 모듈도 input() 함수와 마찬가지로 split() 함수를 사용할 수 있다.


import sys
num1 = set(sys.stdin.readline().split())

위 함수에서는 입력을 받아 split() 으로 나누고, 집합 set 으로 만들어서 저장하고 있다.


list 보다 set이 시간 복잡도가 더 낮다.
따라서 소요 시간을 줄여야 할 때는 필요에 따라 리스트 대신 집합을 사용하면 좋다.



출력하기


리스트 언패킹해서 출력하기


파이썬에서 리스트를 출력하게 되면 대괄호 [] 와 함께 출력이 된다.
이 대괄호와 함께 출력하고 싶지 않다면, for문 을 이용하여 원소를 하나하나 꺼낼 수도 있지만, 한 번에 언패킹하는 방법이 있다.


print(*list)

위와 같이 리스트의 앞에 별 `*` 을 함께 출력하면 대괄호 없이 원소만 출력할 수 있다.

end 매개변수


파이썬의 print() 함수는 기본적으로 줄바꿈 문자 '\n'를 포함하고 있다.

end 매개변수를 이용하면 출력 끝에 어떤 문자를 사용할지 지정할 수 있다.


print("Hello", end=", ")
print("World")
# 출력: "Hello, World"

end 매개변수는 기본적으로 '\n'로 설정이 되어있는데, 위 코드에서는 end 를 ", " 로 바꿈으로써 줄바꿈을 하지 않고 문자열 사이에 쉼표를 삽입하였다.


sep 매개변수


여러 개의 인자를 print() 함수로 출력할 때, 기본적으로는 공백 문자로 구분된다.
sep 매개변수를 사용하여 각 인자 사이에 원하는 구분자를 지정할 수 있다.


print("apple", "banana", "cherry", sep=", ")
# 출력: "apple, banana, cherry"

sep 매개변수는 기본적으로 공백 " "으로 설정이 되어있는데, 위 코드에서 sep 을 ", "로 바꿈으로써 공백 대신 쉼표와 공백이 문자 사이사이에 삽입되었다.



key 이용하기


key는 말그대로 열쇠로, 주로 sorted(), max(), min() 함수 등과 같이 사용된다.
key 는 lambda 함수식과 함께 사용되는 경우가 많다.


sorted와 key 이용하기


sorted 는 정렬하는 함수이다. 이 때 key를 함께 사용하면 어떤 기준으로 정렬을 할 지 정할 수 있다.


return sorted(strings, key=lambda x: (x[n], x))

위 코드에서는 정렬된 strings 리스트를 리턴하고 있다.
정렬의 기준은 lambda x: (x[n], x) 이다.

이는 정렬을 x의 인덱스 n의 원소를 기준으로 정렬하겠다는 의미이다.
또한 x[n] 이 같을 때는 x를 기준으로 정렬하겠다는 의미이다.


sort와 key 이용하기


sort 는 sorted 함수와 역할은 같지만, 리턴하는 것 없이 리스트 그 자체를 바꿔준다.


letters.sort(key=lambda x: (x.split()[1:], x.split()[0]))

위 코드에서는 sort로 정렬을 할 때 key로 문자열 [1:]을 사용하여 정렬하며, 동일한 경우 후순위로 [0]을 사용한다.


max와 key 이용하기


max() 함수와 key 를 함께 사용하여 최댓값을 구하는 기준을 정할 수 있다.


max_item = max(my_list, key=lambda x: x[1])

위 코드에서 key는 lambda x: x[1] 이다. 이는 x의 인덱스 1의 원소가 최대를 구하는 기준이라는 의미이다.


min과 key 이용하기


max() 함수와 마찬가지로 min() 함수도 key 를 사용하여 최솟값을 구하는 기준을 정할 수 있다.


min_item = min(my_list, key=lambda x: x[0])

위 코드에서는 x[0]을 기준으로 최솟값을 구하고 있다.


lambda 표현식


lambda 함수는 익숙하지 않아서 아직 잘 활용하지 못하고 있다.
그러나 아주 편리하고 코드가 깔끔해지기 때문에 연습해서 잘 사용하고 싶다.


tuple을 반환하는 lambda


위에서 key 를 살펴볼 때 나왔던 lambda 표현식을 다시 한 번 살펴보겠다.


return sorted(strings, key=lambda x: (x[n], x))

위 람다 표현식은 x를 받아서 x[n], x 두 개의 원소를 반환하고 있다.
파이썬에서는 두 개 이상의 원소를 리턴하는 것이 가능하다.


lambda로 숫자 나누기


이번에는 lambda 를 사용하여 x에 동일한 계산을 취해보겠다.


n_score = list(map(lambda x: x / m * 100, score))

위 코드는 map() 함수를 사용하여 score 리스트에 동일한 lambda 함수를 적용하여 리스트 형태로 만들어 n_score 로 저장하고 있다.

lambda 함수에서는 우선 x를 받아서, x를 m으로 나누고 100을 곱하는 연산을 취해 리턴하고 있다.



list 사용하기


list는 파이썬에서 굉장히 많이 사용되기 때문에, list 를 다루는 법을 잘 익혀두는 것이 좋다.


list에 원소 추가하기


list에 원소를 추가할 때는 append() 함수를 사용한다.


list.append(n)

append() 의 괄호 안에 추가하고 싶은 원소를 작성하면 된다.


list의 원소 제거하기


list 의 원소를 제거할 때는 remove() 함수를 사용할 수 있다.


list.remove(n)

remove() 의 괄호 안에 제거하고 싶은 원소를 작성하면 된다.

또한 del 함수를 이용하여 원소를 제거할 수도 있다.


del my_list[2] 

이는 대괄호 안에 제거하고 싶은 리스트 원소의 인덱스를 작성해 제거하는 방법이다.


list의 원소의 index 사용하기


list의 원소의 인덱스를 가져오고 싶을 땐 index() 함수를 사용한다.


print(list.index(max)+1)

index() 의 괄호 안에 원하는 원소를 입력하면, 해당 원소가 몇 번째 인덱스인지를 리턴해준다.


list의 원소 뒤집기


list 의 원소를 뒤집고 싶을때는 reverse() 함수를 사용한다.


list.reverse()

이렇게 하면 리턴 없이 list 자체를 뒤집어 준다.


list의 이름


그 전에는 list 의 이름을 단순하게 "list"라고 지었었는데, 그렇게 문제를 풀다 보니 오류가 생겼다.
이렇게 list를 생성하면 list를 또다른 함수로 인식하여 나중에 다른 리스트를 생성할 때 typeErrorr 가 발생했기 때문이다.


list = list(sys.stdin.readline().split()) # 이렇게 하면 나중에 typeError
my_list = list(sys.stdin.readline().split()) # 이렇게 하는 게 안전

따라서 list 의 명명을 할 때는 "list"가 아닌 다른 이름으로 사용하도록 하자.



반복문


반복문 작성하기


파이썬에서 반복문을 사용할 때는 반복할 원소와, 반복할 횟수가 필요하다.


for i in range(5):
	print(i)

그러나 위 코드와 달리 반복하는 i가 반복문에 아무런 영향도 끼치지 않을 때,
주로 _ 기호를 사용해서 반복한다.


for _ in range(5):
	sum += 1

위와 같이 작성하면 반복을 하는 요소가 중요하지 않다는 것을 한 눈에 알 수 있어서 편리하다.


list 반복하기


파이썬의 for 반복문에서는 리스트의 원소를 돌기 쉽다.


for i in arr:
	print(i)

그렇다면 리스트의 길이만큼 반복하려면 어떻게 해야 될까?


for i in len(arr):
	print(i)

처음에는 위와 같은 코드로 작성하였으나, 틀린 코드였다.

리스트의 길이만큼 반복하려면 range() 함수를 사용해주어야 한다.


for i in range(len(arr)):
	print(i)

이렇게 해야 i가 0부터 arr의 길이 전까지 요소를 반복한다.



조건문


포함 관계 조건


if문 의 조건에서 어떤 원소가 해당 리스트에 들어있는지 쉽게 알 수 있는 방법이 있다.
바로 in 을 사용하는 것이다.


for i in num2:
    if i in num1: #if 문에서 in을 사용해 포함돼있는지 확인 가능
        print(1)
    else:
        print(0)

위 코드에서 원소 i가 리스트 num2 를 순회할 때, i가 num1 리스트에 있는지 없는지 판단할 수 있는 if문을 작성하고 있다.


isalnum() 영문자, 숫자 여부 판별


isalnum() 함수를 사용하여 영문자, 숫자 여부를 판별할 수 있다.
대소문자를 구분하지 않는다.


strs = []
for char in s:
	if char.isalnum():
    	strs.append(char.lower())

위 코드는 s 안의 char이 영문자, 숫자에 해당한다면 strs 리스트에 소문자로 추가하는 함수이다.


isdigit() 숫자 여부 판별


isdigit() 함수를 사용하여 숫자 여부를 판별할 수 있다.


if log.split()[1].isdigit():
	digits.append(log)
else:
	letters.append(log)

위 코드에서 숫자로 변환 가능한 로그는 digits에, 그렇지 않는 경우는 letters에 추가된다.

profile
프로그래밍 공부 블로그

0개의 댓글