Python 유용한 함수, 라이브러리들

한민규·2025년 8월 3일

알고리즘

목록 보기
5/7

라이브러리 정리

import sys
import math
import heapq
import collections
import itertools
import bisect
import random

sys.stdin.readline() 간략화

import sys
input = sys.stdin.readline
n = input() # sys.stdin.readline 써짐
  • sys.stdin.readline()은 줄바꿈 문자 \n이 문자열 끝에 포함됨
if s == "hello":      #  "hello\n" 이라서 조건 실패 -> 대참사

strip()함수로 양쪽 공백 & \n 제거해줄 수 있음

몇문제 풀어보자

https://www.acmicpc.net/problem/25305

n,k = map(int, input().split())
arr = list(map(int, input().split()))
arr.sort(reverse=True)
print(arr[k-1])

막힌 부분
n,k는 변수로 각각 split해서 들어가니까 list(map())을 해줄 필요가 없었는데 arr은 list로 써서
sort를 써야하기 때문에 list화를 해줘야함

  • sort에서 reversed -> reverse임

https://www.acmicpc.net/problem/1546

import sys

n = int(sys.stdin.readline())
arr = list(map(int, sys.stdin.readline().split()))
m = max(arr)
for i in range(n):
    arr[i] = arr[i] / m*100
avg = 0
for i in range(n):
    avg += arr[i]
avg /= len(arr)
print(avg)

막힌 부분
for i in arr: <- 원본 수정이 안됨
i는 arr의 값 복사본임 -> 수정해도 arr에 영향 없음

원본 배열 수정하려면? for i in range(len(arr))으로 쓰고 i를 idx값으로 사용

arr.count(2) : 2가 몇번 나왔는지 세워줌(문자열도 됨)
arr.max() -> X, max(arr) -> O

avg = 0 # 이걸로 초기화를 안하면 NameError 발생
for i in range(len(arr)):
avg += arr[i]

계산식 오류
arr[i] = arr[i] / m 100 # 정답
arr[i] /= m
100 # 잘못된 계산
이유 : 연산자 우선순위 때문에 m*100이 먼저 계산됨 -> arr[i] / m을 먼저 해야함

sum(arr) -> 리스트 합
len(arr) -> 리스트 길이
avg = sum(arr) / len(arr)

https://www.acmicpc.net/problem/10409

import sys
# n = 일의 개수, t = 분
n,t = map(int, sys.stdin.readline().split())
arr = list(map(int, sys.stdin.readline().split()))

time = 0
count = 0;
for i in range(n):
    time += arr[i]
    count += 1
    if(time > t):
        time -= arr[i]
        count -= 1;
        break
print(count)

막힌 부분
range() 요소 start는 안쓰면 0이지 1이 아님 step은 1,

FCFS 문제에서 한 작업 더 실행되는 문제
숫자가 1 더 크게 나옴 -> 넘치는 시간이랑 카운트를 다시 빼줘서 해결

  • n = int(sys.stdin.readline())
  • n,m = map(int, sys.stdin.readline().split())
    두개부터 map() 사용

https://www.acmicpc.net/problem/5789

import sys
n = int(sys.stdin.readline())
for i in range(n):
    arr = sys.stdin.readline()
    length = len(arr)
    left_idx = length // 2 -1
    right_idx = length // 2
    #print(f"left_idx = {left_idx}, right_idx = {right_idx}")
    if(arr[left_idx] == arr[right_idx]):
        print("Do-it")
    else:
        print("Do-it-Not")

막힌 부분
/ 연산자는 항상 실수 반환 4.0,, 그래서 //연산자로 수정
01010101 일때 대충 봐서 0 1 0 1 0 1 0 1라고 보고 숫자 배열로 풀어서 문자 배열로 수정

https://www.acmicpc.net/problem/20053

import sys
li = sys.stdin.readline
t = int(li())

for i in range(t):
    n = int(li())
    arr = list(map(int,li().split()))
    print(min(arr), max(arr))

막힌 부분
sys.stdin.readline 간략화하려다가 ()차이로 오류난거 수정

https://www.acmicpc.net/problem/10822

import sys
li = sys.stdin.readline
a = li().strip()
a = list(map(int, a.split(",")))
print(sum(a))

막힌 부분
10,20,30,50,100
이 형식이니까 ,기준으로 split해야하는데 그냥 split() <- 공백기준으로 나누기 때문에 틀렸음

https://www.acmicpc.net/problem/4344

import sys
li = sys.stdin.readline
c = int(li())
for i in range(c):
    arr = list(map(int, li().split()))
    n = arr[0]
    arr.pop(0)
    avg = sum(arr) / len(arr)
    avg_person_count = 0
    for i in arr:
        if(avg < i):
            avg_person_count += 1
    ans = (avg_person_count / n) * 100
    print(f"{ans:.3f}%")

막힌 부분
비율 공식

소수점
print(f"{ans:.3f}%")
ans <- 변수
:.3f <- 소수점 아래 3자리까지

유용한 것들

any(조건 for 변수 in 반복가능한객체)

조건이 하나라도 True면 → any() 전체가 True 반환

전부 False면 → False 반환

0개의 댓글