diff --git "a/src/week2/\353\251\200\353\246\254\353\233\260\352\270\260/nonani/Solution.java" "b/src/week2/\353\251\200\353\246\254\353\233\260\352\270\260/nonani/Solution.java" new file mode 100644 index 0000000..7ee1865 --- /dev/null +++ "b/src/week2/\353\251\200\353\246\254\353\233\260\352\270\260/nonani/Solution.java" @@ -0,0 +1,27 @@ +/* +## ✏️ [프로그래머스] 멀리 뛰기 +📶 문제 난이도 +Lv. 2 + +🔗 문제 링크 +https://school.programmers.co.kr/learn/courses/30/lessons/12914?language=java + +⏱️ 풀이 시간 +5분 + +✅ 풀이 근거 +고민할 필요없이 점화식이 피보나치 수열이었다. +2칸 전에 뛴 경우 + 1칸 전 뛴 경우 더해주기만 하면 되는 문제 +*/ +class Solution { + public long solution(int n) { + + int[] dp = new int[2001]; + dp[1] = 1; + dp[2] = 2; + for(int i=3;i<=n;i++) { + dp[i] = (dp[i-1] + dp[i-2]) % 1234567; + } + return dp[n]; + } +} \ No newline at end of file diff --git "a/src/week2/\354\204\254 \354\227\260\352\262\260\355\225\230\352\270\260/nonani/Solution.java" "b/src/week2/\354\204\254 \354\227\260\352\262\260\355\225\230\352\270\260/nonani/Solution.java" new file mode 100644 index 0000000..a3c0af7 --- /dev/null +++ "b/src/week2/\354\204\254 \354\227\260\352\262\260\355\225\230\352\270\260/nonani/Solution.java" @@ -0,0 +1,78 @@ +/* +## ✏️ [프로그래머스] 섬 연결하기 +📶 문제 난이도 +Lv. 3 + +🔗 문제 링크 +https://school.programmers.co.kr/learn/courses/30/lessons/42861?language=java + +⏱️ 풀이 시간 +30분 + +✅ 풀이 근거 +//MST 구하는 문제 +// Prim으로 풀어보자 +// Prim은 엣지수가 많은 상황에서 이득을 볼 수 있는 알고리즘 +// 만약 엣지수가 적은 상황에서는 크루스칼보단 성능이 떨어지는 상황이 나올 가능성이 높지만 그런 세부 지시사항은 없으니 뭘 선택하든 상관은 없을듯 +*/ + + + + + +import java.util.*; + +class Solution { + public int solution(int n, int[][] costs) { + int answer = 0; + boolean[] visited = new boolean[n]; + int cnt = 0; // 방문한 정점 개수를 카운트, N이면 다 방문한거니까 더 진행할 필요가 없음 + + //int[0] : 다음으로 방문할 노드 번호, int[1] : 그 노드까지의 이동하는 거리(간선 거리) + PriorityQueue pq = new PriorityQueue<>((o1, o2) -> { + return Integer.compare(o1[1], o2[1]); + }); + + ArrayList graph[] = new ArrayList[n]; + + for (int i = 0; i < n; i++) { + graph[i] = new ArrayList(); + } + + for (int[] cost : costs) { + int a = cost[0]; + int b = cost[1]; + int c = cost[2]; + graph[a].add(new int[]{b, c}); + graph[b].add(new int[]{a, c}); + } + + //임의의 정점하나를 고른다. + pq.add(new int[]{0, 0}); + + while (!pq.isEmpty() && cnt < n) { + // 현재 pq에 있는 후보 정점 중 거리가 가장 짧은 걸 고른다. + int[] node = pq.poll(); + int cur = node[0]; + int dist = node[1]; + + if (visited[cur]) + continue; + + visited[cur] = true; + cnt++; + answer += dist; + + // 다음 정점 후보를 고른다. + for (int i = 0; i < graph[cur].size(); i++) { + int[] nextNode = graph[cur].get(i); + int next = nextNode[0]; + int cost = nextNode[1]; + if (visited[next]) + continue; + pq.add(new int[]{next, cost}); + } + } + return answer; + } +} \ No newline at end of file diff --git "a/src/week2/\355\212\234\355\224\214/nonani/Solution.java" "b/src/week2/\355\212\234\355\224\214/nonani/Solution.java" new file mode 100644 index 0000000..d3b7457 --- /dev/null +++ "b/src/week2/\355\212\234\355\224\214/nonani/Solution.java" @@ -0,0 +1,41 @@ +/* +## ✏️ [프로그래머스] 튜플 +📶 문제 난이도 +Lv. 2 + +🔗 문제 링크 +https://school.programmers.co.kr/learn/courses/30/lessons/64065 + +⏱️ 풀이 시간 +35분 + +✅ 풀이 근거 +},{ 로 split하면 좋을 것 같다. +이후엔 길이를 기준으로 정렬한 뒤 visited set에 추가하다가 신규로 추가된 녀석을 배열에 추가는 식으로 하면 정렬도 깔끔하게 될 것 같았다. +*/ + +import java.util.*; + +class Solution { + public int[] solution(String s) { + + String[] subStrings = s.substring(2, s.length() - 2).split("\\},\\{"); + String str = ""; + Set visited = new HashSet<>(); + int[] answer = new int[subStrings.length]; + int index = 0; + + Arrays.sort(subStrings, (o1, o2) -> Integer.compare(o1.length(), o2.length())); + for (String sub : subStrings) { + for (String number : sub.split(",")) { + int value = Integer.parseInt(number); + + if (visited.add(value)) { + answer[index++] = value; + break; + } + } + } + return answer; + } +} \ No newline at end of file