코딩일지/TIL: Today I Learned

20220906 TIL

야언 2022. 9. 6. 19:52

오늘의 한 일

  • python 강의 2일차 
  • 과제 계산기 만들기
  • 백준 알고리즘 문제 풀이 

 

python 강의 2일차

 

 

python 활용

 

자료형 활용하기

  • 사칙연산
    • 파이썬에서는 integer와 float 자료형에서 활용할 수 있는 다양한 종류의 사칙연산을 지원하고 있습니다. 
x + y  더하기

x - y  빼기

x * y  곱하기

x ** y 제곱(x의 y제곱)

x / y 나누기, int와 int를 나누더라도 연산 결과는 항상 float이 나온다.

5 / 2 → 2.5,  4 / 2 → 2.0

x // y 나머지 없는 나누기, 어떤 값을 나누더라도 항상 정수로 떨어진다.

5 // 2 -> 2, 4 // 2 -> 2, 4.0 // 2.0 -> 2.0

x % y 나머지를 구하는 연산

8 % 3 -> 2, 5.0 % 2.0 -> 1.0
    • 변수에 값을 할당하고 수식을 사용할 때는 연산 축약 문법을 활용할 수 있습니다.
# num에 정수를 할당하고, 할당된 값에 1을 더하고 싶을 때

# case 1
num = 10
num = num + 1
# result: 11

# case 2
num = 10
num += 1
# result: 11

# case 1, 2 모두 동일한 동작을 하고 동일한 결과를 내는 수식입니다.
# 이와 같은 축약식은 + 이외에 다른 수식에서도 사용할 수 있습니다.

num -= 3  # num = num - 3
num *= 3  # num = num * 3
num **= 3 # num = num ** 3
num /= 3  # num = num / 3
num //= 3 # num = num // 3
num %= 3  # num = num % 3

 

 

 

  • string
    • 문자열에서는 + 와 * 연산 기호를 지원합니다.
a = "hello "
b = "world!!"
c = a + b # 문자열 합치기

print(c)

# result print
"""
hello world!!
"""


a = "hello "
b = a * 3 # b 변수에 문자열을 반복해서 저장
print(b)

# result print
"""
hello hello hello
"""
    • python 버전이 3.6일 경우 f-string을 활용해 문자열과 변수를 함께 다룰 수 있습니다.
n1 = 5
n2 = 10

# 아래 세가지 방법 모두 동일한 결과물이 출력됩니다.
print("n1 : %s, n2 : %s, sum : %s" % (n1, n2, n1+n2)) # old Style
print("n1 : {}, n2 : {}, sum : {}".format(n1, n2, n1+n2)) # ~ python < 3.6
print(f"n1 : {n1}, n2 : {n2}, sum : {n1+n2}") # ~ python >= 3.6

# result print
"""
n1 : 5, n2 : 10, sum : 15
n1 : 5, n2 : 10, sum : 15
n1 : 5, n2 : 10, sum : 15
"""

# float의 소수점을 원하는 자리까지 출력할 수도 있습니다.
PIE = 3.14159265358979

print(f"pie : {PIE}")     # pie : 3.14159265358979
print(f"pie : {PIE:.2f}") # pie : 3.14   ### .()f = 소수 ()번째 숫자까지

 

  • list
    • list 자료형 선언 시 list 안에 들어있는 각 요소는 0부터 시작해 순서대로 index 번호를 가지며, indexing과 slicing 기능을 활용해 활용해 원하는 값을 가져올 수 있습니다.
alphabets = ["a", "b", "c", "d", "e", "f"]

# indexing을 활용해 원하는 값 가져오기
print(alphabets[0])   # alphabets의 첫 번째 요소를 출력
print(alphabets[2])   # alphabets의 세 번째 요소를 출력
print(alphabets[-1])  # alphabets의 마지막 요소를 출력

# index slicing 기능을 활용해 원하는 값들 가져오기
print(alphabets[0:4]) # alphabets의 index가 0보다 크거나 같고 4보다 작은 요소 출력

# result print
"""
a
c
f
['a', 'b', 'c', 'd'] # alphabets 의 0, 1, 2, 3 index가 출력됨
"""
    • list 자료형에서는 값을 원하는대로 추가, 수정, 삭제할 수 있습니다.
numbers = [1, 2, 3, 4, 5]

numbers.append(6) # numbers의 마지막 자리에 6 추가 append
# numbers = [1, 2, 3, 4, 5, 6]

numbers.remove(1) # numbers에서 1이라는 값을 가진 요소 삭제 remove, 잘 안쓰인다함
# numbers = [2, 3, 4, 5, 6]

numbers[-1] = 7 # numbers의 마지막 요소(5)의 값을 7로 변경 ([-1] = 맨 마지막 요소)
# numbers = [1, 2, 3, 4, 7]

last_num = numbers.pop() # list에서 마지막 요소 삭제 후 변수에 할당 pop
# last_num = 7
# numbers = [1, 2, 3, 4]
    • list 자료형의 요소에는 숫자나 문자 이외에도 다양한 자료형을 사용할 수 있습니다 (권장하진 않음)
sample_list = [0, 1.0, "hello", True, {"key": "value"}, [1, 2, 3]]
    • len() 함수를 사용해 list의 길이를 구할수 있습니다.
numbers = [1, 2, 3, 4]
print(len(numbers)) # 4

 

  • tuple 
    • tuple 자료형 또한 list와 동일한 indexing 기능을 활용할 수 있습니다.
    • tuple 자료형에서는 요소의 값을 수정하거나 삭제할 수 없으며, 추가만 가능합니다.
numbers = (1, 2, 3, 4, 5)

numbers += (6, 7) # numbers의 마지막 자리에 6, 7 추가
# numbers = (1, 2, 3, 4, 5, 6, 7)

numbers[-1] = 8 # tuple 자료형은 값을 변경하려고 시도할 경우 에러 발생
"""
Traceback (most recent call last):
  File "sample.py", line 7, in <module>
    numbers[-1] = 8
TypeError: 'tuple' object does not support item assignment
"""

 

  • set
    • set 자료형은 중복 된 값을 포함하지 않고, indexing과 slicing 기능을 지원하지 않습니다.
numbers = {1, 2, 3, 4, 5, 5}
# numbers = {1, 2, 3, 4, 5} / 중복된 값을 포함하지 않기 때문에 5는 하나만 저장

print(numbers[0]) # set 자료형은 index를 사용해 값을 가져올 수 없음
"""
Traceback (most recent call last):
  File "sample.py", line 4, in <module>
    print(numbers[0])
TypeError: 'set' object is not subscriptable
"""
    • len() 함수를 사용해 set 자료형의 길이를 구할수 있습니다. 
  • dictionary   ※※※ 매우 중요! 앞으로 장고하면서 죽어라 쓸듯
    • dictionary 자료형은 key: value로 구성되며, key를 사용해 value를 가져올 수 있습니다.
products = {
    "bread": 1000,
    "milk": 3000,
    "egg": 6000,
}

print(products["bread"])  # bread라는 key가 존재하면 value 출력   
print(products["milk"])  # milk라는 key가 존재하면 value 출력         중요!
print(products["egg"])  # egg라는 key가 존재하면 value 출력
# result print
"""
1000
3000
6000
"""

# 만약 존재하지 않는 key로 value를 가져오려 시도할 때에는 에러가 발생합니다.
print(products["drink"])
"""
Traceback (most recent call last):
  File "sample.py", line 18, in <module>
    print(products["drink"])
KeyError: 'drink'
"""

# 이 경우, .get을 사용해 해당 key가 없을 때 사용될 값을 지정할 수 있습니다.
print(products.get("egg", 0)) # egg key가 존재하기 때문에 해당 value 출력
print(products.get("drink", 0)) # drink key가 존재하지 않기 때문에 0 출력
# result print
"""
6000
0
"""
    • dictionary 자료형에서는 자유롭게 값을 추가, 수정, 삭제할 수 있습니다.
products = {
    "bread": 1000,
    "milk": 3000,
    "egg": 6000,
}

products["bread"] = 1500 # bread key의 value를 1500으로 변경
products["drink"] = 2000 # drink key를 가진 value 추가
'''
{
    "bread": 1500,
    "milk": 3000,
    "egg": 6000,
    "drink": 2000
}
'''

del(products["milk"]) # milk key를 가진 key: value 쌍 삭제
'''
{
    "bread": 1500,
    "egg": 6000,
    "drink": 2000
}
'''

 

 

자료형 변환

 

함수

  • def 함수명():  과 같은 형태로 선언할 수 있습니다.
def print_hello_world():
    print("hello world!!")

# 선언한 함수를 호출하면 함수 안에 작성 된 코드가 실행됩니다.
print_hello_world() # hello world!!
  • 함수를 선언할 때에는 인자를 받고, 원하는 로직을 수행한 후 결과를 리턴해 줄 수 있습니다.
def multiply(a, b):
    return a * b

num1 = 5
num2 = 10

result = multiply(num1, num2)
# result = 50

 

다른 파일에 있는 코드 import해서 사용하기

  • 예제에서 사용 된 파일 구조
│  a.py
│  main.py
├─ folder
│  ├─ b.py
│  ├─ c.py
  • import “파일명”을 사용해 다른 파일에 선언된 코드를 가져와서 사용할 수 있습니다.
# a.py
def a_funtion():
    print("execute a")

# main.py
import a # a 파일을 import
a.a_funtion() # a 파일의 a_funtion() 사용
  • from을 사용하면 더 다양한 방법으로 파일을 import할 수 있습니다.
# a.py
def a_funtion():
    print("execute a")

# main.py / case 1
from a import a_funtion # a 파일에 있는 a_funtion을 import
# 이 경우 위 예제와 다르게, a.a_funtion가 아닌 a_funtion으로 사용한다.
a_funtion() # execute a

# main.py / case 2
from a import * # a 파일에 있는 모든 함수를 import
a_funtion() # execute a
  • 다른 폴더에 있는 파일 import하기
# folder/b.py
def b_funtion():
    print("execute b")

# folder/c.py
def c_funtion1():
    print("execute c1")

def c_funtion2():
    print("execute c2")

# main.py
from folder import b
from folder.c import *

b.b_funtion() # execute b
c_funtion1() # execute c1
c_funtion2() # execute c2
  • 변수 import해서 사용하기
# 다른 파일의 변수 또한 함수와 동일한 방법으로 from / import를 사용할 수 있습니다.
# folder/b.py
PIE = 3.14
HELLO = "world"

# main.py / case 1
from folder.b import * # *권장X* 존재하는 모든 변수 import

print(PIE) # 3.14
print(HELLO) # "world"

# main.py / case 2
from folder.b import PIE, HELLO # 사용 할 변수를 각각 import

print(PIE) # 3.14
print(HELLO) # "world"

# main.py / case 3
from folder import b # *권장O* b 파일 import
print(b.PIE) # 3.14
print(b.HELLO) # world
  • 임포트 시에 * 사용을 지양해야 하는 이유 -> 디버깅시에 오류가 있는 변수를 어디서 따온건지 모를 수 있다! 
# folder/b.py
PIE = 3.14
HELLO = "world"

# folder/a.py
PIE = 3.15

# main.py / case 1
from folder.b import * # *권장X* 존재하는 모든 변수 import
from folder.a import *

print(PIE) # 이러면 3.14? 3.15? 오류가 나면 어느 파일이 문제일까?
  • from과 import의 이해를 돕기 위한 팁
python에서 다른 파일에 있는 코드를 사용할 때에는 어디서(from) 어떤(import) 것을
가져와서 사용할지 지정해 줘야 합니다.

main.py 파일을 기준으로, 선언된 함수와 변수의 경로는 아래와 같습니다.

a.a_funtion
folder.b.b_funtion
folder.b.PIE
folder.b.HELLO
folder.c.c_funtion1
folder.c.c_funtion2

여기서 다양한 방식으로 from과 import를 사용할 수 있습니다.

from a import a_funtion
from a import *
import a

from folder import b
from folder.b import *

from folder.c import c_funtion1, c_funtion2

 

값 비교하기

  • 다양한 비교 연산자들을 사용해 값을 비교하고, 결과가 True인지 False인지 판단할 수 있습니다. 비교 결과는 조건문에서 사용됩니다.
'''== : 값이 일치하는지 비교'''
"a" == "a" # True
"a" == "b" # False
1 == "1" # False, 값은 동일하지만 자료형이 다르기 때문

'''!= : 값이 일치하지 않는지 비교'''
0 != 1 # True
0 != 0 # False

'''>, < : 값이 큰지 작은지 비교'''
5 > 2 # True
1 < 0 # False
1 > 1 # False

'''>=, <= : 값이 크거나 같은지, 작거나 같은지 비교'''
1 >= 1 # True

'''in : 특정 값이 list / tuple / set에 포함되어 있는지 확인'''
4 in [1, 2, 3] # False
1 in (1, 2, 3) # True

# 모든 비교 연산자의 결과는 print()로 확인할 수 있습니다.
print(1 == 1) # True

 

 

조건문

  • 특정 비교 결과 혹은 값이 True 혹은 False일 경우 실행 될 로직을 정의합니다.
if condition: # 조건이 True일 경우
    # some code

# not 키워드를 사용할 경우 조건이 False일 때 실행됩니다.
elif not condition: # 조건이 False일 경우
    # some code

else: # 위 조건들 중 만족하는게 없을 경우
    # some code
  • and, or을 사용해 2개 이상의 조건을 복합적으로 사용할 수 있습니다.
if condition1 and condition2: # 두 조건을 모두 만족할 경우
    # some code

elif condition or condition: # 두 조건 중 하나라도 만족할 경우
    # some code

else: 
    # some code
  • 비어있는 string, list 등은 분기문에서 False로 판단합니다.
empty_string = ""
empty_list = []

if not empty_string:
    print("string is empty!!")

if not empty_list:
    print("list is empty!!")
  • 특정 값이 True인지 False인지는 bool() 함수를 사용해 확인할 수 있습니다.
print(bool(""))
print(bool(0))
print(bool([]))

print(bool("sample"))
print(bool([1, 2]))
print(bool(1))
print(bool(-1)) # 0이 아닌 숫자는 True로 판단

# sample result
"""
False
False
False

True
True
True
True
"""

 

 

 

번외 : 오버플로 - 나무위키 컴퓨터의 정수 연산의 계산 결과가 허용 범위를 초과할 때 발생하는 오류, 이런저런 게임하면서 익숙하게 본 숫자들이 굉장히 많다 ㅋㅋ  32비트 42억 항목에 바람 풀경은 왜 없는거냐

 

 

 

 

과제 계산기 만들기

 

 

https://yaun.tistory.com/156

 

220906 계산기 만들기

내 제출 main.py from calculate import cal_result num1 = int(input('첫번째 숫자를 입력:')) num2 = int(input('두번째 숫자를 입력:')) op = input('연산자를 입력:') print(f'{num1} {op} {num2} = {cal_res..

yaun.tistory.com

 

처음엔 함수 하나를 가지고 연산자 입력이 잘못되었을때는 print 되지 않게 만들려고 고생했는데, 팀원들과 결과물을 보고하면서 사칙연산 함수를 세분화시키는 것으로 간단하게 해결했다. 코드 자체는 정말 쉬운데 활용하는 법이 어렵다는걸 계속 깨닫는 부분..

 

 

 

 

 

백준 알고리즘 문제풀이

 

 

문제 풀이 및 정리는 백준 알고리즘 카테고리에

 

역시나 풀이 핵심 요소는 맞췄지만 코드를 하나하나 써내려가면서 완성하는 과정이 굉장히 힘들었다. 

문제풀이 이후에는 구글링을 통해 다른 방식으로 적용 할 수 있는 함수들을 찾아보고 정리해두었다.

특히 set 자료형에서 쓸 수 있는 함수들은 꼭 기억해둬야할듯!