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
80 changes: 80 additions & 0 deletions week34/강성욱/baekjoon/두_용액.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
package week34.강성욱.baekjoon;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.StringTokenizer;

/**
* PackageName : week34.강성욱.baekjoon
* FileName : 두_용액
* Author : Baekgwa
* Date : 25. 12. 22.
* Description :
* =====================================================================================================================
* DATE AUTHOR NOTE
* ---------------------------------------------------------------------------------------------------------------------
* 25. 12. 22. Baekgwa Initial creation
*/
public class 두_용액 {
public class Main {
// 어짜피 두개만 선택함.
// -2, 4, -99, -1, 98
// 정렬해둘까?
// -99, -2, -1, 4, 98
// 다 확인하면? 100,000^2 = 10,000,000,000 = 백억은 좀;
// 투포인터?

public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

int N = Integer.parseInt(br.readLine()); //용액 종류
int[] map = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i=0; i<N; i++) {
map[i] = Integer.parseInt(st.nextToken());
}

// 정렬
Arrays.sort(map);

// 투포인터 탐색
int left = 0;
int right = N-1;
int nowMin = Integer.MAX_VALUE;
List<Integer> result = new ArrayList<>();

while(left < right) {
int leftVal = map[left];
int rightVal = map[right];

int sum = leftVal + rightVal;

// 현재값이 가장 작은 값인지 확인해보기
// 0에 가까운걸 찾기 때문에, 절대값으로 변환해서 사용
if(nowMin > Math.abs(sum)) {
nowMin = Math.abs(sum);
result.clear();
result.add(leftVal);
result.add(rightVal);
}

// 현재 값에 따라서, 포인터 움직이기
if(sum == 0) {
// 0 이면 더 이상 탐색할 필요도 없이, 완벽한 혼합용액
break;
} else if(sum < 0) {
// 음수인 경우에는 left 를 늘려야함
left++;
} else {
right--;
}
}

System.out.println(result.get(0) + " " + result.get(1));
}
}
}
62 changes: 62 additions & 0 deletions week34/강성욱/baekjoon/카드_정렬하기.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package week34.강성욱.baekjoon;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.PriorityQueue;

/**
* PackageName : week34.강성욱.baekjoon
* FileName : 카드_정렬하기
* Author : Baekgwa
* Date : 25. 12. 22.
* Description :
* =====================================================================================================================
* DATE AUTHOR NOTE
* ---------------------------------------------------------------------------------------------------------------------
* 25. 12. 22. Baekgwa Initial creation
*/
public class 카드_정렬하기 {
public class Main {

// 가장 작은거끼리 합해나가는게 더 이득인가?
// 50, 51, 60, 100
// (50 + 51) + (101 + 60) + (161 + 100) = 523
// (50 + 51) + (60 + 100) + (101 + 106) = 468
// 한번만 정렬할게 아니고, 계속 꾸준히 정렬이 필요
// 뭉치가 하나만 들어올 수가 있어서, 그거 처리필요.

public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
PriorityQueue<Integer> pq = new PriorityQueue<>();

int N = Integer.parseInt(br.readLine()); // 카드 묶음 수

for(int i=0; i<N; i++) {
pq.offer(Integer.parseInt(br.readLine()));
}

// 하나일 경우 처리
if(N == 1) {
System.out.println(0);
return;
}

int result = 0;
while(!pq.isEmpty()) {
int left = pq.poll();
int right = pq.poll();

int sum = left + right;
result += sum;

// 안에 비어있으면 더이상 pq 에 추가할 필요가 없음.
// 즉 마지막 연산임
if(pq.isEmpty()) continue;
pq.offer(sum);
}

System.out.println(result);
}
}
}
74 changes: 74 additions & 0 deletions week34/강성욱/baekjoon/포도주_시식.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package week34.강성욱.baekjoon;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
* PackageName : week34.강성욱.baekjoon
* FileName : 포도주_시식
* Author : Baekgwa
* Date : 25. 12. 22.
* Description :
* =====================================================================================================================
* DATE AUTHOR NOTE
* ---------------------------------------------------------------------------------------------------------------------
* 25. 12. 22. Baekgwa Initial creation
*/
public class 포도주_시식 {
public class Main {

// 가장 많은걸 마신다고 최대로 마시는게 아님.
// 든 양을 확인해야함.
// 즉, 결국 다 확인해야 함
// 이번걸 먹을껀가 아닌가?
// dp?
// dp[3] 을 구할때는, dp[1] 에서 현재껄 추가하면 되는거 아닌가?
// 6, 10, 13, 9, 8, 1
// dp[0] = 6
// dp[1] = 10
// dp[2] = 23
// 여기까진 수동으로 박아두고 4부터 점화식
// dp[3] = dp[n-1] = dp[3] = 23
// dp[3] = dp[n-2] + wine[n]
// dp[3] = dp[n-3] + wine[n-1] + wine[n]

public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine()); // 포도주 잔의 개수
int[] dp = new int[n]; // n번까지 확인해서 마셨을 때 가장 큰 경우
int[] wine = new int[n];

for(int i=0; i<n; i++) {
wine[i] = Integer.parseInt(br.readLine());
}

int now = wine[0];
if(n == 1) {
System.out.println(now);
return;
}
dp[0] = now;

now = wine[0] + wine[1];
if(n == 2) {
System.out.println(now);
return;
}
dp[1] = now;

now = Math.max(Math.max(dp[1], wine[0] + wine[2]), wine[1] + wine[2]);
if(n == 3) {
System.out.println(now);
return;
}
dp[2] = now;

for(int i=3; i<n; i++) {
dp[i] = Math.max(Math.max(dp[i-1], dp[i-2] + wine[i]), dp[i-3] + wine[i-1] + wine[i]);
}

System.out.println(dp[n-1]);
}
}
}
92 changes: 92 additions & 0 deletions week34/강성욱/baekjoon/회전_초밥.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
package week34.강성욱.baekjoon;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

/**
* PackageName : week34.강성욱.baekjoon
* FileName : 회전_초밥
* Author : Baekgwa
* Date : 25. 12. 22.
* Description :
* =====================================================================================================================
* DATE AUTHOR NOTE
* ---------------------------------------------------------------------------------------------------------------------
* 25. 12. 22. Baekgwa Initial creation
*/
public class 회전_초밥 {
public class Main {

// Set 을 써서, 중복되지 않게 해서 쭈욱 넣기
// 항상 연속된걸 먹는게 이득인가?
// 그런듯?
// Set 에 넣어두고, 최대 사이즈를 확인하면 되지 않을까
// 그리고, K+1 만큼 나오면 더이상 탐색 하지 않고 종료해도 될듯? 짜피 최대 K+1 개가 max 치잖아.
// 아, Set 쓰면, (1, 3, 3, 5, 6) 이런 흐름에서, 2개씩 뽑을때, 3 두개 있을때 한번에 다 삭제해버리는 문제 있음.

public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());

int N = Integer.parseInt(st.nextToken()); // 회전 초밥 벨트에 놓은 접시의 수
int d = Integer.parseInt(st.nextToken()); // 초밥의 가짓수
int k = Integer.parseInt(st.nextToken()); // 연속해서 먹는 접시의 수
int c = Integer.parseInt(st.nextToken()); // 쿠폰 번호

int[] belt = new int[N];
for(int i=0; i<N; i++) {
belt[i] = Integer.parseInt(br.readLine());
}

int max = 0;
int left = 0;
int right = k - 1;

// 초기값 필요함.
int distinct = 0;
int[] count = new int[d+1];
for(int i=0; i<k; i++) {
count[belt[i]]++;

if(count[belt[i]] >= 2) continue;
distinct++;
}

// 쿠폰으로 먹는거 중복 확인
max = distinct;
if(count[c] == 0) {
max++;
}

// 전체 확인
while(left < N) {
int now = belt[left]; // 이번에 뺄 스시
count[now]--;
if(count[now] == 0) {
distinct--;
}

// 스시 더하기
right = (left + k) % N;
now = belt[right];
count[now]++;
if(count[now] == 1) {
distinct++;
}

int current = distinct;
if(count[c] == 0) {
current++;
}

max = Math.max(max, current);

left++;
}

System.out.println(max);
}
}
}