코딩 테스트 풀이 체크리스트 |
|
2시간 내에 풀었는가? | O |
본인의 실력으로 풀었는가? | O |
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
import java.util.*;
class Solution {
Road[] r; //연결된 길을 모아놓은 Road 자료형 배열
int[][] times; //연결된 길의 시간을 담은 2차원 배열
boolean[] check; //방문했는지 체크용 boolean 배열
ArrayList<Integer> answer; //시간 내에 방문할 수 있는 마을 모아놓은 리턴용 ArrayList
public int solution(int N, int[][] road, int K) {
answer = new ArrayList<>();
r = new Road[N];
times = new int[N][N];
check = new boolean[N];
//매개변수인 road를 기준으로 r이랑 times 값 채우기
for (int i = 0; i < road.length; i++) {
int a = road[i][0] - 1;
int b = road[i][1] - 1;
int time = road[i][2];
if (r[a] == null) r[a] = new Road();
if (r[b] == null) r[b] = new Road();
r[a].addRoad(b);
r[b].addRoad(a);
//시간은 0을 제외하고서는 작은 값을 넣어야하기 때문에 삼항식으로 작성
times[a][b] = times[a][b] == 0 ? time : Math.min(times[a][b], time);
times[b][a] = times[b][a] == 0 ? time : Math.min(times[b][a], time);
}
check[0] = true;
func(K, 0, 0);
//리턴 값은 마을의 수이기 때문에 answer의 길이로 리턴하기
return answer.size();
}
public void func(int K, int start, int k) {
if (k > K) return; //방문에 걸린 시간인 k가 제한 시간인 K보다 작을 경우에는 그냥 리턴
if (answer.indexOf(start) == -1) answer.add(start); 그 외에는 answer에 마을 번호 추가
ArrayList<Integer> arr = r[start].arr;
if (arr == null) return; //arr가 null이면 방문할 수 있는 마을이 없기 때문에 리턴
for (int i = 0; i < arr.size(); i++) {
int num = arr.get(i);
if (check[num]) continue; //방문한 마을이면 다음으로 넘어가고
check[num] = true; //방문했다고 체크한 후
func(K, num, k + times[start][num]); //함수 호출
check[num] = false;
}
}
}
class Road {
ArrayList<Integer> arr;
public Road() {
arr = new ArrayList<>();
}
public void addRoad(int num) {
if (arr.indexOf(num) == -1) arr.add(num);
}
}
테스트 1 〉 | 통과 (0.51ms, 76.6MB) |
테스트 2 〉 | 통과 (0.26ms, 77.6MB) |
테스트 3 〉 | 통과 (0.32ms, 67.2MB) |
테스트 4 〉 | 통과 (0.30ms, 70.7MB) |
테스트 5 〉 | 통과 (0.34ms, 77.8MB) |
테스트 6 〉 | 통과 (0.46ms, 79.3MB) |
테스트 7 〉 | 통과 (0.28ms, 75.3MB) |
테스트 8 〉 | 통과 (0.25ms, 70.7MB) |
테스트 9 〉 | 통과 (0.35ms, 78.4MB) |
테스트 10 〉 | 통과 (0.32ms, 79.1MB) |
테스트 11 〉 | 통과 (0.38ms, 73.9MB) |
테스트 12 〉 | 통과 (0.41ms, 73MB) |
테스트 13 〉 | 통과 (0.39ms, 73.1MB) |
테스트 14 〉 | 통과 (1.56ms, 73.9MB) |
테스트 15 〉 | 통과 (2.56ms, 80.3MB) |
테스트 16 〉 | 통과 (0.33ms, 72.1MB) |
테스트 17 〉 | 통과 (0.33ms, 76.1MB) |
테스트 18 〉 | 통과 (0.80ms, 81.2MB) |
테스트 19 〉 | 통과 (1.60ms, 78MB) |
테스트 20 〉 | 통과 (2.27ms, 73.4MB) |
테스트 21 〉 | 통과 (2.04ms, 76.8MB) |
테스트 22 〉 | 통과 (1.04ms, 78.2MB) |
테스트 23 〉 | 통과 (2.46ms, 75.8MB) |
테스트 24 〉 | 통과 (3.92ms, 79.3MB) |
테스트 25 〉 | 통과 (2.96ms, 82.3MB) |
테스트 26 〉 | 통과 (2.55ms, 75.6MB) |
테스트 27 〉 | 통과 (3.02ms, 83.3MB) |
테스트 28 〉 | 통과 (2.75ms, 81.7MB) |
테스트 29 〉 | 통과 (5.68ms, 92MB) |
테스트 30 〉 | 통과 (2.62ms, 76.2MB) |
테스트 31 〉 | 통과 (0.50ms, 72.8MB) |
테스트 32 〉 | 통과 (4777.07ms, 81.7MB) |
이건 예전에 다른 사람 코드 보고 작성한 것 같은데, 동적계산법으로 해서 그런지 확실히 시간 복잡도가 낮음
지금 내 실력으로는 아마 이렇게 작성하는건 어려울 것 같지만.. 나중에 공부하기로...
import java.util.*;
class Solution {
int[][] times;
int[] map;
public int solution(int N, int[][] road, int K) {
int answer = 0;
times = new int[N+1][N+1];
map = new int[N+1];
Arrays.fill(map, Integer.MAX_VALUE);
for (int i = 0; i < road.length; i++){
int start = road[i][0];
int end = road[i][1];
int time = road[i][2];
int temp = times[start][end];
int temp2 = times[end][start];
times[start][end] = (temp == 0) ? time : Math.min(temp, time);
times[end][start] = (temp2 == 0) ? time : Math.min(temp2, time);
}
int[] arr = new int[N+1];
Arrays.fill(arr, 1);
funk(1, new int[N+1], 0, arr);
for (int i = 1; i < map.length; i++){
if (map[i] <= K){
answer++;
}
}
return answer+1;
}
public void funk(int num, int[] data, int ans, int[] arr){
if (num == data.length){
return;
}
if (num == 1){
data[1] = 1;
arr[1] = 0;
funk(num+1, data, ans, arr);
return;
}
for (int i = 2; i < arr.length; i++){
int time = times[data[num-1]][i];
if (arr[i] == 0 || time == 0) continue;
if (map[i] < ans+time) continue;
data[num] = i;
arr[i] = 0;
map[i] = ans + time;
funk(num+1, data, ans+time, arr);
arr[i] = 1;
data[num] = 0;
}
}
}
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[Java] 프로그래머스 - 2 x n 타일링 (2단계) (0) | 2022.07.14 |
---|---|
[JavaScript] 프로그래머스 - 배달 (2단계) (0) | 2022.07.12 |
[Java] 프로그래머스 - 두 개 뽑아서 더하기 (1단계) (0) | 2022.07.11 |
[Java] 프로그래머스 - 괄호 회전하기 (2단계) (0) | 2022.07.06 |
[Java] 프로그래머스 - 불량 사용자 (3단계) (0) | 2022.06.21 |