Skip to content

Commit d0deb81

Browse files
authored
Merge pull request #208 from AlgorithmStudy-Allumbus/minjeong3
Minjeong / 5월 2주차 / 8문제
2 parents 91d3b68 + 18f9e8c commit d0deb81

8 files changed

+274
-0
lines changed
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import sys
2+
3+
input = sys.stdin.readline
4+
5+
def main():
6+
N = int(input()) # 지방의 수
7+
budgets = sorted(map(int, input().split())) # 각 지방의 예상요청
8+
M = int(input()) # 총 예산
9+
10+
# 1. 모든 요청이 배정될 수 있는 경우, 요청 최대값이 정답
11+
if sum(budgets) <= M:
12+
return budgets[-1]
13+
14+
# 2. 모든 요청이 배정될 수 없는 경우, 상한액 탐색
15+
left = 0
16+
right = budgets[-1]
17+
answer = 0
18+
19+
while left <= right:
20+
mid = (left + right) // 2 # 상한액
21+
total = 0
22+
for b in budgets:
23+
total += min(b, mid)
24+
25+
if total <= M:
26+
# 이 상한액으로 배정해도 총액이 허용 범위 이내 → C를 더 높여 볼 수 있음
27+
answer = mid
28+
left = mid + 1
29+
else:
30+
# 총액이 초과 → 상한액을 낮춰야 함
31+
right = mid - 1
32+
33+
return answer
34+
35+
36+
if __name__ == '__main__':
37+
print(main())
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import sys
2+
3+
input = sys.stdin.readline
4+
5+
6+
def setOptions(option):
7+
# 1. 각 단어의 첫 글자 우선 확인
8+
for i in range(len(option)):
9+
if option[i][0].upper() not in shortcut_key:
10+
shortcut_key.add(option[i][0].upper())
11+
option[i] = f"[{option[i][0]}]{option[i][1:]}"
12+
return option
13+
14+
# 2. 전체 단어의 모든 글자 중 아직 등록되지 않은 글자 탐색
15+
for i in range(len(option)):
16+
for j in range(len(option[i])):
17+
if option[i][j].upper() not in shortcut_key:
18+
shortcut_key.add(option[i][j].upper())
19+
option[i] = f"{option[i][:j]}[{option[i][j]}]{option[i][j + 1:]}"
20+
return option
21+
22+
# 3. 지정할 수 있는 단축키가 없는 경우
23+
return option
24+
25+
26+
N = int(input())
27+
shortcut_key = set()
28+
29+
for _ in range(N):
30+
option = input().split()
31+
result = setOptions(option)
32+
print(' '.join(result))
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import sys
2+
input = sys.stdin.readline
3+
4+
# 1. 입력받기
5+
w, h = map(int, input().split()) # 가로, 세로
6+
store_cnt = int(input()) # 상점의 개수
7+
8+
# 2. 둘레 계산
9+
perimeter = 2 * (w + h)
10+
11+
# 3. (방향, 거리) -> 1차원 위치로 변환 함수
12+
def to_pos(dir, dist):
13+
if dir == 1: # 북
14+
return dist
15+
if dir == 2: # 남
16+
return w + h + (w - dist)
17+
if dir == 3: # 서
18+
return 2*w + h + (h - dist)
19+
if dir == 4: # 동
20+
return w + dist
21+
22+
23+
# 4. 모든 상점의 위치를 1차원 조표로 변환해서 리스트에 모으기
24+
store_loc = [] # 상점의 위치
25+
for _ in range(store_cnt):
26+
d, dist = map(int, input().split())
27+
store_loc.append(to_pos(d, dist))
28+
29+
# 5. 경비원 위치도 똑같이 변환
30+
gd, gdist = map(int, input().split())
31+
guard_pos = to_pos(gd, gdist)
32+
33+
# print(f"store: {store_loc}")
34+
# print(f"guard: {guard_pos}")
35+
36+
# 6. 각 상점까지 최단 거리 구해서 합산
37+
total = 0
38+
for store in store_loc:
39+
diff = abs(store - guard_pos)
40+
# 시계방향 <-> 반시계방향 중 짧은 거리 선택
41+
total += min(diff, perimeter - diff)
42+
43+
# 7. 결과 출력
44+
print(total)
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import java.util.*;
2+
3+
class Solution {
4+
boolean solution(String s) {
5+
// "(" 이면 stack에 push. ")"이면 stack에서 pop하기
6+
// stack의 길이가 0이면 true, stack의 길이가 1이상이면 false
7+
8+
// Stack ArrayList
9+
ArrayList<Integer> stack = new ArrayList<>();
10+
11+
// 문자열을 ArrayList로 변환
12+
String[] stringParam = s.split("");
13+
ArrayList<String> list = new ArrayList<String>(Arrays.asList(stringParam));
14+
15+
// Stack Push & Pop
16+
for (String str: stringParam){
17+
// System.out.println(str);
18+
if (str.equals("(")) {
19+
stack.add(0);
20+
// System.out.println("추가 완료");
21+
}
22+
else {
23+
// 처음부터 ) 가 나올 경우 올바르지 않은 괄호
24+
if (stack.size() == 0){
25+
return false;
26+
}
27+
else {
28+
stack.remove(stack.size() - 1);
29+
}
30+
}
31+
}
32+
33+
// 올바른 괄호가 아닐 경우
34+
if (stack.size() > 0) {
35+
return false;
36+
}
37+
// 올바른 괄호가 아닌 경우
38+
return true;
39+
}
40+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import java.util.*;
2+
3+
class Solution {
4+
public int[] solution(int[] progresses, int[] speeds) {
5+
ArrayList<Integer> answer = new ArrayList<>();
6+
ArrayList<Integer> queue = new ArrayList<>();
7+
8+
for (int i=0; i < progresses.length; i++){
9+
int days = (int) Math.ceil((100.0 - progresses[i]) / speeds[i]);
10+
if (queue.size() > 0 && days > queue.get(0)) {
11+
answer.add(queue.size());
12+
queue.clear();
13+
queue.add(days);
14+
15+
}
16+
else {
17+
queue.add(days);
18+
}
19+
}
20+
answer.add(queue.size());
21+
22+
// 배열로 변환
23+
int[] arr = answer.stream()
24+
.mapToInt(Integer::intValue)
25+
.toArray();
26+
27+
return arr;
28+
}
29+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import java.util.*;
2+
3+
class Solution {
4+
public int solution(int[] priorities, int location) {
5+
// 1) 작업 큐: 인덱스(idx)와 우선순위(priority)를 함께 보관
6+
Queue<DTO> queue = new LinkedList<>();
7+
8+
// 2) 우선순위 큐: 남아있는 작업 중 가장 높은 우선순위를 꺼내기 위함
9+
PriorityQueue<Integer> pq = new PriorityQueue<>(Collections.reverseOrder());
10+
11+
for (int i = 0 ; i < priorities.length; i++) {
12+
queue.offer(new DTO(i, priorities[i]));
13+
pq.offer(priorities[i]);
14+
}
15+
16+
// System.out.println(queue);
17+
// System.out.println(pq);
18+
19+
int count = 0; // 실행된 작업 수
20+
21+
while(!queue.isEmpty()) {
22+
DTO cur = queue.poll(); // 현재 작업 꺼냄
23+
24+
// 현재 작업 우선순위가 남은 작업의 최고 우선순위와 같다면
25+
if(cur.priority == pq.peek()) {
26+
count++;
27+
pq.poll(); // 우선순위 큐에서 제거
28+
// 내가 찾던 작업이라면 실행 순서 반환
29+
if (cur.idx == location) {
30+
return count;
31+
}
32+
}
33+
else {
34+
// 우선순위가 더 높은 작업이 남아있다면 뒤로 재삽입
35+
queue.offer(cur);
36+
}
37+
}
38+
return count;
39+
}
40+
41+
// 인덱스 + 우선순위를 함께 보관할 DTO
42+
static class DTO {
43+
int idx;
44+
int priority;
45+
DTO(int idx, int priority) {
46+
this.idx = idx;
47+
this.priority = priority;
48+
// System.out.println("idx: "+idx+" priority: "+priority);
49+
}
50+
}
51+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import java.util.*;
2+
3+
public class Solution {
4+
public int[] solution(int []arr) {
5+
ArrayList<Integer> answer = new ArrayList<>();
6+
7+
// 1. 첫 번째 값은 무조건 추가
8+
answer.add(arr[0]);
9+
10+
// 2. 두 번째 값부터 순차적으로 확인
11+
for (int i = 1; i < arr.length; i++) {
12+
// 바로 이전 값과 다르면 추가
13+
if (answer.get(answer.size()-1) != arr[i]) {
14+
answer.add(arr[i]);
15+
}
16+
}
17+
18+
// 3. ArrayList → int[] 변환
19+
int[] answer2 = new int[answer.size()];
20+
for (int i = 0; i < answer.size(); i++){
21+
answer2[i] = answer.get(i);
22+
}
23+
return answer2;
24+
}
25+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import java.util.*;
2+
3+
class Solution {
4+
public boolean solution(String[] phone_book) {
5+
6+
Arrays.sort(phone_book); // 오름차순 정렬
7+
8+
for (int i = 0; i < phone_book.length - 1; i++ ) {
9+
// 만약 다음 값이 현재 값으로 시작한다면, false 반환
10+
if (phone_book[i+1].startsWith(phone_book[i])) {
11+
return false;
12+
}
13+
}
14+
return true;
15+
}
16+
}

0 commit comments

Comments
 (0)