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
59 changes: 59 additions & 0 deletions Junho Park/20230810/귤 고르기.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
# This is my solution for Programmers 138476
# 귤 고르기
# https://school.programmers.co.kr/learn/courses/30/lessons/138476

# initial approach --> timeout

# from itertools import combinations
# def calcDiff(tangerine):
# idx = {}
# for t in tangerine:
# idx[t] = 1
# return len(idx)

# def solution(k, tangerine):
# minDiff = k

# for set in combinations(tangerine, k):
# diff = calcDiff(set)
# if diff < minDiff:
# minDiff = diff

# return minDiff

# second approach --> timeout

# from itertools import combinations

# def solution(k, tangerine):
# minDiff = k

# for comb in combinations(tangerine, k):
# diff = len(set(comb))
# if diff < minDiff:
# minDiff = diff

# return minDiff

def solution(k, tangerine):
answer = 0
check = 0
tangerine.sort()
dup = {}
for i in tangerine:
if i in dup:
dup[i] += 1
else:
dup[i] = 1

arr = sorted(dup.items(), key=lambda x: x[1], reverse=True)
if arr[0][1] >= k:
return 1
else:
for i in arr:
if check < k:
check += i[1]
answer += 1
else:
break
return answer
28 changes: 28 additions & 0 deletions Junho Park/20230810/뒷 큰수.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# This is my solution for Programmers 154539
# 뒤에 있는 큰 수 찾기
# https://school.programmers.co.kr/learn/courses/30/lessons/154539

# def solution(numbers):
# answer = []
# length = len(numbers)
# for i in range(length):
# backNum = -1
# for j in range(i+1, length):
# if numbers[i] < numbers[j]:
# backNum = numbers[j]
# break
# answer.append(backNum)
# return answer

def solution(numbers):
stack = []
answer = [0] * len(numbers)

for i in range(len(numbers)):
while stack and numbers[stack[-1]] < numbers[i]:
answer[stack.pop()] = numbers[i]
stack.append(i)
while stack:
answer[stack.pop()] = -1

return answer
45 changes: 45 additions & 0 deletions Junho Park/20230810/양궁.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# This is my solution for Programmers 92342
# 양궁대회
# https://school.programmers.co.kr/learn/courses/30/lessons/92342

from itertools import combinations_with_replacement
from collections import defaultdict


def compare(ryan, apeach, win_dict): # 승패 판단
ryan_score = 0
apeach_score = 0

for i in range(11): # 점수 계산
if apeach[i] >= ryan[i]:
if apeach[i] == 0:
continue
apeach_score += 10 - i
else:
ryan_score += 10 - i

if ryan_score > apeach_score: # 라이언이 이겼으면 win_dict에 {점수 차 : [라이언 결과들]} 형태로 같은 점수 차를 갖는 라이언 결과들을 모음
win_dict[ryan_score - apeach_score].append(ryan)
return win_dict


def solution(n, info):
cases = list(combinations_with_replacement([i for i in range(11)], n))
cands = []
win_dict = defaultdict(list)

for case in cases: # 중복조합을 이용하여 라이언을 쏠 수 있는 모든 경우의 수를 구함
ryan = [0] * 11
for i in case:
ryan[i] += 1
cands.append(ryan)

for cand in cands:
win_dict = compare(cand, info, win_dict) # 이긴 것만 win_dict에 기록

if not win_dict: # 한번도 이길 수 없다면
return [-1]

target = win_dict[max(win_dict.keys())] # 점수 차가 가장 큰 라이언 결과들
target.sort(key=lambda x: tuple([-x[i] for i in range(10, -1, -1)])) # 문제의 조건에 따라 정렬
return target[0]