class="layout-aside-right paging-number">
본문 바로가기
데이터 분석/Python

python 개인과제 해설 : 최댓값 찾기, try-except, continue-break, 문자열 누적갯수 {}

by heestory323 2025. 3. 18.


 1 

평균 계산

total_avg = sum(numbers)/len(numbers)

def calculate_avg(numbers):
    total_avg = sum(numbers) / len(numbers)
    return total_avg

total_avg = calculate_avg(numbers)
print("숫자들의 평균:", total_avg)

 

 

 2

일교차 함수 : 가장높은기온 - 가장낮은기온
max(numbers) - min(numbers)
 

def calculate_diff_temperature(numbers):
    diff_temp = max(numbers) - min(numbers)
    return diff_temp

diff_temp= calculate_diff_temperature(numbers)
print("일교차:", diff_temp)

 

 3 

📌  최대값을 찾는 알고리즘 : 반복문 + 조건문
값을 하나씩 꺼내 와서 하나씩 비교해나가면서 최대값 찾는 알고리즘
numbers = [   ,   ,   ,   ,   ]
max_value = 0      -- 최댓값을 담는 변수 0으로 세팅
for n in numbers :
    if n > max_value :  --리스트의 각 숫자를 기존 최댓값과 비교
        max_value = n    --더 큰 값이 나오면 최댓값으로 업데이트

 

Q. sales_data = {"apple": 50, "orange": 2, "banana": 30}

 

 

풀이방법 #1  for ... in문 + if문

1. 딕셔너리에서 값을 하나씩 빼와서 비교해나가면서 최댓값 찾기 .items()
for    in sales_data.items() :   

('apple', 50), ('orange', 2), ('banana', 30)


->1-1. 튜플 형태()로 나오니까 -> 인덱싱 ok

-> 1-2. for key, value in sales_data.items() :   

변수를 2개 이상 설정하면 (key,value) 각각 나올 수 있음

최댓값을 구하는 알고리즘을 만족하면 key, value값을 반환 

max_value = 0
for key, value in sales_data.items() :
	if value > max_value : 
    	max_value = value


2. 이러면 최댓값이 value에 담김 
최댓값에 해당하는 이름은  key에서 가져오는 것. 
max_key = key 

 

4. 위에 조건들을 다 만족하면 retrun max_key, max_value 

 

max_value = 0
 for key, value in sales_data.items() :
    if value > max_value : 
         max_value = value
         max_key = key
return max_key, max_value

print(find_top_seller(sales_data))

 

풀이방법 #2 max() 함수

 

1. max() 함수로 최댓값을 가져오는 key 찾기
max_key = max(sales_data.keys(), keys=sales_data.get))

max(sales_data.keys()) 만 했을 경우 기본적으로 사전순 비교

but keys=리스트명.get -> 값을 기준으로 비교하는 옵션 추가

 

2. max()함수로 최댓값을 가져오는 value 찾기

max_value = max(sales_data.values())

 

3.  max_key, max_value print

 

max_key = max(sales_data.keys(), key=sales_data.get)
max_value = max(sales_data.values())
print(max_key, max_value)

 

 

 4 

사칙연산 구하기

1.연잔자로 연산수행하는 if문 

def simple_calculator(num1, num2, operator):
    if operator == '+':
        return num1 + num2
    elif operator == '-':
        return num1 - num2
    elif operator == '*':
        return num1 * num2

 

나눗셈 연산할 때 방법이 2가지로 나뉨.

풀이방법 #1 if문 

1.연잔자로 연산 수행 
단, 나눗셈(/) 연산시 분모숫자(num2)가 0이면 안됨
 -> if num2 == 0 인 경우를 따로 설정 필요

elif operator == '/' :
	if num2 == 0:
    	return 'Cannot divided by zero'
	 else:
    	return num1/num2

 

풀이방법 #2 Error를 사용한 try, except 문 

 

2. 원래 0으로 나눠지면 ZeroDivisionError 라고 에러가 뜸.
-> try, except문 사용


📌 try, except 구문 
: 에러가 떴을때, 에러가 뜬 상황에서 대처하거나 넘어가는 등 error를 활용하는 문법
try:    
   # 반복해서 수행할 작업
except 특정에러 : 
   <-- 특정에러이름을 쓰면 그 에러일때만 수행
   #Error가 떴을때 실행할 작업

 

try:
   result = 10 / 0 
   print(result) -> Error 감지 시 except로 넘어감 
except :     
   print('나누기 안됨')










 5 

이메일 주소 유효성 검사

 

0. for email in email_list : 리스트를 세우고

 

1. 조건 3가지로 구분 
기준(조건)
1. @ 기호 포함 : @존재 하는지아닌지
2.  @ 기호 앞 문자 하나이상 : @하나만 존재해야함(@기준으로 2개로 나눠져야하니까)
3.  @ 기호 뒤에 도메인명, '.'을 포함한 하나 이상의 문자 :  .이 존재하는지 아닌지
( 4. 공백이 존재하는지아닌지 )


조건1) @존재여부 if문 
if '@' in email : 

조건2) @하나만 존재해야함 .split() - 특정문자기준으로 나눠짐
split해서 나온 결과물의 갯수 = 2개여야함. 

 

parts = email.split('@')
if len(parts)  == 2 : 
   username, domain = parts
   #username = parts[0]
   #domain = parts[1]

->@f로 email을 나눴을때 나오는 것을 셌을때 (len()) == 2 
혹은

email.count('@') != 1

 -> @ 문자를 셌을 때 1개인 조건

조건3)  .이 존재하는지 아닌지

if "." in domain :
print(f"{email} 유효한 이메일 주소입니다.")

 

4. 그렇지 않을 경우 "유효하지 않은 이메일 주소입니다"  써주기

방법 #1

4-1. 매 조건if 마다 그렇지 않을경우(else) 추가

                if "." in domain:
                    print(f"{email} 유효한 이메일 주소입니다.")
                else:
                    print(f"{email} 유효하지 않은 이메일 주소입니다.")
            else:
                print(f"{email} 유효하지 않은 이메일 주소입니다.")
        else:
            print(f"{email} 유효하지 않은 이메일 주소입니다.")


 

방법 #2

 4-2. 반복문for에서  continue, break 

📌 continue, break  : 둘다 반복 멈추기
- continue : 다음 반복으로 강제로 넘어가기
                    원래 있던 코딩과정 중단하고 다음 반복으로 넘어감
- break : 무조건 코드 중지
               반복도 안하고 그냥 무조건 중지


continue  : 해당 조건 충족시 그냥 다음 반복으로 넘어감

-> 조건 중 하나라도 충족을 못한 경우 , continue 뒤에 있는 코드가 출력
print(f"{email} 유효하지 않은 이메일 주소입니다.") 

if username and domain:
                    if "." in domain:
                        print(f"{email} 유효한 이메일 주소입니다.")
                        continue
        print(f"{email} 유효하지 않은 이메일 주소입니다.")



전체함수 

def validate_emails(email_list):
    for email in email_list:
        if "@" in email:
            parts = email.split('@')
            if len(parts) == 2:
                username, domain = parts
                if username and domain:
                    if "." in domain:
                        print(f"{email} 유효한 이메일 주소입니다.")
                        continue
        print(f"{email} 유효하지 않은 이메일 주소입니다.")



 

 6 

중복된문자제거,문자가 처음 나타난순서대로, 문자등장빈도 구하기

 

📌 문자열 누적갯수(빈도수) 구할 때는  딕셔너리 활용****
{key, value} 로 짝지어져 있어서 조회하기 쉬움. 

frequency = { }    # 빈도수를 저장할 딕셔너리

for char in input_string :   #글자 하나씩 가져오는 for문
 if char in frequency.keys() :   -- frequency의 key에 있는 경우에는 (딕셔너리에 이미 있는 문자라면)
         frequency[char] += 1   #기존 값에 누적해서 1을 더함 (각 빈도수 업데이트)  --> count 필요 없이 가능 !! 
    else :                                 --처음 등장하는 문자라면
      frequency[char] = 1       --#빈도수를 1로 초기화

print(frequency) #최종빈도수 출력

 

frequency = { } # 빈도수를 저장할 딕셔너리

for char in input_string :   #글자 하나씩 가져오는 for문
    if char in frequency.keys() : -- frequency의 key에 있는 경우에는 (딕셔너리에 이미 있는 문자라면)
         frequency[char] += 1  #기존 값에 누적해서 1을 더함 (각 빈도수 업데이트)  --> count 필요 없이 가능 !! 
    else :                    --처음 등장하는 문자라면
        frequency[char] = 1  --#빈도수를 1로 초기화

print(frequency) #최종빈도수 출력




 7 

📌 거리기반 머신러닝 계산방법 (= 데이터 분포 유사도 계산방식과 비슷)
1. 유클리디안 거리 : 피타고라스( a^2+b^2=c^2)로 c=루트( a^2+b^2) 
2. 맨해튼 거리 : l a-b l 절댓값  
3. 코사인거리 : 코사인함수
player_positions = {
    "John Doe": [(0, 0), (1, 1), (2, 2), (5, 5)],
    "Jane Smith": [(2, 2), (3, 8), (6, 8)],
    "Mike Brown": [(0, 0), (3, 4), (6, 8)]
}

 

📌 Packing  &  Unpacking
-Packing(패킹) : 여러개의 값을 하나의 변수(튜플, 리스트)에 저장하는 과정 { [ (x,y) ] }
-Unpacking(언패킹) : 딕셔너리 key-value를 각각 분해하거나 튜플(x,y)를 개별변수로 분해하는 등
                                 여튼간에 분해과정

방법 #1

1. for player, positions in player_positions.items():
play, positions 을 딕셔너리{}에서 분리해서 가져옴

# player1 , position = [(0, 0), (1, 1), (2, 2), (5, 5)]     
   player2 , position = [(2, 2), (3, 8), (6, 8)] [(0, 0), (3, 4), (6, 8)]

 

2. 총_이동거리 초기화
-거리 = 누적해서 더해야하므로 변수 0으로 지정.
total_distance = 0.0  -- 소수점 받을 수 있게

 

3. 이동거리 계산 반복문

for i in range(0,len(positions)-1) :   
값은 position에서 가져옴
* len(positions)-1) 인 이유 :  현재위치 i 와 다음위치 i+1을 비교해서 계산해야하니까 
    i+1이 position 리스트의 마지막 인덱스까지 도달해야 하므로  i+1 = 최종 len(position)

    -> 반복횟수 = len(position) -1 

 

4. 언패킹
거리'를 구해야하므로 값을 현재위치, 다음위치 2개씩 짝지어서 분리 : (x1,y1) (x2,y2) -> 언패킹
                                                                                                           i         i+1

그다음 x,y좌표 각각 분리 -> 인덱싱
x1 = positions[i][0] 0   --> i (현재위치)
y1 = positions[i][1] 0
x2 = positions[i+1][0] 1 -- > i+1인 수를 가져와야함
y2 = positions[i+1][1] 1
  혹은
x1,y1 = positions[i]
x2,y2 = positions[i+1]

5. 거리계산
루트 a = a의 2분의1승
           = a 의 0.5승
distance = (x2-x1) **2 + (y2-y1) **2 **0.5승  [피타고라스의 정리]

6. 누적거리 합산
total_distance+=distance
print(f{player}의 총 이동거리 : {total_disttance: .2f} 미터") 
*.2f  : (실수) 소수점 2자리까지만 반올림하여 출력

 

for player, positions in player_positions.items():
        total_distance = 0.0
        for i in range(0, len(positions)-1):
            x1, y1 = positions[i]
            x2, y2 = positions[i+1]
            distance = ((x2 - x1) ** 2 + (y2 - y1) ** 2) ** 0.5
            total_distance += distance
        print(f"{player}의 총 누적 이동 거리: {total_distance:.2f} 미터")





 8

목표

이렇게 영어와 한글이 섞인 숫자들이 문자열 형태로 주어집니다.
이를 아라비아 숫자형태로 바꾸어서 출력하고,
한글로 적인 숫자의 개수, 영어로 적인 숫자의 개수를 차례로 반환하는 함수를 완성해주세요!


제한사항

참고로, 암호로 주어질 수 있는 영어숫자와 한글숫자의 범위는 아래와 같습니다.

  • 영어숫자의 범위 : zero ~ nine
  • 한글숫자의 범위 : 영 ~ 구

또한 입출력 값은 다음의 범위를 가집니다.

  • 입력으로 주어지는 문자의 길이는 1에서 4까지 가질 수 있습니다.
  • 출력값으로 나올 수 있는 정수는 0~9999 입니다

 

알고리즘 3가지 만들기
1. 갯수 세는 매커니즘 

 

📌 갯수 카운트하는 매커니즘 
- 몇번 반복했는지 갯수를 세주는 매커니즘
number = 0
for i in [1,2,3,4,5]
number += 1  

-반족 후 누적횟수를 세주는 매커니즘
number = 0
for i in [1,2,3,4,5]
number += i 


2. 문자열 분리
: 단어 기준 문자열 분리 ->  숫자로 변환 ->  다시 붙이기  .split()

1) 영어 -> 숫자변환

s = "one23three"
word = "one"
split1, split2 = s.split(word)   -- "one" 기준으로 split    # split1 = "", split2 = "23three"
s = split1 + str(1) + split2  

        ""           1          23three  =>   # "123three"

2) 한글 -> 숫자변환

s = "123three오"
word = "오"
split1, split2 = s.split(word)  -- "오" 기준으로 split       # split1 = "123three", split2 = ""
s = split1 + str(5) + split2  # "123three5"



1.영, 한 따로 딕셔너리 만들기  en_num, ko_num

  en_num = {'zero':0, 'one':1, 'two':2, 'three':3,
            'four':4, 'five':5, 'six':6, 'seven':7,
            'eight':8, 'nine':9}

  ko_num = {'영':0, '일':1, '이':2, '삼':3, '사':4, '오':5,
         '육':6, '칠':7, '팔':8, '구':9}

 

2. 영어 단어 -> 숫자로 변환

en_n =0

for word, num  in en_num.items() : -- key, value 가져오긱

    

    if word in s : --문자열 s안에 영어 숫자가 포함되어잇는지 조건 확인

       en_n +=1  -- 영어 -> 숫자로 변환하는 갯수 카운트 증가

      split1, split2 = s.split(word)  -- 해당 단어를 기준으로 문자열 분리 후 ->

       s = split1 + str(num) + split2  -- -> 숫자로 변환한 후 문자열 재구성

 

 

3. 한글 -> 숫자 변환

  ko_n = 0
  for word, num in ko_num.items():

      if word in s:
          ko_n += 1
          split1, split2 = s.split(word)
          s = split1 + str(num) + split2

 

4.결과 반환

return s, ko_n, en_n 

    *s : 문자열 s 안에 영단어/한글이 변환된게 있으면 고치는 함수엿음. 
    s = 최종 변환된 문자열

def solution(s):

  en_num = {'zero':0, 'one':1, 'two':2, 'three':3,
            'four':4, 'five':5, 'six':6, 'seven':7,
            'eight':8, 'nine':9}

  ko_num = {'영':0, '일':1, '이':2, '삼':3, '사':4, '오':5,
         '육':6, '칠':7, '팔':8, '구':9}

  en_n = 0
  for item in en_num.items():
      word, num = item

      if word in s:
          en_n += 1
          split1, split2 = s.split(word)
          s = split1 + str(num) + split2

  ko_n = 0
  for item in ko_num.items():
      word, num = item

      if word in s:
          ko_n += 1
          split1, split2 = s.split(word)
          s = split1 + str(num) + split2

  return s, ko_n, en_n