Skip to content
Draft
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
31 changes: 31 additions & 0 deletions src/week3/거스름돈/Vryez11/Solution.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package week3.거스름돈.Vryez11;

public class Solution {

/**
*
* [프로그래머스] 거스름돈
*
* 문제 난이도: Lv. 3
* 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/12907
* 풀이 시간: 20분
* 풀이 근거: 타일 개수 더하기랑 비슷함, 1원으로 0원에서 1원, 1원에서 1원 더하면 2원 ... DP
*/

final static int MOD = 1_000_000_007;

public int solution(int n, int[] money) {

int[] dp = new int[n + 1];
dp[0] = 1;

for (int coin : money) {
for (int price = coin; price <= n; price++) {

dp[price] = (dp[price] + dp[price - coin]) % MOD;
}
}

return dp[n];
}
}
85 changes: 85 additions & 0 deletions src/week3/뉴스클러스터링/Vryez11/Solution.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
package week3.뉴스클러스터링.Vryez11;

import java.util.HashMap;
import java.util.Map;

public class Solution {

/**
*
* [프로그래머스] 뉴스 클러스터링
*
* 문제 난이도: Lv. 2
* 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/17677
* 풀이 시간: 30분
* 풀이 근거: Map을 통해 2자 씩 put / 이를 통해 합집합, 교집합 구하기
*/

public int solution(String str1, String str2) {

Map<String, Integer> str1Map = new HashMap<>();
Map<String, Integer> str2Map = new HashMap<>();

str1 = str1.toLowerCase();
str2 = str2.toLowerCase();

for (int i = 0; i < str1.length() - 1; i++) {

char char1 = str1.charAt(i);
char char2 = str1.charAt(i + 1);

if (!isAlphabetChar(char1, char2)) {
continue;
}

String word = (char1 + "" + char2);

str1Map.put(word, str1Map.getOrDefault(word, 0) + 1);
}
for (int i = 0; i < str2.length() - 1; i++) {

char char1 = str2.charAt(i);
char char2 = str2.charAt(i + 1);

if (!isAlphabetChar(char1, char2)) {
continue;
}

String word = (char1 + "" + char2);

str2Map.put(word, str2Map.getOrDefault(word, 0) + 1);
}

int union = 0;
int intersection = 0;

for (String key : str1Map.keySet()) {

intersection += str1Map.get(key);

if (str2Map.containsKey(key)) {
union += Math.min(str1Map.get(key), str2Map.get(key));
}
}

for (String key : str2Map.keySet()) {

intersection += str2Map.get(key);
}

System.out.println("union = " + union);
System.out.println("intersection = " + intersection);

intersection -= union;

if (union == 0 && intersection == 0) {
return 65_536;
}

return (int) (((double) union / intersection) * 65_536);
}

private boolean isAlphabetChar(char char1, char char2) {
return char1 <= 'z' && char1 >= 'a' && 'a' <= char2 && char2 <= 'z';
}
}
55 changes: 55 additions & 0 deletions src/week3/도넛과막대그래프/Solution.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package week3.도넛과막대그래프;


class Solution {

/**
*
* [프로그래머스] 도넛과 막대 그래프
*
* 문제 난이도: Lv 2
* 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/258711
* 풀이 시간: 못 품..
* 풀이 근거: 문제를 잘 읽자.., in, out 생각을 못했습니다...
*/

public int[] solution(int[][] edges) {

int max = 0;

for (int[] edge : edges) {
max = Math.max(max, Math.max(edge[0], edge[1]));
}

int[] in = new int[max + 1];
int[] out = new int[max + 1];

for (int[] edge : edges) {
out[edge[0]]++;
in[edge[1]]++;
}

int create = 0;
int stick = 0;
int eight = 0;

for (int i = 1; i <= max; i++) {

if (in[i] == 0 && out[i] >= 2) {
create = i;
}

if (in[i] >= 1 && out[i] == 0) {
stick++;
}

if (in[i] >= 2 && out[i] == 2) {
eight++;
}
}

int donut = out[create] - stick - eight;

return new int[]{create, donut, stick, eight};
}
}
104 changes: 104 additions & 0 deletions src/week3/여행결로/Vryez11/Solution.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
package week3.여행결로.Vryez11;

import java.util.*;

public class Solution {

/**
*
* [프로그래머스] 여행경로
*
* 문제 난이도: LV. 3
* 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/43164
* 풀이 시간: 30분
* 풀이 근거: 티켓을 먼저 정렬시켜서, 한 공항에서 다른 여러 공항이 있을 때, 사전 순으로 가도록 함. 그 다음 dfs로 해결
*/

private Map<String, Integer> portNumMap;
private List<Integer>[] lists;

public String[] solution(String[][] tickets) {

Arrays.sort(tickets, (o1, o2) -> {
if (o1[0].equals(o2[0])) {
return o1[1].compareTo(o2[1]);
}
return o1[0].compareTo(o2[0]);
});

portNumMap = new HashMap<>();
int idx = 0;

for (String[] ticket : tickets) {

if (!portNumMap.containsKey(ticket[0])) {
portNumMap.put(ticket[0], idx++);
}

if (!portNumMap.containsKey(ticket[1])) {
portNumMap.put(ticket[1], idx++);
}
}

lists = new ArrayList[idx];

for (int i = 0; i < idx; i++) {
lists[i] = new ArrayList<>();
}

for (int i = 0; i < tickets.length; i++) {
int from = portNumMap.get(tickets[i][0]);
lists[from].add(i);
}

boolean[] visited = new boolean[tickets.length];
List<String> answer = new ArrayList<>();

dfs("ICN", 0, tickets, visited, answer);

return answer.toArray(new String[0]);
}

private boolean dfs(String now,
int depth,
String[][] tickets,
boolean[] visited,
List<String> answer) {

answer.add(now);

if (depth == tickets.length) {
return true;
}

Integer nowNum = portNumMap.get(now);

if (nowNum == null) {
answer.remove(answer.size() - 1);
return false;
}

for (int ticketIdx : lists[nowNum]) {

if (visited[ticketIdx]) {
continue;
}

visited[ticketIdx] = true;

if (dfs(tickets[ticketIdx][1],
depth + 1,
tickets,
visited,
answer)) {
return true;
}

visited[ticketIdx] = false;
}

answer.remove(answer.size() - 1);

return false;
}
}
30 changes: 30 additions & 0 deletions src/week3/점프와순간이동/Vryez11/Solution.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package week3.점프와순간이동.Vryez11;

public class Solution {

/**
*
* [프로그래머스] 점프와 순간 이동
*
* 문제 난이도: Lv2
* 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/12980
* 풀이 시간: 20분
* 풀이 근거: 2로 나눠지면 순간 이동 / 아니면 한 칸 앞으로 가기
*/

public int solution(int n) {

int battery = 0;

while (n > 0) {
if (n % 2 == 0) {
n /= 2;
} else {
n -= 1;
battery += 1;
}
}

return battery;
}
}