코딩일지/TIL: Today I Learned

20220902 TIL

야언 2022. 9. 2. 20:51

오늘의 한 일

  • 파이썬 문법 기초강의 끝까지
  • 백준 알고리즘 문제 풀이 - 반복문, 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

 

15552번: 빠른 A+B

첫 줄에 테스트케이스의 개수 T가 주어진다. T는 최대 1,000,000이다. 다음 T줄에는 각각 두 정수 A와 B가 주어진다. A와 B는 1 이상, 1,000 이하이다.

www.acmicpc.net

 

문제 설명 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에 대해서도 백준 카테고리에 정리해둡시다