Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions 12주차/문제1/박민서_예산.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
def solution(d, budget):
answer = 0
d = sorted(d)
# '최대' 몇 개의 부서에게 지원이 가능한지 묻는 거니까
# 작은 예산부터 예산을 주고 다음 부서에게 줄 남은 금액이 있으면
# 그 다음 예산의 부서에게 부여하는게 타당함.

for money in d:
if money <= budget:
answer += 1
budget -= money

return answer
56 changes: 56 additions & 0 deletions 12주차/문제2/박민서_구명보트.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
def solution(people, limit):
answer = 0
people = sorted(people) # 몸무게 정렬
boat = 0 # 보트 현재 무게 측정

left_idx = 0 # 태울 수 있는 가장 가벼운 사람 찾는 index
right_idx = len(people) - 1 # 태울 수 있는 가장 무거운 사람 찾는 index
# 보트를 최대한 적게 사용하면서, 보트에 태울 수 있는 조합: 가장 무거운 사람 + 가장 가벼운 사람

while left_idx <= right_idx:
boat += people[right_idx] # 현재 제일 무거운 사람 태우고
right_idx -= 1

if people[left_idx] <= limit - boat: # 가벼운 사람 태울 수 있으면 태움
left_idx += 1
answer += 1

boat = 0 # 보트 떠나 보내고

return answer

'''
정확성 테스트
테스트 1 〉 통과 (0.92ms, 9.1MB)
테스트 2 〉 통과 (0.73ms, 9.08MB)
테스트 3 〉 통과 (0.71ms, 9.3MB)
테스트 4 〉 통과 (0.64ms, 9.31MB)
테스트 5 〉 통과 (0.35ms, 9.04MB)
테스트 6 〉 통과 (0.36ms, 9.11MB)
테스트 7 〉 통과 (0.56ms, 9.26MB)
테스트 8 〉 통과 (0.03ms, 9.32MB)
테스트 9 〉 통과 (0.08ms, 9.1MB)
테스트 10 〉 통과 (1.02ms, 9.28MB)
테스트 11 〉 통과 (0.53ms, 9.18MB)
테스트 12 〉 통과 (0.49ms, 9.04MB)
테스트 13 〉 통과 (0.71ms, 9.32MB)
테스트 14 〉 통과 (0.87ms, 9.32MB)
테스트 15 〉 통과 (0.08ms, 9.33MB)
테스트 16 〉 통과 (0.02ms, 9.13MB)
테스트 17 〉 통과 (0.02ms, 9.17MB)
테스트 18 〉 통과 (0.03ms, 9.23MB)
테스트 19 〉 통과 (0.02ms, 9.21MB)
테스트 20 〉 통과 (0.02ms, 9.13MB)
테스트 21 〉 통과 (0.02ms, 9.13MB)
테스트 22 〉 통과 (0.02ms, 9.33MB)
효율성 테스트
테스트 1 〉 통과 (8.51ms, 9.79MB)
테스트 2 〉 통과 (9.77ms, 10.1MB)
테스트 3 〉 통과 (8.57ms, 9.85MB)
테스트 4 〉 통과 (9.97ms, 9.82MB)
테스트 5 〉 통과 (20.61ms, 9.67MB)
채점 결과
정확성: 81.5
효율성: 18.5
합계: 100.0 / 100.0
'''
57 changes: 57 additions & 0 deletions 12주차/문제3/박민서_귤 고르기.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
from collections import Counter

def solution(k, tangerine):
answer = 0 # 서로 다른 종류가 최소이려면, 귤의 개수가 많은 종류부터 차례대로 담으면 됨

my_list = sorted(dict(Counter(tangerine)).items(), key=lambda x:-x[1])
# [1, 3, 2, 5, 4, 5, 2, 3] -> [(3, 2), (2, 2), (5, 2), (1, 1), (4, 1)]

temp = 0 # 귤 개수 담기
for num in my_list:
temp += num[1] # 현재 귤 개수에 추가
answer += 1 # 종류수 추가
if temp >= k: # 귤 개수가 넘친다면?
break # 최소 종류만큼 넣은 것
return answer


'''
정확성 테스트
테스트 1 〉 통과 (6.59ms, 12.4MB)
테스트 2 〉 통과 (6.62ms, 12.4MB)
테스트 3 〉 통과 (6.91ms, 12.6MB)
테스트 4 〉 통과 (7.35ms, 12.2MB)
테스트 5 〉 통과 (8.19ms, 10.3MB)
테스트 6 〉 통과 (6.14ms, 10.4MB)
테스트 7 〉 통과 (7.07ms, 11.6MB)
테스트 8 〉 통과 (6.52ms, 11.1MB)
테스트 9 〉 통과 (6.11ms, 10.9MB)
테스트 10 〉 통과 (7.59ms, 12MB)
테스트 11 〉 통과 (0.03ms, 9.11MB)
테스트 12 〉 통과 (0.03ms, 9.2MB)
테스트 13 〉 통과 (0.03ms, 9.12MB)
테스트 14 〉 통과 (0.02ms, 9.36MB)
테스트 15 〉 통과 (0.04ms, 9.21MB)
테스트 16 〉 통과 (0.02ms, 9.3MB)
테스트 17 〉 통과 (0.03ms, 9.16MB)
테스트 18 〉 통과 (0.02ms, 9.21MB)
테스트 19 〉 통과 (0.02ms, 9.27MB)
테스트 20 〉 통과 (0.02ms, 9.3MB)
테스트 21 〉 통과 (0.09ms, 9.23MB)
테스트 22 〉 통과 (0.28ms, 9.36MB)
테스트 23 〉 통과 (0.31ms, 9.41MB)
테스트 24 〉 통과 (0.37ms, 9.52MB)
테스트 25 〉 통과 (3.60ms, 10.4MB)
테스트 26 〉 통과 (6.83ms, 11.6MB)
테스트 27 〉 통과 (48.60ms, 25.5MB)
테스트 28 〉 통과 (27.86ms, 17.6MB)
테스트 29 〉 통과 (56.39ms, 20.4MB)
테스트 30 〉 통과 (49.89ms, 25.7MB)
테스트 31 〉 통과 (8.08ms, 11.6MB)
테스트 32 〉 통과 (7.74ms, 13MB)
테스트 33 〉 통과 (35.44ms, 21.5MB)
테스트 34 〉 통과 (31.90ms, 20.5MB)
채점 결과
정확성: 100.0
합계: 100.0 / 100.0
'''
170 changes: 170 additions & 0 deletions 12주차/문제4/박민서_기지국 설치.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,170 @@
# 처음 풀이
def solution(n, stations, w):
answer = 0

my_list = ['0' for _ in range(n)]

for station in stations:
station_idx = station - 1
my_list[station_idx] = '1'
for _w in range(1, w + 1):
if station_idx + _w < len(my_list):
my_list[station_idx + _w] = '1'
if station_idx - _w < len(my_list):
my_list[station_idx - _w] = '1'
no_elec = "".join(my_list).split("1")
no_elec_length = [len(zero) for zero in no_elec if len(zero) > 0]

answer = sum([l // (2 * w + 1) if l % (2 * w + 1) == 0 else l // (2 * w + 1) + 1 for l in no_elec_length])
return answer
# 전파 받을 수 있으면 1, 아니면 0으로,
# 1로 split 해주면 연속적인 0의 개수가 남으니 다 더하면 될거라 생각

'''
정확성 테스트
테스트 1 〉 실패 (0.01ms, 9.3MB)
테스트 2 〉 통과 (0.01ms, 9.29MB)
테스트 3 〉 통과 (0.01ms, 9.27MB)
테스트 4 〉 통과 (0.01ms, 9.17MB)
테스트 5 〉 통과 (0.01ms, 9.29MB)
테스트 6 〉 통과 (0.01ms, 9.17MB)
테스트 7 〉 통과 (0.01ms, 9.23MB)
테스트 8 〉 통과 (0.01ms, 9.31MB)
테스트 9 〉 통과 (0.01ms, 9.27MB)
테스트 10 〉 통과 (0.01ms, 9.27MB)
테스트 11 〉 통과 (0.01ms, 9.38MB)
테스트 12 〉 통과 (0.01ms, 9.3MB)
테스트 13 〉 통과 (0.01ms, 9.27MB)
테스트 14 〉 통과 (0.01ms, 9.28MB)
테스트 15 〉 통과 (0.01ms, 9.27MB)
테스트 16 〉 통과 (0.03ms, 9.26MB)
테스트 17 〉 통과 (0.03ms, 9.23MB)
테스트 18 〉 통과 (0.02ms, 9.27MB)
테스트 19 〉 통과 (0.03ms, 9.27MB)
테스트 20 〉 통과 (0.02ms, 9.26MB)
테스트 21 〉 통과 (0.08ms, 9.27MB)
효율성 테스트
테스트 1 〉 실패 (시간 초과)
테스트 2 〉 실패 (시간 초과)
테스트 3 〉 실패 (시간 초과)
테스트 4 〉 실패 (시간 초과)
채점 결과
정확성: 67.1
효율성: 0.0
합계: 67.1 / 100.0
'''

# 다른 풀이
def solution(n, stations, w):
answer = 0

my_list = [0 for _ in range(n)]

for station in stations:
left = max(0, station - 1 - w)
right = min(n - 1, station - 1 + w)
for i in range(left, right + 1):
my_list[i] = 1

count_zero = 0
for i in range(n):
if my_list[i] == 0:
count_zero += 1
else:
answer += count_zero // (2 * w + 1) if count_zero % (2 * w + 1) == 0 else count_zero // (2 * w + 1) + 1
count_zero = 0
if count_zero > 0:
answer += count_zero // (2 * w + 1) if count_zero % (2 * w + 1) == 0 else count_zero // (2 * w + 1) + 1
return answer
# 똑같이 전파 배열 만들어주고
# 앞에서부터 세면서 연속적인 0의 개수를 세고 전파 범위로 나누어 계산
'''
정확성 테스트
테스트 1 〉 통과 (0.01ms, 9.18MB)
테스트 2 〉 통과 (0.01ms, 9.28MB)
테스트 3 〉 통과 (0.01ms, 9.08MB)
테스트 4 〉 통과 (0.01ms, 9.25MB)
테스트 5 〉 통과 (0.02ms, 9.19MB)
테스트 6 〉 통과 (0.01ms, 9.21MB)
테스트 7 〉 통과 (0.01ms, 9.28MB)
테스트 8 〉 통과 (0.01ms, 9.19MB)
테스트 9 〉 통과 (0.01ms, 9.11MB)
테스트 10 〉 통과 (0.01ms, 9.2MB)
테스트 11 〉 통과 (0.01ms, 9.2MB)
테스트 12 〉 통과 (0.01ms, 9.1MB)
테스트 13 〉 통과 (0.02ms, 9.28MB)
테스트 14 〉 통과 (0.01ms, 9.09MB)
테스트 15 〉 통과 (0.01ms, 9.24MB)
테스트 16 〉 통과 (0.03ms, 9.14MB)
테스트 17 〉 통과 (0.02ms, 9.08MB)
테스트 18 〉 통과 (0.02ms, 9.12MB)
테스트 19 〉 통과 (0.03ms, 9.13MB)
테스트 20 〉 통과 (0.02ms, 9.1MB)
테스트 21 〉 통과 (0.05ms, 9.22MB)
효율성 테스트
테스트 1 〉 실패 (시간 초과)
테스트 2 〉 실패 (시간 초과)
테스트 3 〉 실패 (시간 초과)
테스트 4 〉 실패 (시간 초과)
채점 결과
정확성: 70.5
효율성: 0.0
합계: 70.5 / 100.0
'''


def solution(n, stations, w):
answer = 0
cur_idx = 0
RANGE = 2 * w + 1
for station in stations:
left = max(0, station - 1 - w)
right = min(n - 1, station - 1 + w)
if cur_idx < left:
no_elec = left - cur_idx
answer += no_elec // RANGE if no_elec % RANGE == 0 else no_elec // RANGE + 1
cur_idx = right + 1
if cur_idx < n:
no_elec = n - cur_idx
answer += no_elec // RANGE if no_elec % RANGE == 0 else no_elec // RANGE + 1
return answer

# 위의 작업들을 동시에 수행
# 기지국 위치가 오름차순으로 정렬되어 있으니
# 기지국 마다 전파 범위의 가장 왼쪽을 구하고,
# 현재 위치와 가장 왼쪽의 index의 차이가 연속적인 0의 개수로 계산할 수 있음
# 기지국 마다 계산하니 시간초과 해결

'''
정확성 테스트
테스트 1 〉 통과 (0.00ms, 9.19MB)
테스트 2 〉 통과 (0.00ms, 9.24MB)
테스트 3 〉 통과 (0.00ms, 9.34MB)
테스트 4 〉 통과 (0.00ms, 9.21MB)
테스트 5 〉 통과 (0.01ms, 9.34MB)
테스트 6 〉 통과 (0.00ms, 9.26MB)
테스트 7 〉 통과 (0.00ms, 9.23MB)
테스트 8 〉 통과 (0.01ms, 9.2MB)
테스트 9 〉 통과 (0.00ms, 9.34MB)
테스트 10 〉 통과 (0.00ms, 9.27MB)
테스트 11 〉 통과 (0.00ms, 9.27MB)
테스트 12 〉 통과 (0.01ms, 9.27MB)
테스트 13 〉 통과 (0.01ms, 9.27MB)
테스트 14 〉 통과 (0.00ms, 9.26MB)
테스트 15 〉 통과 (0.00ms, 9.25MB)
테스트 16 〉 통과 (0.01ms, 9.23MB)
테스트 17 〉 통과 (0.01ms, 9.21MB)
테스트 18 〉 통과 (0.01ms, 9.34MB)
테스트 19 〉 통과 (0.01ms, 9.14MB)
테스트 20 〉 통과 (0.00ms, 9.2MB)
테스트 21 〉 통과 (0.02ms, 9.12MB)
효율성 테스트
테스트 1 〉 통과 (4.29ms, 9.53MB)
테스트 2 〉 통과 (4.44ms, 9.53MB)
테스트 3 〉 통과 (4.44ms, 9.61MB)
테스트 4 〉 통과 (4.43ms, 9.61MB)
채점 결과
정확성: 70.5
효율성: 29.5
합계: 100.0 / 100.0
'''