✨ 1 Week - Python Coding Study
안녕하세요. 소시지입니다.
본 포스팅은 <2024.09.23 ~ 2024.12.09> 기간의 코딩 스터디 1주차 학습 내용을 기록했습니다.
CodeHive Study 1주차 진행 (2024.09.23)
🗓️ 학습 주제
- K-MOOC의 ‘파이썬 프로그래밍’ 강의 수강
- 학습한 강의의 내용을 팀원과 공유하고, 각자가 이해한 내용을 발표하며 2차 복습 진행
- 기본 연산자 관련 백준(Baekjoon) 알고리즘 문제 풀이 및 코드 공유
- 간단한 발표 보고서 작성 & 팀원의 알고리즘 문제 풀이법 학습
📝 baekjoon 알고리즘 문제 풀이
1181 단어 정렬 (실버Ⅴ)
문제:
알파벳 소문자로 이루어진 N개의 단어를 정렬하시오.
조건:
1. 길이가 짧은 것부터
2. 길이가 같으면 사전 순으로
3. 중복 단어는 제거
알파벳 소문자로 이루어진 N개의 단어를 정렬하시오.
조건:
1. 길이가 짧은 것부터
2. 길이가 같으면 사전 순으로
3. 중복 단어는 제거
📝 풀이 코드
n = int(input())
word_list=[]
for i in range(n):
word_list.append(input())
new_list = set(word_list)
word_list = list(new_list)
word_list.sort()
word_list.sort(key= len)
for i in word_list:
print(i)
🔍 문제 분석:
- 길이가 짧은 것부터 정렬
- 길이가 같으면 사전 순으로 정렬
- 중복된 단어 제거
🔍 해결 전략:
- set()을 이용해 중복 단어를 제거한다.
- 다시 리스트로 변환하고, 먼저 사전순으로 정렬한 후 길이순으로 정렬한다.
- sort()를 이용하여 사전 순으로 정렬한다.
- word_list.sort(key= len) 길이가 짧은 것부터 정렬한다.
4153 직각삼각형 (브론즈Ⅲ)
문제
과거 이집트인들은 각 변들의 길이가 3, 4, 5인 삼각형이 직각 삼각형인것을 알아냈다. 주어진 세변의 길이로 삼각형이 직각인지 아닌지 구분하시오.
입력: 입력은 여러개의 테스트케이스로 주어지며 마지막줄에는 0 0 0이 입력된다. 각 테스트케이스는 모두 30,000보다 작은 양의 정수로 주어지며, 각 입력은 변의 길이를 의미한다.
출력: 각 입력에 대해 직각 삼각형이 맞다면 "right", 아니라면 "wrong"을 출력한다.
입력: 입력은 여러개의 테스트케이스로 주어지며 마지막줄에는 0 0 0이 입력된다. 각 테스트케이스는 모두 30,000보다 작은 양의 정수로 주어지며, 각 입력은 변의 길이를 의미한다.
출력: 각 입력에 대해 직각 삼각형이 맞다면 "right", 아니라면 "wrong"을 출력한다.
📝 풀이 코드
while True:
x, y, z = map(int, input().split())
if x==0 and y==0 and z==0:
break
x,y,z = sorted([x,y,z])
if z**2 == x**2 + y**2:
print("right")
else:
print("wrong")
🔍 문제 분석:
피타고라스의 정리 성립 조건: 세 변 중에서 가장 긴 변의 제곱이 나머지 두 변의 제곱의 합과 같다.
🔍 해결 전략:
- x, y, z = sorted([x, y, z]): 입력받은 세 변을 오름차순으로 정렬하고 가장 큰 값(빗변)은 z, 나머지 두 변은 x와 y로 설정한다.
2839 설탕 배달 (실버Ⅳ)
문제
상근이는 요즘 설탕공장에서 설탕을 배달하고 있다.
상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다.
설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그램 봉지와 5킬로그램 봉지가 있다.
상근이는 귀찮기 때문에, 최대한 적은 봉지를 들고 가려고 한다.
예를 들어, 18킬로그램 설탕을 배달해야 할 때, 3킬로그램 봉지 6개를 가져가도 되지만, 5킬로그램 3개와 3킬로그램 1개를 배달하면, 더 적은 개수의 봉지를 배달할 수 있다.
상근이가 설탕을 정확하게 N킬로그램 배달해야 할 때, 봉지 몇 개를 가져가면 되는지 그 수를 구하는 프로그램을 작성하시오.
입력: 첫째 줄에 N이 주어진다. (3 ≤ N ≤ 5000)
출력: 상근이가 배달하는 봉지의 최소 개수를 출력한다. 만약, 정확하게 N킬로그램을 만들 수 없다면 -1을 출력한다.
상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다.
설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그램 봉지와 5킬로그램 봉지가 있다.
상근이는 귀찮기 때문에, 최대한 적은 봉지를 들고 가려고 한다.
예를 들어, 18킬로그램 설탕을 배달해야 할 때, 3킬로그램 봉지 6개를 가져가도 되지만, 5킬로그램 3개와 3킬로그램 1개를 배달하면, 더 적은 개수의 봉지를 배달할 수 있다.
상근이가 설탕을 정확하게 N킬로그램 배달해야 할 때, 봉지 몇 개를 가져가면 되는지 그 수를 구하는 프로그램을 작성하시오.
입력: 첫째 줄에 N이 주어진다. (3 ≤ N ≤ 5000)
출력: 상근이가 배달하는 봉지의 최소 개수를 출력한다. 만약, 정확하게 N킬로그램을 만들 수 없다면 -1을 출력한다.
📝 풀이 코드
n = int(input())
dp = [float('inf')] * (n+1)
dp[0]=0
sugar_bags = [3,5]
for sugar_bag in sugar_bags:
for i in range(sugar_bag, n+1):
if dp[i-sugar_bag] == float('inf'): continue
dp[i] = min(dp[i], dp[i-sugar_bag]+1)
answer=dp[n] if dp[n]!=float('inf') else -1
print(answer)
🔍 문제 분석:
설탕봉지의 최소 개수를 구해야 하므로, 그리디 방식(가장 큰 단위부터 쓰는 방식)은 적합하지 않다.
동적 계획법(DP)을 사용한다.
🔍 해결 전략:
p[i]: ikg를 정확히 배달하는 데 필요한 최소 봉지 수로 정의한다.
dp[0] = 0: 설탕이 0kg일 경우, 봉지의 수는 0이다.
나머지 dp[i]는 초기값으로 float(‘inf’)를 설정하였다.
3kg 봉지와 5kg 봉지를 사용할 수 있으므로, ikg를 배달할 수 있는 최소 봉지 수는 i-3kg 또는 i-5kg를 배달하는 최소 봉지 수에 1을 더한 값이다.
dp[n]이 우리가 구하는 최소 봉지 수이다.
dp[n]이 float(‘inf’)라면, n을 정확히 배달할 수 없다는 의미이므로, -1을 출력한다.
돌아가기: 2024 하반기 Python Coding Study