20240710 TIL
Q1.
<배경>
전자 상거래 플랫폼에서 고객의 평균 주문을 계산해야 합니다. 이를 위해 숫자 리스트의 평균을 계산하는 방법을 연습합니다.
<목표>
주어진 숫자 리스트의 평균을 계산하는 함수를 작성하세요.
<데이터>
numbers: 숫자가 담긴 리스트
<나의풀이>
numbers = [10, 20, 30, 40, 50]
def calculate_avg(numbers):
total = sum(numbers)
result = total / len(numbers)
return result
total_avg = calculate_avg(numbers)
print("숫자들의 평균:", total_avg)
- numbers의 합계를 구해야하기 때문에 sum()을 통해 합계를 구하고 total 이라는 변수에 대입
- 평균을 구해야 하기 때문에 len()를 통해 리스트의 개수를 구해준 뒤, 아까 구한 total과 len(numbers)를 나눈 것을 result라는 변수에 대입
- result 반환
- 이렇게 구한 함수를 total_avg라는 변수에 대입을 하고 print 해줌
sum() : 합계를 구함
len() : 리스트의 길이 구함
Q2.
<배경>
기상청에서는 하루 동안의, 가장 높았던 기온과 가장 낮았던 기온을 확인하고 일교차를 보고하고자 합니다.
<목표>
하루 동안 기록된 기온 목록을 받아, 가장 낮은 기온과 가장 높은 기온을 활용하여 일교차를 함수를 작성하세요.
<데이터>
하루 동안 기록된 기온의 리스트
<나의 풀이>
numbers = [10, 20, 30, 40, 50]
def calculate_diff_temperature(numbers):
max_tem = max(numbers)
min_tem = min(numbers)
result = (max_tem) - (min_tem)
return result
diff_temp= calculate_diff_temperature(numbers)
print("일교차:", diff_temp)
일교차 구하는 법 - 최고 기온 - 최저 기온
- max() 를 통해 최고 기온을 구하고 max_tem이라는 변수에 대입
- min() 을 통해 최저 기온을 구하고 min_tem이라는 변수에 대입
- 일교차를 구해야 하기 때문에 최고 기온 - 최저기온 한 식을 result라는 변수에 대입
- result 반환
- 이렇게 구한 함수를 diff_temp 라는 변수에 대입하고 print
max() : 최댓값 구하기
min() : 최솟값 구하기
Q3.
<배경>
한 소매점에서는 다양한 제품을 판매하고 있습니다. 매월 판매된 제품들의 목록과 각 제품의 판매 수량이 기록됩니다. 이 데이터를 분석하여 가장 많이 판매된 제품을 찾아내려고 합니다.
<목표>
제품 명과 판매 수량이 담긴 목록을 받아, 가장 많이 판매된 제품의 이름과 수량을 반환하는 함수를 작성하세요.
<데이터>
제품 이름과 해당 제품의 판매 수량을 담은 딕셔너리로 구성되어 있음
sales_data = {"apple": 50, "orange": 2, "banana": 30}
def find_top_seller(sales_data):
top_product = max(sales_data, key = sales_data.get)
return top_product
result = find_top_seller(sales_data)
print(result) # 출력: 'apple'
- 가장 많이 판매된 제품의 이름을 구해야 하기 때문에
- max() 를 이용해서 가장 많이 판매된 제품을 구하기
- 딕셔너리 중 key 값만 나오게 해야 하기 때문에 key = sales_data.get
- 이것들을 top_product라는 변수에 대입후 반환
- 다시 그 함수를 result라는 변수에 대입 후 print
keys(): 모든 키를 dict_keys 객체로 반환
get(): 지정된 키에 대한 값을 반환합니다. 키가 존재하지 않으면 기본값을 반환
Q4.
<배경>
컴퓨터 과학 수업에서 학생들은 기본적인 프로그래밍 원리를 익히고, 실제 생활에 적용할 수 있는 간단한 프로그램을 만드는 연습을 합니다. 간단한 계산기를 만들어서 사칙연산을 수행할 수 있는 프로그램을 구현하는 것은 기본적인 프로그래밍 실습에 적합합니다.
<목표>
두 숫자와 연산자를 입력받아, 해당 연산을 수행하고 결과를 반환하는 함수를 작성하세요.
<데이터>
- num1, num2: 숫자 입력값
- operator: 문자열 형태의 연산자('+', '-', '*', '/')
<나의 풀이>
def simple_calculator(num1, num2, operator):
result = 0
if operator == '+':
result = num1 + num2
elif operator == '-':
result = num1 - num2
elif operator == '*':
result = num1 * num2
elif operator == '/':
result = 'Cannot divide by zero'
return result
print(simple_calculator(10, 5, '+')) # 출력: 15
print(simple_calculator(10, 5, '-')) # 출력: 5
print(simple_calculator(10, 5, '*')) # 출력: 50
print(simple_calculator(10, 0, '/')) # 출력: 'Cannot divide by zero'
조건문을 통해 풀이
result = 0이라는 변수를 지정
- 총 4개의 연산자와 그에 맞는 식이 나와야 하므로 if 문으로 풀이
- operator 가 '+'일때 result 값이 num1+num2가 나와야 한다
- operator 가 '-'일때 result 값이 num1-num2가 나와야 한다
- operator 가 '*'일때 result 값이 num1*num2가 나와야 한다
- operator 가 '/'일때 result 값이 num1/num2가 나와야 한다
이렇게 지정해주고 그에 원하는 값을 print에 넣어주면 결과 값 나옴
== : a == b --> a=b 같다라는 표시 파이썬에서의 같다 표현
Q5.
<배경>
당신은 회사의 고객 데이터베이스를 관리하고 있습니다. 데이터베이스에 저장된 고객의 이메일 주소가 유효한 형식을 갖추고 있는지 검증하는 작업이 필요합니다.
<목표>
문자열 형태의 이메일 주소 목록을 분석하여, 각 이메일 주소가 올바른 형식을 갖추고 있는지 판단하는 프로그램을 작성하세요.
<데이터>
- 이메일 주소는 문자열 리스트로 제공됩니다.
- 올바른 이메일 주소의 형식은 다음과 같습니다:
- 하나의 '@' 기호를 포함해야 합니다.
- '@' 기호 앞에는 하나 이상의 문자가 있어야 합니다.
- '@' 기호 뒤에는 도메인명이 와야 하며, 도메인명은 '.'을 포함한 하나 이상의 문자로 구성되어야 합니다.
<요구사항>
- 각 이메일 주소가 올바른 형식을 갖추고 있는지 검사합니다. (문자열 메소드 사용)
- 올바른 형식의 이메일 주소인 경우, "유효한 이메일 주소입니다."를 출력합니다.
- 올바르지 않은 형식의 경우, "유효하지 않은 이메일 주소입니다."를 출력합니다.
<before>
def validate_emails(email_list):
for email in email_list:
if '@' in email:
print(f'유효한 {email} 입니다.')
result = email.split('@')
if len(result) != 2:
print(f'유효하지 않은 {email}입니다.')
elif '.' in result[1]:
print(f'유효한 {email} 입니다.')
else:
print(f'유효하지 않은 {email}입니다.')
email_list = [
"example@example.com",
"wrongemail@com",
"anotherexample.com",
"correct@email.co.uk"
]
validate_emails(email_list)
유효한 example@example.com 입니다.
유효한 example@example.com 입니다.
유효한 wrongemail@com 입니다.
유효하지 않은 anotherexample.com입니다.
유효한 correct@email.co.uk 입니다.
유효한 correct@email.co.uk 입니다.
나름 엄청 생각하고 풀이를 친 건데 답은 나왔지만 반복돼서 나왔고 '.'에 관한 조건이 없어서 유효하다고 나와서 틀린 코드가 됐다.
이렇게 반복적으로 같은 이메일이 나오고 한 걸로 봐선 조건문을 두개로 나눠서 반복적으로 나온 것 같다.
아무래도 앞에 if_in문을 쓰니까 result 변수를 지금 안쓰니 나중에 넣는다는게 틀리게 나오는거 한 몫한듯 ..?
<after>
def validate_emails(email_list):
for email in email_list:
result = email.split('@')
if len(result) != 2:
print(f'유효하지 않은 {email}입니다.')
elif '.' in result[1]:
print(f'유효한 {email} 입니다.')
else:
print(f'유효하지 않은 {email}입니다.')
email_list = [
"example@example.com",
"wrongemail@com",
"anotherexample.com",
"correct@email.co.uk"
]
validate_emails(email_list)
<결과값>
유효한 example@example.com 입니다.
유효하지 않은 wrongemail@com입니다.
유효하지 않은 anotherexample.com입니다.
유효한 correct@email.co.uk 입니다.
반복문과 조건문을 통한 이메일 유효성 검사하기
- '@' 기호가 포함되어있어야 하기 때문에 조건문을 통해 result라는변수 설정 --> result = email.split('@')
- if문을 통해
- 만약 result의 개수가 2와 같지 않다면 유효하지 않은 이메일로 프린트 --> '@' 앞 뒤로 문자가 와야 하는데 만약 '@'없는 이메일이라면 유효하지 않는다고 나와야하기 때문
- 만약 result[1]에 '.'이 있으면 유효한 이메일로 프린트 --> 도메인명에 '.'있는 하나 이상의 문자가 와야 하기 때문에
- result[1] = '@'을 기준으로 문자가 나눠져 있기 때문에 뒷 문자인 [1]을 꺼내 여기에 '.'있으면 유효한 이메일이라는 것을 말하는 것
- 그 외 예들은 유효하지 않은 이메일로 처리
- 마지막 함수 시행하면 결과값 나옴
아직 6번 문제와 7번문제는 풀지 않았지만 1번부터 이 문제들 중 가장 푸는데 오래 걸린 문제였다. 어제 오늘 걸쳐서 이틀걸린듯 ... ^^
현재까지는 파이썬이 젤 약하기 때문에 문제1번부터 생각하고 찾아보고 하느라 꽤 막혔다 .. 6번 7번은 심화문제이던데 내가 풀 수 있을지 모르겠다. 일단 도전해보는걸로 !! 5번까지 푼 나도 대단해 ! 사실 정답인지는 모름
Q6.
<배경>
당신은 대규모 텍스트 데이터를 분석하는 프로젝트를 진행하고 있습니다. 텍스트 데이터에서 특정 패턴을 찾아내는 작업을 수행해야 합니다. 이번 작업에서는 중복된 문자를 제거하고 각 문자가 한 번씩만 나타나게 하는 프로그램을 작성하는 것이 목표입니다. 하지만 각 문자는 처음 등장한 순서를 유지해야 하며, 추가적으로 각 문자가 등장하는 빈도를 함께 계산해야 합니다.
<목표>
주어진 문자열에서 중복된 문자를 제거하고, 각 문자가 처음 등장한 순서대로 한 번씩만 나타나게 하며, 각 문자가 등장하는 빈도를 함께 출력하는 프로그램을 작성하세요.
<데이터>
- 입력 문자열은 알파벳 대문자와 소문자, 숫자, 공백으로 구성될 수 있습니다.
<요구사항>
- 주어진 문자열에서 중복된 문자를 제거합니다.
- 각 문자가 처음 등장한 순서를 유지합니다.
- 각 문자가 등장하는 빈도를 함께 출력합니다.
- 결과는 (문자, 빈도수) 형태의 튜플 리스트로 반환합니다.
<before1>
input_string = "abracadabra123321"
def remove_duplicates_and_count(input_strng):
result_with_frequency = []
for i in input_string:
result_with_frequency.append(i)
return result_with_frequency
counts = {}
result = remove_duplicates_and_count(input_string)
for a in result:
if a in counts:
counts[a] = counts[a] + 1
else:
counts[a] = 1
counts_list = counts.items()
print(counts_list)
<풀이>
1. input_string을 리스트 형식으로 변환
input_string = "abracadabra123321"
def remove_duplicates_and_count(input_strng):
result_with_frequency = []
for i in input_string:
result_with_frequency.append(i)
return result_with_frequency
result = result = remove_duplicates_and_count(input_string)
print(result)
#['a', 'b', 'r', 'a', 'c', 'a', 'd', 'a', 'b', 'r', 'a', '1', '2', '3', '3', '2', '1']
2. 리스트를 딕셔너리로 변환--요소가 counts 안에 있다면 counts[a] + 1 , 없다면 1 추출
counts = {}
result = remove_duplicates_and_count(input_string)
for a in result:
if a in counts:
counts[a] = counts[a] + 1
else:
counts[a] = 1
print(counts)
#{'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1, '1': 2, '2': 2, '3': 2}
3. 마지막으로 딕셔너리를 다시 리스트로 변환시켜주기위해 item()함수 사용
counts_list = counts.items()
print(counts_list)
#dict_items([('a', 5), ('b', 2), ('r', 2), ('c', 1), ('d', 1), ('1', 2), ('2', 2), ('3', 2)])
근데 결과값에 왜 dict_items가 붙는지 모르겠다.
그래서 어떤 걸 고쳐보지 생각하다가 ...
<after>
input_string = "abracadabra123321"
def remove_duplicates_and_count(input_strng):
result_with_frequency = []
for i in input_string:
result_with_frequency.append(i)
return result_with_frequency
counts = {}
result = remove_duplicates_and_count(input_string)
for a in result:
if a in counts:
counts[a] = counts[a] + 1
else:
counts[a] = 1
print(list(counts.items()))
결과값
[('a', 5), ('b', 2), ('r', 2), ('c', 1), ('d', 1), ('1', 2), ('2', 2), ('3', 2)]
밑에 print만 다른 방식으로 바꿨을 뿐인데 앞전에 있던 dict_items가 없어졌다.
똑같이 item() 함수를 사용했는데 왜일까? 오늘 문제 해설 날이니 유심히 들어보는걸로 !! 사실 정답인지 아닌지도 모름 ㅋ
여튼 이 문제도 진짜 고민하고 고민하고 또 고민했는데 구글링이 답이다... 진짜 구글링 안하고 문제만 보고 척척 푸는 사람들이 대단하게 느껴졌다 나는 언제쯤 그렇게 될 수 있을까 ㅠㅠㅠㅠ 그래도 열심히 찾아보고 결과값이 나왔다는 것에 의의를 두자 !
<튜터님 풀이>
def remove_duplicates_and_count(s):
result_with_frequency = []
frequency = {} # 각 문자의 빈도수를 저장할 딕셔너리
for char in s:
# 각 문자의 빈도수 업데이트
if char in frequency.keys():
frequency[char] += 1
else:
frequency[char] = 1
# 결과 리스트에서 각 문자의 빈도수 업데이트
for key, value in frequency.items():
result_with_frequency.append((key,value))
return result_with_frequency
# 예시 문자열
input_string = "abracadabra123321"
# 중복 문자 제거 및 빈도수 계산 실행
result = remove_duplicates_and_count(input_string)
print(result)
# 실행 결과
# [('a', 5), ('b', 2), ('r', 2), ('c', 1), ('d', 1), ('1', 2), ('2', 2), ('3', 2)]
내가 굉장히 꼬아서 푼 것 같다 굳이 리스트 > 딕셔너리 > 리스트로 하지 않아도 될듯 ... 괜히 더 어렵게 푼 것만 같다
확실히 튜터쌤의 문제 풀이를 보니 그렇게까지 어렵지 않은 문제였던걸 깨닫게 된다 ... 이 문제 풀려고 한 몇시간은 걸린 것 같은ㄷ ㅔㅠ.ㅠ
그래서 이제라도 알게 돼서 다행이다 !
Q7.
<배경>
축구 경기 데이터 분석가로서, 선수들의 위치 데이터를 활용하여 그들의 활동 범위와 이동 효율성을 계산하는 것은 팀 전략을 세우는 데 중요합니다. 선수들의 이동 패턴을 분석하고 이를 통해 그들의 총 누적 이동 거리를 계산하여 선수의 활동량을 평가할 수 있습니다.
<목표>
선수들의 위치 데이터가 주어졌을 때, 해당 데이터를 분석하여 경기 동안 각 선수가 이동한 총 누적 거리를 계산하는 프로그램을 작성하세요.
<데이터>
- 위치 데이터는 선수의 이름과 그에 따른 위치 좌표의 리스트를 포함하는 딕셔너리 형태로 제공됩니다. 각 좌표는 (x, y) 튜플로 표현됩니다.
- 선수는 경기 동안 여러 번 위치가 변경될 수 있으며, 각 위치는 이전 위치에서의 이동 거리를 기록합니다.
<요구사항>
- 유클리드 거리 공식을 사용하여 각 위치 변경 시 이동 거리를 계산합니다.
- 각 선수별로 경기 동안 이동한 총 누적 거리를 출력합니다.
<튜터님의 풀이>
import math
def calculate_total_distances(player_positions):
for player, positions in player_positions.items():
total_distance = 0.0
for i in range(1, len(positions)):
x1, y1 = positions[i - 1]
x2, y2 = positions[i]
distance = math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)
total_distance += distance
print(f"{player}의 총 누적 이동 거리: {total_distance:.2f} 미터")
# 선수별 위치 데이터
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)]
}
# 총 누적 이동 거리 계산 실행
calculate_total_distances(player_positions)
# 실행 결과
# John Doe의 총 누적 이동 거리: 7.07 미터
# Jane Smith의 총 누적 이동 거리: 9.08 미터
# Mike Brown의 총 누적 이동 거리: 10.00 미터
'✨Today I Learned > Python' 카테고리의 다른 글
데이터 전처리 (Pandas) (0) | 2024.07.17 |
---|---|
Python codekata 19번 - 정수 제곱근 판별 (0) | 2024.07.11 |
파이썬 라이브 세션 2일차 퀴즈 (0) | 2024.07.09 |
Python CODEKATA 15번, 16번 (0) | 2024.07.08 |
Python : 조건문, 반복문, 함수 (0) | 2024.07.05 |