Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
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
46 changes: 46 additions & 0 deletions personal/JAEHEE25/PGS/문자열_압축.java
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
import java.util.*;

class Solution {
public int solution(String s) {
int answer = Integer.MAX_VALUE;
int len = 1; //단위
int N = s.length();

while (len <= N) {
StringBuilder resultBuilder = new StringBuilder();
StringBuilder wordBuilder = new StringBuilder();
String prev = "";
String word = "";
int cnt = 0;
for (int i = 0; i <= N; i++) {
word = wordBuilder.toString();
if (word.length() == len) {
if (prev.equals("")) { //맨 처음일 경우 prev에 저장
prev = word;
cnt++;
} else if (prev.equals(word)) { //연속된 단어일 경우 개수 카운트
cnt++;
} else { //새로운 단어일 경우 이전 단어 기록
if (cnt <= 1) resultBuilder.append(prev);
else resultBuilder.append(cnt + prev);
prev = word;
cnt = 1;
}
wordBuilder = new StringBuilder(); //초기화
}
if (i < N) wordBuilder.append(s.charAt(i));
}

//마지막 처리
if (cnt <= 1) resultBuilder.append(prev);
else resultBuilder.append(cnt + prev);
resultBuilder.append(wordBuilder.toString()); //남은 글자들

//정답 구하기
answer = Math.min(resultBuilder.length(), answer);
len++;
}

return answer;
}
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
package week05.BOJ_14002_가장긴증가하는부분수열4;

import java.util.*;
import java.lang.*;
import java.io.*;

class BOJ14002 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
int[] arr = new int[N];
for (int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}

int[] dp = new int[N];
for (int i = 0; i < N; i++) {
dp[i] = 1;
for (int j = 0; j < i; j++) {
if (arr[j] < arr[i]) {
dp[i] = Math.max(dp[i], dp[j] + 1);
}
}
}

StringBuilder answer = new StringBuilder();
int max = 0;
for (int i = 0; i < N; i++) {
if (dp[i] > max) {
max = dp[i];
}
}
answer.append(max).append("\n");

Stack<Integer> stack = new Stack<>();
for (int i = N - 1; i >= 0; i--) {
if (dp[i] == max) {
stack.push(arr[i]);
max--;
}
}

while (!stack.isEmpty()) {
answer.append(stack.pop()).append(" ");
}

System.out.println(answer);
}
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Queue;
import java.util.Stack;
import java.util.StringTokenizer;

public class Main {

public static void main(String[] args) throws IOException {

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();

int n = Integer.parseInt(br.readLine());

int[] arr = new int[n];
int[] dp = new int[n];
int[] rev = new int[n]; // 역추적 배열

for (int i = 0; i < n; i++) {
rev[i] = -1;
}

String line = br.readLine();
StringTokenizer st = new StringTokenizer(line);
for (int i = 0; i < n; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}

dp[0] = 1;
int maxVal = 0;
int maxIdx = 0;
for (int i = 0; i < n; i++) {
int prevVal = 0;
int prevIdx = 0;
for (int j = 0; j < i; j++) {
if (arr[i] > arr[j]) {
if (prevVal < dp[j]) {
prevVal = dp[j];
prevIdx = j;
}
}
}

dp[i] = prevVal + 1;
if (prevVal == 0) {
rev[i] = -1;
}
else {
rev[i] = prevIdx;
}

// 최댓값 갱신
if (maxVal < dp[i]) {
maxVal = dp[i];
maxIdx = i;
}
}

sb.append(maxVal).append("\n");

int idx = maxIdx;
int[] ans = new int[maxVal];
int ansIdx = 0;
while (idx != -1) {
ans[ansIdx] = arr[idx];
idx = rev[idx];
ansIdx++;
}

for (int i = maxVal - 1; i >= 0; i--) {
sb.append(ans[i]).append(' ');
}

System.out.print(sb);
}
}
43 changes: 43 additions & 0 deletions weekly/week05/BOJ_1781_컵라면/JAEHEE25.java
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
package week05.BOJ_1781_컵라면;
import java.util.*;
import java.lang.*;
import java.io.*;

class BOJ1781 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[][] works = new int[N][2]; //데드라인, 컵라면 수
for (int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
works[i][0] = Integer.parseInt(st.nextToken());
works[i][1] = Integer.parseInt(st.nextToken());
}

Arrays.sort(works, (o1, o2) -> {
if (o1[0] == o2[0]) return o2[1] - o1[1];
return o1[0] - o2[0];
});

PriorityQueue<Integer> pq = new PriorityQueue<>(); //푼 문제의 컵라면 수 저장
for (int i = 0; i < N; i++) {

//pq 사이즈 == 푼 문제 수 == 사용한 시간과 데드라인 시간 비교
if (pq.size() < works[i][0]) {
pq.offer(works[i][1]);
} else {
if (pq.peek() < works[i][1]) { //기존에 풀었던 문제의 컵라면 수보다 크면 교체
pq.poll();
pq.offer(works[i][1]);
}
}
}

//출력
int answer = 0;
while (!pq.isEmpty()) {
answer += pq.poll();
}
System.out.println(answer);
}
}
70 changes: 70 additions & 0 deletions weekly/week05/BOJ_1781_컵라면/sukangpunch.java
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
package study.week05;

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

// 컵라면
public class BOJ_1781 {

static class Problem implements Comparable<Problem> {

int deadLine;
int cup;

public Problem(int deadLine, int cup) {
this.deadLine = deadLine;
this.cup = cup;
}

@Override
public int compareTo(Problem o) {
if (this.deadLine == o.deadLine) {
return o.cup - this.cup;
}
return this.deadLine - o.deadLine;
}
}

static PriorityQueue<Problem> pq;
static int N;

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

N = Integer.parseInt(br.readLine());
pq = new PriorityQueue<>();

for (int i = 0; i < N; i++) {
String[] s = br.readLine().split(" ");
int deadLine = Integer.parseInt(s[0]);
int cup = Integer.parseInt(s[1]);
pq.add(new Problem(deadLine, cup));
}

PriorityQueue<Integer> select = new PriorityQueue<>();

while(!pq.isEmpty()){
Problem problem = pq.poll();
int deadLine = problem.deadLine;
int cup = problem.cup;

if(select.size() < deadLine){
select.offer(cup);
}else{
if(!select.isEmpty() && select.peek() < cup){ // 만약 선택한 문제 중 가장 적은 컵라면보다 현재 추가하려는 problem 의 컵라면 개수가 더 많다면
select.poll();
select.offer(cup);
}
}
}

long result = 0;
for(int cup : select){
result += cup;
}

System.out.println(result);
}
}
44 changes: 44 additions & 0 deletions weekly/week05/BOJ_1781_컵라면/whqtker.cpp
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>

using namespace std;

int main() {
int n;
cin >> n;

vector<pair<int, int>> v;
for (int i = 0; i < n; i++) {
int a, b;
cin >> a >> b;
v.push_back({ a,b });
}

// 데드라인 순으로 정렬
sort(v.begin(), v.end());

// 처리 가능한 과제 저장
priority_queue<int,vector<int>,greater<int>> pq;

for (int i = 0; i < n; i++) {
int deadline = v[i].first;
int cnt = v[i].second;
pq.push(cnt);

// 데드라인을 초과하는 경우 가장 개수가 작은 것을 버린다.
// v[i]를 처리하기 위해서는 pq의 크기가 deadline보다 작거나 같아야 한다.
if (pq.size() > deadline) {
pq.pop();
}
}

long long ans = 0;
while (!pq.empty()) {
ans += pq.top();
pq.pop();
}

cout << ans;
}
51 changes: 51 additions & 0 deletions weekly/week05/BOJ_6236_용돈관리/JAEHEE25.java
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
package week05.BOJ_6236_용돈관리;

import java.util.*;
import java.lang.*;
import java.io.*;

class BOJ6236 {
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 M = Integer.parseInt(st.nextToken());
int[] money = new int[N];
int max = 0;
for (int i = 0; i < N; i++) {
money[i] = Integer.parseInt(br.readLine());
max = Math.max(money[i], max); //최대 금액을 최솟값으로 설정
}

int answer = 0;
int left = max;
int right = 10000 * 100000;
while (left <= right) {
int K = (left + right) / 2;

//결과 계산
int result = getWithdrawCnt(money, K, M);

if (M >= result) {
answer = K;
right = K - 1;
} else {
left = K + 1;
}
}
System.out.println(answer);
}

static int getWithdrawCnt(int[] money, int K, int M) {
int withdrawCnt = 1;
int now = K;
for (int i = 0; i < money.length; i++) {
if (money[i] > now) { //모자라면 K원 인출
withdrawCnt++;
now = K;
}
now -= money[i];
}
return withdrawCnt;
}
}
Loading
Loading