오늘의 한 일
- 파이썬 문법 기초강의 끝까지
- 백준 알고리즘 문제 풀이 - 반복문, 1차원 배열
튜플, 집합
튜플 (tuple)
- 튜플은 리스트와 비슷하지만 불변형인 자료형.
a = (1,2,3)
print(a[0])
### 아래와 같은 작업은 불가
a = (1,2,3)
a[0] = 99
- 딕셔너리 대신 리스트와 튜플로 딕셔너리 '비슷하게' 만들어 사용해야 할 때 많이 쓰인다
a_dict = [('bob','24'),('john','29'),('smith','30')]
집합 (set)
- 말 그대로 '집합'을 구현하는 방법 ※ 중복이 제거!!!
a = [1,2,3,4,5,3,4,2,1,2,4,2,3,1,4,1,5,1]
a_set = set(a)
print(a_set)
- 교집합, 합집합, 차집합 구하기
a = ['사과','감','수박','참외','딸기']
b = ['사과','멜론','청포도','토마토','참외']
print(a & b) # 교집합
print(a | b) # 합집합
print(a - b) # 차집합
f-string
- 변수로 더 직관적인 문자열 만들기
scores = [
{'name':'영수','score':70},
{'name':'영희','score':65},
{'name':'기찬','score':75},
{'name':'희수','score':23},
{'name':'서경','score':99},
{'name':'미주','score':100},
{'name':'병태','score':32}
]
for s in scores:
name = s['name']
score = str(s['score'])
print(name,score)
for s in scores:
name = s['name']
score = str(s['score'])
print(name+'는 '+score+'점 입니다')
for s in scores:
name = s['name']
score = str(s['score'])
print(f'{name}은 {score}점입니다') ### f-string으로 깔끔하게
예외처리
try - except 문
- 에러가 있어도 건너뛰게 할 수 있는 방법
people = [
{'name': 'bob', 'age': 20},
{'name': 'carry', 'age': 38},
{'name': 'john', 'age': 7},
{'name': 'smith', 'age': 17},
{'name': 'ben', 'age': 27},
{'name': 'bobby'},
{'name': 'red', 'age': 32},
{'name': 'queen', 'age': 25}
]
for person in people:
try:
if person['age'] > 20:
print (person['name']) ### bobby에서 'age'를 찾지 못해 에러
except:
name = person['name']
print(f'{name} - 에러입니다') ### 에러 프린트후 넘기고 계속 진행
파일 불러오기
예시
- main_test.py
from main_func import *
say_hi()
- main_func.py
def say_hi():
print('안녕!')
코딩 실습중에 줄창 쓰던 from ~~ import다!
한줄의 마법
if문 - 삼항연산자
- (참일때 값) if (조건) else (거짓일 때 값) 으로 3개의 항을 가져 삼항 연산자.
num = 3
if num%2 == 0:
result = "짝수"
else:
result = "홀수"
print(f"{num}은 {result}입니다.")
num = 3
result = "짝수" if num%2 == 0 else "홀수" ### 한 줄로 줄여쓰기!
print(f"{num}은 {result}입니다.")
for문 - 한번에 줄여쓰기
- 예시 - a_list 의 각 요소에 2를 곱한 새로운 리스트를 만들기
a_list = [1, 3, 2, 5, 1, 2]
b_list = []
for a in a_list:
b_list.append(a*2)
print(b_list)
a_list = [1, 3, 2, 5, 1, 2]
b_list = [a*2 for a in a_list] ### 한번에 줄여쓰기!
print(b_list)
map, filter, lambda 식
map - 리스트의 모든 원소를 조작하기 ※ 백준 알고리즘 단골
- 예시) 리스트 조작 연습
people = [
{'name': 'bob', 'age': 20},
{'name': 'carry', 'age': 38},
{'name': 'john', 'age': 7},
{'name': 'smith', 'age': 17},
{'name': 'ben', 'age': 27},
{'name': 'bobby', 'age': 57},
{'name': 'red', 'age': 32},
{'name': 'queen', 'age': 25}
]
## 1차 조작
def check_adult(person):
if person['age'] > 20:
return '성인'
else:
return '청소년'
result = map(check_adult, people)
print(list(result))
## 2차 조작
def check_adult(person):
return '성인' if person['age'] > 20 else '청소년'
result = map(check_adult, people)
print(list(result))
## 3차 조작
result = map(lambda x: ('성인' if x['age'] > 20 else '청소년'), people)
print(list(result))
filter - 리스트의 모든 원소 중 특별한 것만 뽑기
- map과 아주 유사하지만 True인 것들만 뽑기!
result = filter(lambda x: x['age'] > 20, people)
print(list(result))
함수 심화
함수의 매개변수
- 함수에 인수를 넣을 때, 어떤 매개변수에 어떤 값을 넣을지 정해줄 수 있어요. 순서 상관 없음!
def cal(a, b):
return a + 2 * b
print(cal(3, 5)) ### a=3, b=5
print(cal(5, 3)) ### a=5, b=3
print(cal(a=3, b=5)) ### a=3, b=5
print(cal(b=5, a=3)) ### a=3, b=5
- 특정 매개변수에 디폴트 값을 지정해줄 수 있어요.
def cal2(a, b=3): ### b의 디폴트값을 3으로
return a + 2 * b
print(cal2(4)) ### b 미지정시 b = 3
print(cal2(4, 2))
print(cal2(a=6)) ### b 미지정시 b = 3
print(cal2(a=1, b=7))
- 입력값의 개수를 지정하지 않고 모두 받는 방법
def call_names(*args): ### args = arguments, 여러 개의 인수를 하나의 매개변수로 받을 때 사용
for name in args:
print(f'{name}야 밥먹어라~')
call_names('철수','영수','희재')
- 키워드 인수를 여러 개 받는 방법
def get_kwargs(**kwargs):
print(kwargs)
get_kwargs(name='bob')
get_kwargs(name='john', age='27')
클래스
클래스를 언제 사용하는지?
ex) 아주 많은 몬스터들의 hp를 관리하려면?
- 방법1. → 리스트의 순서를 잘 지켜서 각 몬스터들의 hp를 잘 적어둔다.
- 방법2. → 몬스터마다 각자의 hp를 가질 수 있게 한다.
class Monster():
hp = 100
alive = True
def damage(self, attack):
self.hp = self.hp - attack
if self.hp < 0:
self.alive = False
def status_check(self):
if self.alive:
print('살아있다')
else:
print('죽었다')
m = Monster()
m.damage(120)
m2 = Monster()
m2.damage(90)
m.status_check()
m2.status_check()
백준 알고리즘 문제풀이
오늘의 진척도
주말에 지금까지 풀면서 어려웠던 문제들 복습해보고 백준 카테고리에 정리하자!
지금까지 배워온 내용들을 남김없이 발휘해야하는 문제들이였다!
적용시키는 방법을 헤매서 구글링을 통해 이해하게 된 문제들도 다수라서 주말을 이용해 복습해서 진짜 내것으로 만들어야 할 듯!
기억에 남는 문제: 백준 15552번 빠른 A+B
https://www.acmicpc.net/problem/15552
문제 설명 Python을 사용하고 있다면, input 대신 sys.stdin.readline을 사용할 수 있다. 단, 이때는 맨 끝의 개행문자까지 같이 입력받기 때문에 문자열을 저장하고 싶을 경우 .rstrip()을 추가로 해 주는 것이 좋다.
기본적으로 사용하던 input을 그대로 사용한 결과 시간 초과로 오답처리가 되어 sys에 대해 검색해보게 만드는 문제였다.
t_cast = int(input())
for _ in range(t_cast):
a, b = list(map(int, input().split()))
print(a+b) ### 시간 초과!
import sys
t_case = int(input())
for i in range(t_case):
a,b = map(int, sys.stdin.readline().split())
print(a+b)
sys에 대해서도 백준 카테고리에 정리해둡시다