Skip to content

Commit 8d66f97

Browse files
authored
Merge pull request #7 from java-squid/ragdoll
4회차
2 parents ebb1cbf + 593590d commit 8d66f97

File tree

11 files changed

+262
-0
lines changed

11 files changed

+262
-0
lines changed

06--greedy/ragdoll/baekjoon/11047.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# 문제 조건에 의해 주어지는 동전은 오름차순 정렬
2+
# => 동전의 최소 개수를 구하는 것이기 때문에 가장 큰 동전부터 탐색 (마지막 인덱스부터)
3+
4+
import sys
5+
6+
input = sys.stdin.readline
7+
8+
coin_count, target = map(int, input().split())
9+
10+
coins = [int(input()) for _ in range(coin_count)]
11+
12+
result = 0
13+
14+
for i in range(coin_count - 1, -1, -1):
15+
if coins[i] <= target:
16+
result += target // coins[i]
17+
target %= coins[i]
18+
19+
print(result)

06--greedy/ragdoll/baekjoon/1541.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
numbers = [[int(number) for number in sums.split('+')] for sums in (input().split('-'))]
2+
3+
sums = []
4+
for number in numbers:
5+
sums.append(sum(number))
6+
7+
result = sums[0]
8+
for i in range(1, len(sums)):
9+
result -= sums[i]
10+
11+
print(result)
12+
13+
# 마이너스 기준으로 split
14+
# 플러스 기준으로 다시 split
15+
# 마이너스 기준으로 split 된 숫자의 총합을 모두 마이너스 연산

06--greedy/ragdoll/baekjoon/1715.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# (a, b) => (a + b, c) => (a + b + c, d) => ...
2+
# 이전 수행까지의 합을 최대한 작게 해야 비교 횟수가 작아진다.
3+
# 데이터의 삽입, 삭제가 발생할 때 정렬을 필요로 하면 다른 컬렉션보다 우선순위 큐 사용을 고려한다.
4+
5+
import sys
6+
from queue import PriorityQueue
7+
8+
input = sys.stdin.readline
9+
card_count = int(input())
10+
cards = PriorityQueue()
11+
12+
result = 0
13+
14+
for _ in range(card_count):
15+
cards.put(int(input()))
16+
17+
while cards.qsize() > 1:
18+
card1 = cards.get()
19+
card2 = cards.get()
20+
sum = card1 + card2
21+
result += sum
22+
cards.put(sum)
23+
24+
print(result)

06--greedy/ragdoll/baekjoon/1744.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
# 수열의 크기 : n, 0 < n <= 50
2+
# 수열의 수 : x, -1000 <= x <= 1000
3+
# 1. 정렬 이후 뒷 인덱스부터 곱하기
4+
# 2. 0은 곱셈 대상에서 제외
5+
# 3. (-m) * (-n) 가능
6+
7+
number_count = int(input())
8+
negative_numbers = []
9+
zero_numbers = []
10+
positive_numbers = []
11+
12+
for _ in range(number_count):
13+
number = int(input())
14+
if number > 0:
15+
positive_numbers.append(number)
16+
if number < 0:
17+
negative_numbers.append(number)
18+
if number == 0:
19+
zero_numbers.append(number)
20+
21+
negative_numbers.sort(reverse=True)
22+
positive_numbers.sort()
23+
24+
result = 0
25+
rest_positive_number = 0
26+
while positive_numbers:
27+
temp = []
28+
while positive_numbers and len(temp) < 2:
29+
temp.append(positive_numbers.pop())
30+
31+
if len(temp) == 2:
32+
number1 = temp.pop()
33+
number2 = temp.pop()
34+
result += (number1 * number2)
35+
elif len(temp) == 1:
36+
rest_positive_number = temp.pop()
37+
break
38+
39+
rest_negative_number = 0
40+
while negative_numbers:
41+
temp = []
42+
while negative_numbers and len(temp) < 2:
43+
temp.append(negative_numbers.pop())
44+
45+
if len(temp) == 2:
46+
number1 = temp.pop()
47+
number2 = temp.pop()
48+
result += (number1 * number2)
49+
elif len(temp) == 1:
50+
rest_negative_number = temp.pop()
51+
break
52+
53+
if not zero_numbers:
54+
result += (rest_positive_number + rest_negative_number)
55+
56+
if len(zero_numbers) >= 1:
57+
result += rest_positive_number
58+
result += (rest_negative_number * 0)
59+
60+
print(result)
61+
62+
# 반례를 못찾음
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
from queue import PriorityQueue
2+
3+
number_count = int(input())
4+
positive_queue = PriorityQueue()
5+
negative_queue = PriorityQueue()
6+
7+
one = 0
8+
zero = 0
9+
10+
for i in range(number_count):
11+
number = int(input())
12+
13+
if number > 1:
14+
positive_queue.put(number * -1)
15+
elif number == 1:
16+
one += 1
17+
elif number == 0:
18+
zero += 1
19+
else:
20+
negative_queue.put(number)
21+
22+
sum = 0
23+
24+
while positive_queue.qsize() > 1:
25+
first = positive_queue.get() * (-1)
26+
second = positive_queue.get() * (-1)
27+
sum += first * second
28+
29+
if positive_queue.qsize() > 0:
30+
sum += positive_queue.get() * (-1)
31+
32+
while negative_queue.qsize() > 1:
33+
first = negative_queue.get()
34+
second = negative_queue.get()
35+
sum += first * second
36+
37+
if negative_queue.qsize() > 0:
38+
if zero == 0:
39+
sum += negative_queue.get()
40+
41+
sum += one
42+
print(sum)

06--greedy/ragdoll/baekjoon/1931.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import sys
2+
from collections import OrderedDict
3+
4+
input = sys.stdin.readline
5+
6+
schedule_count = int(input())
7+
8+
schedules = {}
9+
for _ in range(schedule_count):
10+
start_time, end_time = map(int, input().split())
11+
12+
if start_time not in schedules:
13+
schedules[start_time] = end_time
14+
continue
15+
16+
if schedules.get(start_time) > end_time:
17+
schedules[start_time] = end_time
18+
19+
result = 0
20+
ordered_schedules = OrderedDict(sorted(schedules.items()))
21+
current_start_time, current_end_time = ordered_schedules.popitem(last=False)
22+
for start_time, end_time in ordered_schedules.items():
23+
if start_time >= current_end_time:
24+
result += 1
25+
26+
print(result)
27+
28+
# Fail
29+
# 시작시간 == 끝 시간이 같을 수 있다는 의미: 이전 회의 종료시간,
30+
# 1. 다음 회의 시작시간이 겹칠 수 있다는 것 아니라
31+
# 2. (2, 2)와 같은 케이스가 존재할 수 있다
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
schedule_count = int(input())
2+
schedules = [[0] * 2 for _ in range(schedule_count)]
3+
4+
for i in range(schedule_count):
5+
start_time, end_time = map(int, input().split())
6+
schedules[i][0] = end_time
7+
schedules[i][1] = start_time
8+
9+
schedules.sort()
10+
count = 0
11+
end_time = -1
12+
13+
for i in range(schedule_count):
14+
if schedules[i][1] >= end_time:
15+
end_time = schedules[i][0]
16+
count += 1
17+
18+
print(count)
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
from typing import List
2+
3+
4+
class Solution:
5+
def containsDuplicate(self, nums: List[int]) -> bool:
6+
number_map = {}
7+
8+
for number in nums:
9+
if number in number_map:
10+
return True
11+
else:
12+
number_map[number] = 1
13+
14+
return False
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
from typing import List
2+
3+
4+
class Solution:
5+
def twoSum(self, nums: List[int], target: int) -> List[int]:
6+
numbers = sorted(nums)
7+
left = 0
8+
right = len(numbers) - 1
9+
10+
while left < right:
11+
sum = numbers[left] + numbers[right]
12+
if sum == target:
13+
if numbers[left] == numbers[right]:
14+
left_index = nums.index(numbers[left])
15+
right_index = nums.index(numbers[right], left_index + 1)
16+
return [left_index, right_index]
17+
else:
18+
return [nums.index(numbers[left]), nums.index(numbers[right])]
19+
20+
if sum < target:
21+
left += 1
22+
elif sum > target:
23+
right -= 1
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
class Solution:
2+
def isAnagram(self, s: str, t: str) -> bool:
3+
return sorted(s) == sorted(t)

06--greedy/ragdoll/notes.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
## Python
2+
### 2차원 배열의 정렬
3+
- `sort()` 호출 시 앞 내부 구성요소의 앞 인덱스부터 마지막 인덱스까지 오름차순 순차 정렬
4+
```python
5+
# Ex
6+
arr = [[4, 2], [4, 1], [3, 1], [3, 2]]
7+
arr.sort()
8+
9+
# after sorted
10+
# => [[3, 1], [3, 2], [4, 1], [4, 2]]
11+
```

0 commit comments

Comments
 (0)