25. 04. 25 공부일지

behumble·2025년 5월 1일

공부일지

목록 보기
3/20

회고

  • if문 조건을 걸때 더욱 생각하고 걸기. 가장 좋은 조건을 걸 수 있게 노력하자.
  • 어느상황에 어떤 조건/반복문을 사용해야 할지 확신이 안선다.
    많은 경우를 더 찾아볼 필요가 있다. 예제를 많이 접하고 옆친구들의 과제도 다 까봐야겠다.
  • 힘들지만 잘 나아가고 있다. 꾸준함이 생명이다. 지치지말고 끝까지 완주하자.

필기

리스트

  • 앞으로 다양한 형태가 나온다하니 리스트를 꼭 숙지하고 넘어가자.
a = [1,2,3,4]
b = [5,6,7,8]

#리스트를 결합하는 방법
c = a + b # 원본을 안바꾸고 더해진 새로운 list를 반환함
print(c)

a.extend(b) #원본에 추가함
print(a)

del c[0] #요소삭제
print(c)

del c[4:] #요소삭제, 슬라이싱 사용
print(c)

a = [1,3,5,6,2,4,5,7]
a.sort() #오름차순 정렬
print(a)

a.reverse() #순서뒤집기
print(a)

a.insert(0,100) #0번째 값에 100 넣기
print(a)
a.insert(5,77) #5번째 값에 77 넣기
print(a)
a.insert(len(a),88) #append 함수와 동일한 역할을 한다.
print(a)

a.remove(77) # 값이 여러개일때 첫번째로 나오는 값을 찾아서 삭제한다.
print(a)

a=[]
a.append("A")
a.append("B")
a.append("C")
a.append("D")
a.append("E")
print(a)

튜플

  • 리스트와 달리 튜플은 값을 수정불가하다. 이점을 유의하여 공부하자.
#튜플은 다른언어에 아직 없는 타입이었는데 최근에 추가되고 있다.
#튜플 => 우리가 점심 때 플리마켓에 놀러갔다. 이것저것 사다가 손에 다 못들면 비닐봉지 하나 얻어서 비닐봉지에 담는다.
#괄호를 사용한다. "인덱싱과 슬라이싱"을 지원한다. 그러나 "인덱싱이나 슬라이싱"을 통한 업데이트 불가
#read only list형, 속도가 빠르다. 값 변경불가
#"이름 %s 나이 %d" % ("홍길동", 45)

a = (1,2,3,4,5)
print(a,type(a))

a = 5
b = 7
c = 9

a,b,c = 5,7,9 #tuple 활용
print(a,b,c)

#함수 -> 코드를 묶어놓은 것, 함수는 값을 하나만 반환해야 한다.
#파이썬의 경우에는 우리가 여러개를 반환하면 알아서 tuple로 묶어서 하나로 보내준다.
def myfunc1():
    return 3,4
a = myfunc1()
print(type(a))

b,c = a
print(b,c)

a = 5
b = 7
#두개의 변수값을 서로 exchange, swap
c = a
a = b
b = c
print("A =",a, "B =",b)

b, a = a, b #tuple을 써서 값을 swap 할 수 있다.
print("A =",a, "B =",b)

#tuple은 read only이다. 삭제, 업데이트 안된다.
a = (1,2,3,4,5,6,7,8,9)
print(a[0])
print(a[1])
print(a[2])

# del a[2] #삭제 불가
# a[0] = 11 #업데이트 불가

print(a[:5])
print(a[2:5])
print(a[::-1])

b = a + a
print(b)

b = a * 3
print(b)

dictionary

  • key, value라는 개념이 새로 나왔다. dict는 key값에 따른 할당된 value값이 있다.
colors = {"red":"빨간색", "blue":"파란색", "green":"초록색"}
#키 값은 주로 문자열을 사용한다. 만일에 같은 키 값을 두번 쓰면 두번째꺼로 업데이트 한다.
#딕셔너리는 "인덱싱, 슬라이싱" 불가
print(colors["red"])
print(colors["blue"])
print(colors["green"])

print(colors.keys()) #.keys() - 키값들의 목록을 보여준다.

#추가
colors["black"] = "검은색"
print(colors["black"])
colors["red"] = "붉은색"
print(colors)

#없는 키 값에 대해서는 어떻게 동작하는지?
# print(colors["pink"]) #KeyError가 뜬다.

if "pink" in colors.keys():
    print(colors["pink"])
else:
    print("pink is not exist")
    
print(colors.items(),type(colors))

print(colors.values())

#colors.clear() # 전체 삭제
#print(colors)

#특정키 삭제 - pop(키값)
colors.pop("red")
print(colors)

컴프리헨션

  • 컴프리헨션을 활용하여 list, tuple, dict을 효율적으로 사용하는 법을 익히자.
#컴프리핸션 
a = [1,2,3,4,5,6,7,8,9,10]
b = a 
a[2] = -3 

print( a )          #1.둘이 같다  2.둘이 다르다 
print( b )

#스택 하고 힙을 시스템이 프로세스한테 할당한다. 
#스택에는 변수 자신이 저장된다
#힙에는 데이터가 저장된다. 저장된 주소를 변수한테 전달한다 
# a(100번지) ========> (1,2,3,4,5,6,7,8,9,10)
# b = a  : 동일한 데이터 공간을 공유한다 
# b(100번지지)
# b라는 메모리 공간을 스택에 만들고 a의 값(데이터가있는곳의주소)
#를 복사한다. 소프트카피, 얖은카피라고 부른다
#소프트카피의 목적은 메모리 절약,쓸데없는 복사과정(overhead) 이 필요없다.
#하드카피, 깊은카피의 경우는 직접 구현하거나 deepcopy 모듈을 사용하거나 컴프리헨션을 사용한다

#사용자가 구현한 하드카피 상황
b = [] #새로 기억공간을 만든다 
for item in a: #a 로 부터 데이터를 하나씩 가져와서 item이라는 변수에 저장한다 
    b.append(item) 
b[3]=99
print(a)
print(b)

#컴프리핸션 : 리스트 복사   [ 변수명 for 변수명 in 리스트형변수]

c = [item for item in a] #하드카피 
c[5] = 55
print("a= ", a)
print("c= ", c)

d = [ item*2 for item in a] 
print("d= ", d)

#조건을 부여할 수도 있다. [변수명 for 변수명 in 리스트형 변수   if 변수명> 0 ]
#짝수와 홀수를 나눠보자 a의 숫자를 
oddList = [ x for x in a if x%2==1 ]
print( oddList )

wordList = ["rain", "desk", "hospital", "building", "java", "python", 
            "cloud", "rainbow", "assembly", "javascript", "html", "css"]
#1.복사 - 하드카피 
wordList2  = [w for w in wordList]
print( wordList2 )

#2.복사하면서 대문자로 바꾸고 싶다
wordList3 = [w.upper() for w in wordList]
print( wordList3 )

#단어와 단어길이
wordList3 = [ (w, len(w), w.upper()) for w in wordList]
print( wordList3 )

#단어길이가 5글자 이상인 것만 
wordList3 = [w for w in wordList if len(w)>=5]
print( wordList3 )

#문제1. 단어중에 java 라는 단어가 있는것만 추출하기 
wordList3 = [w for w in wordList if "java" in w]
print(wordList3)

#문제2. 단어중에 길이가 5개보다 짧은단어만 추출하기
wordList3 = [w for w in wordList if len(w)<5]
print(wordList3)

if문

  • if문은 어떤 조건이 참일때만 특정작업을 수행하고 싶을 때 사용한다.
#정수를 하나를 입력받아서 양수일 경우에 본래의 값에 *5를 해서 출력해아
n = int(input("정수 : "))
if n>0:
    n=n*5
print(n)

#양수이면 양수라고 출력하고 음수나 0이면 양수아님 
if n>0:
    print("양수")
else:
    print("양수 아님")

#양수이면 양수 0  음수
if n>0:
    print("양수")
elif n==0:
    print("0")
else:
    print("음수") 

for, while 반복문

  • for, while 반복문 역시 많이 사용되니 꼭 숙지하자
  • for : 순서가 있는 데이터를 반복할 때, 반복횟수가 명확히 정해져 있을 때 사용
  • while : 특정 조건을 만족할 때까지, 반복횟수가 정해져 있지 않을 때 사용
#반복문
#for문 : 정해진 횟수만큼 반복한다.
#while문 : 반복을 하긴 하는데 몇번할지 모른다. , 특정조건을 만족할 때만 반복하며 한번도 수행을 안할수도 있다.

for i in [1,2,3,4,5,6,7,8,9,10]:
    print(i)

#range(시작,종료,증감치) : 시작값부터 시작해서 종료값-1까지 증감치를 가지고 생성해낸다.
print(range(1,11))
for i in range(1,11):
    print(i)
    
a = list(range(1,11))
print(a)

for i in range(2,100,2):
    print(i,end = " ")
print()

for i in range(100,1,-2):
    print(i,end = " ")
print()

#문제1. 1 2 3 4 5 6 7 8 9 10
#       11 12 13 14 15 16 17
for i in range(1,101,1):
    print(i, end = "")
    if i%10 == 0:
        print()
        
#문자의 unicode -> ord
print(ord("A")) #65
print(ord("B")) #66
print(ord("a")) #97
print(ord("0")) #48
print(ord("1")) 
#코드값 => 문자로 chr(코드값)
print(chr(49))
print(chr(65))

#for문을 써서 알파벳 A~Z까지 출력하기
for i in range(ord("A"), ord("Z")+1):
    print(chr(i), end="")

주급계산_if

 
#문제1. 주급계산 :이름, 근무시간, 시간당급여액, 추가수당 : 근무시간이 20시간을 초과하면 
#               시간당급여액에 50%를 가산한다
#   이름 근무시간 시간당급여   기본금액  수당   총액  
#  홍길동  30     10000     300000  50000  350000

work_time = int(input("근무시간을 입력하세요 "))
name = input("이름을 입력하세요 ")
time_pay = int(input("시간당 급여액을 입력하세요 "))

basic_pay = int(work_time * time_pay)
plus_pay = 0

if work_time > 20 :
    plus_pay = (time_pay * 0.5) * (work_time - 20)
total_pay = basic_pay + plus_pay

print(f"{name}, {work_time}, {time_pay}, {int(basic_pay)}, {int(plus_pay)}, {int(total_pay)}")

컴퓨터활용능력_if

  • if문을 활용 시 조건을 어떻게 줄것인가에 대해 고민이 필요하다.
    더 깔끔한 조건을 걸수는 없을까?
#컴퓨터활용능력시험
#이름 필기(400) 워드(200) 스프레드시트(200) 프리젠테이션(200)
#총점을 구하고 등급 800 이상 A, 800미만 600이상 B,600미만 400이상 C, 400 미만 D, 재시험 요망

person = input("이름을 입력하세요 ")
writing = int(input("필기 점수를 입력하세요 "))
word = int(input("워드점수를 입력하세요 "))
sheet = int(input("스프레드시트 점수를 입력하세요 "))
ppt = int(input("프리젠테이션 점수를 입력하세요 "))

#계산
total_score = writing + word + sheet + ppt

if total_score > 800:
    grade = "A"
elif total >= 600:
    grade = "B"
elif total >= 400:
    grade = "C"
else:
    grade = "D, 재시험요망"
    
print(f"{person},{writing},{word},{sheet},{ppt},{grade}")

과제

짝수, 홀수의 합과 평균 구하기(김성재풀이)

  • 문제를 풀며 평균을 구하는 부분에서 애를 먹었다.
    짝수와 홀수의 개수를 셀 수 있게 for문안에 even_cou와 odd_cou를 셀 수 있는 부분을 만들었다.
#숫자를 10개 입력받아서 각각 짝수와 홀수의 합과 평균을 구하는 프로그램을 작성하기.
# for문, if문 사용, 짝수의 합, 홀수의 합, 짝수의 평균, 홀수의 평균

even_sum = 0
odd_sum = 0
even_cou = 0
odd_cou = 0

for i in range(1,11):
    num = int(input("숫자를 10개 입력하세요"))
    if i % 2 == 0:
        even_sum = even_sum + num
        even_cou = even_cou + 1
    else:
        odd_sum = odd_sum + num
        odd_cou = odd_cou + 1
        
even_ave = even_sum // even_cou
odd_ave = odd_sum // odd_cou

print(f"짝수의 개수는 {even_cou}개, 합은 {even_sum}이며 평균은 {even_ave} 입니다.")
print(f"홀수의 개수는 {odd_cou}개, 합은 {odd_sum}이며 평균은 {odd_ave} 입니다.")

짝수, 홀수의 합과 평균 구하기(백현숙강사님풀이)

  • 내 문제풀이와 비교했을 때 너무 간단하게 나왔다.
    좀 더 클린코드를 적을 수 있게 고민하고 코딩을 해야할 것 같다.
even_sum = 0
odd_sum = 0

for i in range(0,10):
    num = int(input("정수"))
    if num % 2 ==0:
        even_sum += num
    else:
        odd_sum += num

print(f"짝수의 합계 : {even_sum}")
print(f"홀수의 합계 : {odd_sum}")

복습

gpt를 활용한 유사예제

비밀번호 확인

# 사용자 ID와 비밀번호가 맞는지 확인하라. 틀렸다면 다시 입력시켜라.
user_id = "admin"
user_pw = "1234"

while True:
    input_id = input("id를 입력하세요 : ")
    input_pw = input("pw를 입력하세요 : ")

    if user_id == input_id and user_pw == input_pw:
        print("로그인 성공")
    else:
        print("로그인 실패, 다시 입력하세요")

교통요금 구분

# 나이에 따라 교통요금을 구분하라.
# 0~6세: 무료 / 7~18세: 1,000원 / 19~64세: 1,250원 / 65세 이상: 무료

while True:
    age = int(input("나이를 입력 : "))
    if age < 0:
        print("잘못된 나이입니다. 다시 입력해주세요")
        continue
    if age <= 6 or age >= 65:
        charge = "무료"
        break
        
    if 7 <= age <= 18:
        charge = "1,000원"
        break
        
    if 19 <= age <= 64:
        charge = "1,250원"
        break
        
print(charge)

확장자 판단

# 파일 이름의 확장자가 이미지인지 판단하라.
filename = "holiday.jpg"

filename_extension = filename.split(".")
sen = "jpg"


if sen in filename_extension:
    print("이미지 파일입니다.")
else:
    print("이미지 파일이 아닙니다.")

비밀번호 맞추기

# 비밀번호가 틀리면 최대 3번까지 재시도할 수 있다.
correct_pw = "pass123"
tries = 0
chance = 3
# 사용자가 입력한 비밀번호는 input_pw 리스트 순서대로 제공된다고 가정

while tries <= 2:
    pw = input("pw를 입력하세요 : ")
    chance = chance - 1
    if pw != correct_pw:
        print(f"다시 입력하세요. 남은 기회는 {chance}번 입니다.")
        tries += 1
        
    if pw == correct_pw:
        print("비밀번호가 일치합니다.")
        break
else:
    print("기회 끝!")

누적합 100넘기기

# 숫자를 하나씩 더해 누적합이 100을 넘는 시점을 출력하라.
nums = [5, 10, 15, 30, 40, 20]
total = 0

for num in nums:
    total = total + num
    if total > 100:
        print(f"누적합 {total}, 종료")

이메일에 @가 있나?

# 사용자가 이메일을 입력할 때 '@'가 포함되지 않으면 다시 입력하도록 한다.
inputs = ["hello", "myemail.com", "user@example.com"]

# 결과: "잘못된 이메일입니다." * 2, "입력 완료: user@example.com"

for sen in inputs:
    if "@"  in sen:
        print(f"입력완료 : {sen}")
    else:
        print("잘못된 이메일입니다.")

연봉인상!!

# 직원 연봉에 대해 5% 인상 후 결과 출력
salaries = [3000, 4000, 5000]
up_salaries = []
for i in salaries:
    result = i + (i * 0.05)
    up_salaries.append(result)
    
print(up_salaries)

5글자 이상 단어는?

# 5글자 이상인 단어만 출력하라.
words = ["data", "science", "AI", "analytics", "deep"]
up5_words = []

for word in words:
    if len(word) >= 5:
        up5_words.append(word)
    
print(up5_words)

리스트에서 숫자만 더하기

# 중첩된 리스트에서 숫자만 모두 더하라.(이중 for문 활용함)
data = [[1, 2], [3, 4], [5]]
total = 0

for i in data:
    for num in i:
        total += num
        
print(total)

재고가 0인 상품은?

# 재고가 0인 상품명을 출력하라.
inventory = {"apple": 10,"banana": 0,"orange": 5,"mango": 0}
zero_inventory = []

for key,value in inventory.items():
    if value == 0:
        zero_inventory.append(key)
        
print(zero_inventory)

정리

  • 컴프리헨션 사용법이 코드작성에 간결함을 줄 것 같다. 아래는 컴프리헨션에 대한 내용이다.
# 리스트 컴프리헨션(list comprehension)**은 짧고 간결하게 리스트를 생성할 수 있는 파이썬 문법
# 언제쓰는가?
# 기존 리스트를 변환하거나,
# 조건을 걸어서 필터링하거나,
# 반복해서 새 리스트를 생성할 때!

# 기초문법 : [표현식 for 변수 in 반복가능한객체]
# 1~5까지 제곱한 리스트 만들기
squares = [x**2 for x in range(1, 6)]
print(squares)  # [1, 4, 9, 16, 25]

# 조건문포함 : [표현식 for 변수 in 반복가능한객체 if 조건]
# 1~10 중 짝수만 제곱
even_squares = [x**2 for x in range(1, 11) if x % 2 == 0]
print(even_squares)  # [4, 16, 36, 64, 100]

# if-else포함 : [참일때값 if 조건 else 거짓일때값 for 변수 in 반복가능한객체]
# 0~9 중 짝수면 그대로, 홀수면 -1로 바꾸기
nums = [x if x % 2 == 0 else -1 for x in range(10)]
print(nums)  # [0, -1, 2, -1, 4, -1, 6, -1, 8, -1]

# 2중 for문 (중첩 for) : [표현식 for i in 반복1 for j in 반복2]
# 구구단 결과 중 2단~3단
gugudan = [i * j for i in range(2, 4) for j in range(1, 10)]
print(gugudan)

# 일반 for문과 비교
# 일반 방식
result = []
for x in range(10):
    if x % 2 == 0:
        result.append(x)

# 리스트 컴프리헨션
result = [x for x in range(10) if x % 2 == 0]

0개의 댓글