Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

solve: week06 SungHee #23

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
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
63 changes: 63 additions & 0 deletions src/week06/p1/Solution.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package week06.p1;

import java.util.*;

/**
* 문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/42587
* 테스트 1 〉 통과 (0.46ms, 77.1MB)
* 테스트 2 〉 통과 (0.94ms, 76.7MB)
* 테스트 3 〉 통과 (0.61ms, 77.6MB)
* 테스트 4 〉 통과 (0.41ms, 78.4MB)
* 테스트 5 〉 통과 (0.99ms, 77.3MB)
* 테스트 6 〉 통과 (0.47ms, 82.7MB)
* 테스트 7 〉 통과 (0.50ms, 79MB)
* 테스트 8 〉 통과 (0.71ms, 77.9MB)
* 테스트 9 〉 통과 (0.37ms, 76.1MB)
* 테스트 10 〉 통과 (0.46ms, 66.8MB)
* 테스트 11 〉 통과 (0.84ms, 73MB)
* 테스트 12 〉 통과 (0.38ms, 72.6MB)
* 테스트 13 〉 통과 (0.93ms, 75.1MB)
* 테스트 14 〉 통과 (0.35ms, 72.5MB)
* 테스트 15 〉 통과 (0.38ms, 75.9MB)
* 테스트 16 〉 통과 (0.42ms, 75.3MB)
* 테스트 17 〉 통과 (0.72ms, 75.6MB)
* 테스트 18 〉 통과 (0.47ms, 72.5MB)
* 테스트 19 〉 통과 (0.71ms, 78MB)
* 테스트 20 〉 통과 (0.45ms, 75.6MB)
*/

/**
* 풀이
* 1. 우선 순위로 큐 정렬
* 2. 정렬한 큐의 제일 위의 값과 priorities의 i에 해당하는 값이 같으면 poll하고 answer++함
* 3. i의 값이 구하고 싶은 프로세스 위치일 경우 answer값을 리턴
*/

class Solution {

public int solution(int[] priorities, int location) {

PriorityQueue<Integer> q = new PriorityQueue<>(Collections.reverseOrder());

for(int p : priorities) {
q.offer(p);
}

int answer = 0;

while(!q.isEmpty()) {
for (int i = 0; i < priorities.length; i++) {
if (priorities[i] == q.peek()) {
q.poll();
answer++;

if(i == location) {
return answer;
}
}
}
}

return answer;
}
}
62 changes: 62 additions & 0 deletions src/week06/p2/Solution.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package week06.p2;

import java.util.*;

/**
* 문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/42839
* 테스트 1 〉 통과 (1.98ms, 77.9MB)
* 테스트 2 〉 통과 (2.37ms, 76.6MB)
* 테스트 3 〉 통과 (1.98ms, 74.5MB)
* 테스트 4 〉 통과 (2.46ms, 72.5MB)
* 테스트 5 〉 통과 (3.34ms, 76.3MB)
* 테스트 6 〉 통과 (1.91ms, 81.6MB)
* 테스트 7 〉 통과 (1.96ms, 73.7MB)
* 테스트 8 〉 통과 (4.45ms, 75.7MB)
* 테스트 9 〉 통과 (2.70ms, 80.7MB)
* 테스트 10 〉 통과 (3.16ms, 71.2MB)
* 테스트 11 〉 통과 (2.17ms, 73.4MB)
* 테스트 12 〉 통과 (2.36ms, 78.9MB)
*/

/**
* 풀이(dfs)
* 1. num의 값이 소수 값이면 primes Set에 추가
* 2. for문으로 숫자 조합 시작
* 3. 사용된 숫자면 continue, 아니면 nextNum = num * 10 + arr[i]로 다움 숫자 구하고
* 4. isUsed[i]를 ture로 바꾼다음 dfs(nextNum)으로 재귀 호출
* 5. 다음 조합을 위해 재귀를 완료하면 isUsed[i]를 false로 변경
*/


class Solution {

boolean[] isUsed;
int[] arr;
Set<Integer> primes = new HashSet<>();

boolean isPrime(int n){
if (n <= 1) return false;
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) return false;
}
return true;
}

void dfs(int num) {
if(isPrime(num)) primes.add(num);
for(int i =0; i < arr.length; i++) {
if(isUsed[i]) continue;
int next = num * 10 + arr[i];
isUsed[i] = true;
dfs(next);
isUsed[i] = false;
}
}

public int solution(String numbers) {
arr = numbers.chars().map(c -> c - '0').toArray();
isUsed = new boolean[arr.length];
dfs(0);
return primes.size();
}
}
59 changes: 59 additions & 0 deletions src/week06/p3/Solution.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package week06.p3;

import java.util.*;

/**
* 문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/42839
* 테스트 1 〉 통과 (67.68ms, 104MB)
* 테스트 2 〉 통과 (8.39ms, 79.1MB)
* 테스트 3 〉 통과 (8.39ms, 76MB)
* 테스트 4 〉 통과 (11.27ms, 66.7MB)
*/

/**
* 풀이(dfs)
* 1. tickets를 도착 공항의 알파벳 순으로 정렬
*
* dfs시작 (target 을 "ICN"으로)
* 1. 종료 조건 (tickets의 길이와 경로 지난 횟수인 cnt가 같으면 종료)
* 2. tickets for문 돌면서
* 2-1. 방문하지 않고 시작 공항이 target과 같으면
* 2-1-1. 방문을 true 변경하고
* 2-1-2. target을 도착 공항으로 route를 "," + 도착공항, cnt +1로 dfs 재귀 호출
* 2-2-3. 방문을 false로 변경
*
* 방문을 다 확인하면 ","를 기준으로 경로를 리턴
*/


class Solution {
boolean[] visited;
ArrayList<String> answers;

public String[] solution(String[][] tickets) {
Arrays.sort(tickets, Comparator.comparing(o -> o[1]));
visited = new boolean[tickets.length];
answers = new ArrayList<>();

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


return answers.get(0).split(",");
}

void dfs(String target, String route, String[][] tickets, int cnt) {
if (cnt == tickets.length) {
answers.add(route);
return;
}

for (int i = 0; i < tickets.length; i++) {
if(!visited[i] && tickets[i][0].equals(target)) {
visited[i] = true;

dfs(tickets[i][1], route + "," + tickets[i][1], tickets, cnt+1);
visited[i] = false;
}
}
}
}