다양한 함수

len, sum, max / min, sort/sorted 함수를 배워봅시다.

이번에는 문제를 풀 때 자주 쓰이는 내장 함수 4가지를 배워보겠습니다.

len

len은 문자열, 리스트, 딕셔너리, 셋, 튜플등의 길이 혹은 원소의 개수를 반환해줍니다.

a = 'abcd efgh'
print(len(a)) # 9

b = [1, 2, 3, [4, 5]]
print(len(b)) # 4

c = {'a': 97, 'b': 98, 'c': 99}
print(len(c)) # 3

d = {1, 2, 3, 4, 5, 5, 5}
print(len(d)) # 5

e = ('s','o','f','t','w','a','r','e')
print(len(e)) # 8

len을 사용하는 문제의 유형은 크게 세 가지 유형이 있습니다. 전부 길이나 원소의 개수를 반환하는 기능을 이용하여 푸는 방법인데요. len함수는 다양하게 활용이 가능하기 때문에 유형을 나눠 적는게 이해하시기 편할 것 같아서 3가지로 나누어 보았습니다.

길이의 기능을 하는 len

첫 번째로 단순히 길이 혹은 요소의 개수를 출력할 때 사용할 수 있습니다.

문자열의 길이, 리스트의 길이(혹은 요소의 개수) 이외에도 tuple과 곧 배울 내용인 dict, set에 적용하여 길이나 요소의 개수를 구할 수 있습니다.

arr = [1, 2, 3, 4]
print(len(arr)) # 4를 출력

d = {'a': 97, 'b': 98, 'c': 99}
print(len(d)) # 3을 출력

바로 문제를 풀어보겠습니다.

알파벳으로 이루어진 단어의 길이를 출력하라고 합니다. input()으로 문자열을 받고, len()을 이용하여 길이를 출력해주면 됩니다.

s = input()
print(len(s))

풀어 볼 문제

for문에서 사용하는 len

두 번째로는 for문의 range에 들어가서 사용하는 것입니다.

arr = [1, 2, 3, 4, 5]

이런 코드가 있을 때, arr의 요소를 for문으로 하나하나 출력해본다고 가정해봅시다. 여기서는 arr 요소의 개수가 5이므로 아래와 같이 코드를 작성할 수 있습니다.

arr = [1, 2, 3, 4, 5]
for i in range(5):
    print(arr[i])

이번엔 배열의 값을 직접 입력받아서 출력을 해본다고 가정해봅시다.

arr = list(map(int,input().split()))
for i in range()

코드를 작성해보려고 하니까 arr의 요소의 개수는 입력 값에 따라서 달라져서 함부로 range안에 숫자를 넣을 것 같습니다. 그래서 이용하는 것이 len을 이용하는 것입니다.

arr = list(map(int,input().split()))
for i in range(len(arr)):
    print(arr[i])

이렇게 만들면 arr 요소의 개수가 3개면 len(arr)의 값 3이고, arr의 요소의 개수가 100,000개이면 len(arr)의 값이 100,000이 됩니다. 그래서 요소의 개수에 따라 값이 달라지므로 코드를 구현할 수 있게 됩니다.

문제를 풀어봅시다.

문자열을 입력받아서 문자열 안에 JOI라는 문자열이 있는 개수, IOI라는 문자열이 있는 개수를 구하라고 합니다.

이것은 for문과 문자열의 슬라이싱 기능으로 풀 수 있겠습니다. JOI와 IOI는 세글자이므로 슬라이싱은 [i:i+3]이라고 적으면 되겠네요.

s = input()
JOI, IOI = 0,0
for i in range(len(s)):
    if s[i:i+3] == 'JOI': JOI += 1
    if s[i:i+3] == 'IOI': IOI += 1
print(JOI)
print(IOI)

풀어볼 문제

인덱싱에서 이용하는 len

세 번째로는 index 기능을 이용하여 뒤에 있는 값들을 확인할 수 있습니다. 보통 len()함수에 1을 빼주어서 마지막 값을 확인하는데 쓰이거나, 더 뒤에 있는 값을 확인하는데 쓰입니다.

이미 우리는 arr[-1], arr[-2]에 대해 배웠는데요. 저는 -1, -2, ... 보다는 arr[len(x) - 1], arr[len(x) - 2], .. 이렇게 쓴 것이 좀 더 이해하기 편해서 len을 사용하여 코드를 작성하는 편입니다.

arr = [1, 2, 3]
print(arr[len(arr)-1])
# 3출력

s = 'abcdefg'
print(s[len(s)-1]) # g출력

바로 문제를 풀어봅시다.

일단 for문을 이용하여 입력 받는 코드를 짜봅시다.

t = int(input())
for i in range(t):
    s = input()

len(s)는 s의 길이를 출력하므로 위에서 언급한대로 s[len(s)-1]을 사용하면 마지막 글자가 나옵니다.

왜 len(s)-1이 s의 마지막 값인지 직접 예제 1에 나온 입력 값을 통하여 살펴봅시다.

입력 값
ACDKJFOWIEGHE
문자의 길이 = 13
index
0 = A
1 = C
2 = D
3 = K
4 = J
5 = F
6 = O
7 = W
8 = I
9 = E
10 = G
11 = H
12 = E
len(s) - 1 = 12 로 E를 가르키고 있음 

문제에서 첫 글자와 마지막 글자를 출력하라고 했으니 s[0]과 s[len(s)-1]을 사용하면 됩니다.

t = int(input())
for i in range(t):
    s = input()
    print(s[0]+s[len(s)-1])

하지만 우리는 이미 -1로 출력하는 방법을 배웠으니 s[-1]로 출력해도 상관없습니다.

t = int(input())
for i in range(t):
    s = input()
    print(s[0]+s[-1])

sort / sorted

정렬

sort와 sorted는 오름차순으로 정렬하는 기능을 하는 메소드와 함수입니다.

  • 오름차순: [1, 2, 3, 4, 5], [1, 1, 1, 2, 2]

  • 내림차순: [10, 8, 6, 4, 2], [9, 9, 9, 9, 9]

sort는 list에만 사용할 수 있는 메소드이고, sorted는 list, tuple 그리고 곧 배울 dict, dict_keys등등의 다양한 자료구조와 클래스들에서 사용 가능한 함수입니다.

요소의 값들은 숫자, 문자, 리스트 등등 어떠한 값이 들어와도 상관없지만, 요소들은 전부 같은 자료형이어야 합니다.

arr = [9, 8, 'a', 5, 4]
arr = [[1, 2], 4, 6, 10, '파이썬']
print(sorted(arr))

이렇게 되어있으면 정렬을 할 수 없다는 것이죠. 코드를 실행해보면 아래처럼 오류가 나오게 됩니다. 내용은 int와 list는 서로 비교할 수 없다는 오류입니다.

그래서 같은 자료형만 들어갈 수 있는데, 이때 값이 숫자, 문자열, 자료구조에 따라 정렬 기준이 각각 달라집니다.

  • 숫자: 오름차순이므로 숫자가 작은 순서대로 나옴

  • 문자열: 가장 왼쪽 글자부터 훑으면서 아스키코드가 작은 순서대로 정렬함. 그래서 'bear', 'cat'을 정렬해보면 'bear'의 문자열의 길이가 더 길어도 'cat'보다 앞에 옴

  • 자료구조: 먼저 자료구조의 길이가 짧은 순으로 정렬하고, 그다음 길이가 같으면 요소의 자료형에 따라 숫자, 문자의 정렬 기준으로 정렬함

이렇게 글만 보면 잘 이해가 안될 텐데, 직접 여러 가지 값을 넣어보면서 확인하시면 됩니다.

참고로 정렬은 bubble sort, selection sort, merge sort, insertion sort, quick sort 등등 여러 가지 정렬 방법이 있는데요. 파이썬에서 사용한 정렬은 merge sort와 insertion sort를 합친 timsort를 사용하고 있습니다. C++에서 사용하는 정렬은 quick sort를 사용하고 있습니다.

아마 학과에 따라 배우는 내용이 좀 다를 텐데, 제 기준으로는 컴퓨터프로그래밍 수업에서 exchange sort, bubble sort, selection sort를 배웠었습니다. 알고리즘에서는 직접 정렬하는 방법이 거의 쓰이지 않지만, 정렬을 어떻게 하는지 나중에 수업 시간에 직접 코딩해보면 좋은 기회가 될 것 같습니다.

sort

sort는 리스트만 사용할 수 있는 메소드입니다. list.sort()로 입력해주면 정렬을 해줍니다. print(arr.sort())를 하면 None을 출력하므로 주의해주세요.

arr = [5, 4, 1, 3, 2]
arr.sort()
print(arr)
# [1, 2, 3, 4, 5]

arr = ['x', 'B', 'E', 'v']
arr.sort()
print(arr)
# ['B', 'E', 'v', 'x']

arr = [[1, 2, 3], [1], [], [1, 3, 5, 7]]
arr.sort()
print(arr)
# [[], [1], [1, 2, 3], [1, 3, 5, 7]]

sorted

sorted는 많은 자료구조에서 사용할 수 있는 함수입니다. sort와 다르게 print(sorted(arr))을 하면 정상적으로 정렬된 값이 출력됩니다. 대신 배열을 정렬된 배열로 바꾸고 싶다면 arr = sorted(arr)로 변경해주어야 합니다.

arr = [10, 8, 6, 4, 2]
arr = sorted(arr)
print(arr)
# [2, 4, 6, 8, 10]

arr = ['b','a','d','c']
print(sorted(arr)) # ['a','b','c','d']
print(arr) #['b','a','d','c']

sort와 sorted에는 reverse인자가 있는데요. 이것은 단어 뜻대로 정렬되는 값을 반대로 뒤집어주는 인자입니다. 그래서 내림차순으로 표현할 수도 있습니다.

arr = [2, 3, 1]
arr.sort(reverse = True)
print(arr)
# [3, 2, 1]


arr = [-1, -4, -2, -3, -5]
print(sorted(arr, reverse = True))
# [ -1, -2, -3, -4, -5]

이제 문제를 풀어볼텐데 sort를 이용한 문제 하나, sorted를 이용한 문제 하나를 풀어보겠습니다.

입력 값을 받고 정렬하여 마지막 값을 출력하는 문제입니다. 바로 sort를 사용해봅시다.

n = int(input())
A = list(map(int,input().split()))
A.sort()
print(A[len(A)-1]) #혹은 A[-1]

또 다른 문제를 풀어봅시다.

점수를 입력 받고, 정렬을 하여 홍익이의 학점을 출력하는 문제입니다.

일단 입력 값을 받고 sorted로 정렬을 하겠습니다.

arr = list(map(int,input().split()))
score = int(input())
arr = sorted(arr)

이제 for문과 if문을 이용하여 순위를 구합니다. 순위는 오름차순으로 되어 있으므로 가장 첫번째 값이 꼴찌가 됩니다. 그러므로 같은 점수가 나올 경우에는 rank = len(arr) - i로 적으면 등수를 구할 수 있습니다.

arr = list(map(int,input().split()))
score = int(input())
arr = sorted(arr)

rank = 0
for i in range(len(arr)):
    if arr[i] == score: rank = len(arr) - i

이제 if / elif / else문으로 문제를 출력하면 되겠습니다.

arr = list(map(int,input().split()))
score = int(input())
arr = sorted(arr)

rank = 0
for i in range(len(arr)):
    if arr[i] == score: rank = len(arr) - i

if rank <= 5: print('A+')
elif rank <= 15: print('A0')
elif rank <= 30: print('B+')
elif rank <= 35: print('B0')
elif rank <= 45: print('C+')
elif rank <= 48: print('C0')
else:print('F')

풀어볼 문제

  • https://www.acmicpc.net/problem/11931 우리는 지금까지 오름차순, 내림차순에 대해서만 배웠는데요. 무조건 오름차순, 내림차순으로만 정렬할 수 있는 것은 아닙니다. 익명 함수(lambda)라는 것을 이용하여 리스트 안에 있는 숫자 값들의 합에 따라 정렬을 할 수도 있고, 문자열의 길이에 따라 정렬을 할 수도 있고 다양한 기준으로 정렬할 수 있습니다. 이 내용은 나중에 정렬 심화 파트에서 다룰 예정입니다.

여기까지 읽으셨으면 이제 set과 딕셔너리를 배운 이후에 읽으시면 됩니다.

sum

sum()함수는 list, tuple, dict, set, dict_keys등등과 같은 자료형에 요소의 값이 모두 int형일 때 모든 요소의 합을 구할 수 있는 함수입니다. 참고로 dict의 경우에는 key값의 모든 합을 출력합니다.

arr = [1, 2, 3]
print(sum(arr)) # 1 + 2 + 3 = 6을 출력

tup = (10, 9, 8, 7, 6)
print(sum(tup)) # 40을 출력

d = {1 : 'a', 2: [1, 5, 9], 3:'asdf'}
print(sum(d)) # key값은 1, 2, 3이므로 6을 출력

s = { 1, 1, 1, 6, 6, 6, 4, 4, 4, 4 }
print(sum(s)) # { 1, 6, 4 }이므로 11을 출력

알아야 하는 내용은 이게 끝입니다. 바로 문제를 풀어봅시다.

콤마(,) 를 기준으로 숫자를 입력받아 숫자들의 합을 출력하라는 문제입니다. 리스트로 입력을 받고 sum함수를 이용하여 합을 구한 뒤에 출력을 해주면 되겠네요.

D = list(map(int,input().split(',')))
print(sum(D))

min / max

min과 max는 다들 아시는 뜻인데요. min은 최솟값을 구하는 함수이고, max는 최댓값을 구하는 함수입니다.

sum처럼 list, tuple, dict, set, dict_keys등등과 같은 자료형에 요소의 값이 모두 int형일 때, 자료형에 있는 값 중 가장 작은 값과 가장 큰 값을 반환하는 함수입니다. 참고로 dict의 경우에는 key값 중에서 가장 큰 /작은 값을 반환합니다.

arr = [100, 10000, -5, 99, 0]
print(min(arr)) # -5 출력
print(max(arr)) # 10000 출력


t = (-1, -2, -3, -4, -5)
print(min(t)) # -5 출력
print(max(t)) # -1 출력

s = {0, 0, 0, 0}
print(min(s)) # 0 출력
print(max(s)) # 0 출력

별 내용이 없으므로 바로 문제를 풀어봅시다.

값을 입력 받아 최솟값과 최댓값을 구하는 문제입니다. 그냥 리스트에 min, max를 감싸주어 출력하면 됩니다.

n = int(input())
arr = list(map(int,input().split()))
print(min(arr),max(arr))

Last updated