잡다한 배똥월드

728x90
코딩 테스트 풀이 체크리스트
2시간 내에 풀었는가? O
본인의 실력으로 풀었는가? O

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

 

 

import java.util.*;
class Solution {
    public int solution(int bridge_length, int weight, int[] truck_weights) {
        
        int w = 0; //다리 위에 있는 트럭의 무게
        int time = 0; //걸린 시간
        int position = 0; //지나야할 트럭의 순서를 기록
        
        ArrayList<Integer> bridge = new ArrayList<>(); //다리 위의 모습을 표현할 용도
        int finished = 0; //지난 트럭의 갯수
        
        //다리를 지난 트럭의 수가 총 트럭 수보다 작을 동안만 반복
        while (finished < truck_weights.length) { 
            time++; //시간+1
            
            다리 위에 있는 트럭이 length와 같다면 한 개씩은 앞에서부터 지워줘야 함
            if (bridge.size() == bridge_length) {
                int num = bridge.remove(0); //제일 앞에 있는 트럭 제거
                if (num != -1) { //만약 num이 -1이 아니면 무게가 있는 트럭이라는 뜻이기 때문에
                    w -= num; //다리 위에 있는 트럭의 무게에서 현재 다 지나온 트럭의 무게 빼주고
                    finished++; //통과한 트럭의 개수는 추가
                }
            }
            
            //아직 다리위에 올라가지 않은 트럭이 있고,
            //그 무게가 현재 다리 위에 있는 트럭의 무게와 더해도 감당할 수 있는 무게라면 다리 위로 올림
            if (truck_weights.length > position && w + truck_weights[position] <= weight) {
                w += truck_weights[position];
                bridge.add(truck_weights[position]);
                position++;
            } else { //그렇지 않으면 그냥 빈 칸 추가
                bridge.add(-1);
            }
        }
        
        return time; //마지막에 걸린 시간 리턴하기
    }
}

 

테스트 1 통과 (1.00ms, 78.4MB)
테스트 2 통과 (23.91ms, 81.1MB)
테스트 3 통과 (0.05ms, 74.3MB)
테스트 4 통과 (9.74ms, 84.5MB)
테스트 5 통과 (113.49ms, 87.9MB)
테스트 6 통과 (27.48ms, 88.1MB)
테스트 7 통과 (0.81ms, 76.9MB)
테스트 8 통과 (0.32ms, 76.3MB)
테스트 9 통과 (2.22ms, 78.6MB)
테스트 10 통과 (0.34ms, 72.3MB)
테스트 11 통과 (0.04ms, 82MB)
테스트 12 통과 (0.48ms, 77.4MB)
테스트 13 통과 (0.89ms, 75.3MB)
테스트 14 통과 (0.06ms, 77.9MB)

 

 

 

 

 

 

728x90
728x90
코딩 테스트 풀이 체크리스트
2시간 내에 풀었는가? O
본인의 실력으로 풀었는가? O

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

 

 

function solution(clothes) {
    var answer = 1;
    let hash = new Array();
    
    for (var i = 0; i < clothes.length; i++) {
        if (hash[clothes[i][1]] == null) hash[clothes[i][1]] = 0;
        hash[clothes[i][1]]++;
    }
    
    for (let key in hash) {
        answer *= hash[key] + 1;
    }
    return answer - 1;
}

 

테스트 1 통과 (0.13ms, 29.9MB)
테스트 2 통과 (0.08ms, 30.1MB)
테스트 3 통과 (0.11ms, 30.1MB)
테스트 4 통과 (0.13ms, 30MB)
테스트 5 통과 (0.30ms, 30.1MB)
테스트 6 통과 (0.08ms, 30.1MB)
테스트 7 통과 (0.26ms, 29.9MB)
테스트 8 통과 (0.12ms, 30.2MB)
테스트 9 통과 (0.07ms, 30MB)
테스트 10 통과 (0.08ms, 30.1MB)
테스트 11 통과 (0.11ms, 30MB)
테스트 12 통과 (0.13ms, 30MB)
테스트 13 통과 (0.12ms, 29.9MB)
테스트 14 통과 (0.11ms, 30MB)
테스트 15 통과 (0.25ms, 30.2MB)
테스트 16 통과 (0.06ms, 29.9MB)
테스트 17 통과 (0.08ms, 30MB)
테스트 18 통과 (0.11ms, 30.1MB)
테스트 19 통과 (0.11ms, 30MB)
테스트 20 통과 (0.07ms, 30MB)
테스트 21 통과 (0.07ms, 30.1MB)
테스트 22 통과 (0.07ms, 30MB)
테스트 23 통과 (0.08ms, 29.8MB)
테스트 24 통과 (0.08ms, 30MB)
테스트 25 통과 (0.11ms, 30MB)
테스트 26 통과 (0.26ms, 30.1MB)
테스트 27 통과 (0.07ms, 30.1MB)
테스트 28 통과 (0.27ms, 30.1MB)

 

 

 

 

 

자세한 설명은 자바 코드에서 확인 가능!

 

 

 

[Java] 프로그래머스 - 위장 (2단계)

코딩 테스트 풀이 체크리스트 2시간 내에 풀었는가? O 본인의 실력으로 풀었는가? O 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을

b-sseung.tistory.com

 

 

 

 

 

 

728x90
728x90
코딩 테스트 풀이 체크리스트
2시간 내에 풀었는가? O
본인의 실력으로 풀었는가? O

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

 

 

import java.util.*;
class Solution {
    public int solution(String[][] clothes) {
        HashMap<String, Integer> hash = new HashMap<>();
        
        //곱셈을 해야 해서 1부터 시작
        int answer = 1;
        
        //종류별로 해시에 모으기
      	//이름은 상관 없기 때문에 숫자로 계산
        for (int i = 0; i < clothes.length; i++) {
            hash.put(clothes[i][1], hash.getOrDefault(clothes[i][1], 0) + 1);
        }
        
        //1을 더하는 이유는 해당 옷을 입지 않는 경우를 포함해야 하기 때문임
        for (String key : hash.keySet()) {
            answer *= hash.get(key) + 1;
        }
        
        //모두 착용하지 않는 경우는 제외해야 하기 때문에 1을 빼고 리턴
        return answer - 1;
    }
}

 

테스트 1 통과 (0.07ms, 72.6MB)
테스트 2 통과 (0.07ms, 82MB)
테스트 3 통과 (0.06ms, 76.2MB)
테스트 4 통과 (0.10ms, 75.5MB)
테스트 5 통과 (0.05ms, 71.4MB)
테스트 6 통과 (0.04ms, 76.2MB)
테스트 7 통과 (0.08ms, 74.8MB)
테스트 8 통과 (0.05ms, 75.2MB)
테스트 9 통과 (0.04ms, 72.2MB)
테스트 10 통과 (0.04ms, 76.1MB)
테스트 11 통과 (0.04ms, 73.5MB)
테스트 12 통과 (0.06ms, 73.1MB)
테스트 13 통과 (0.07ms, 77.3MB)
테스트 14 통과 (0.04ms, 79.4MB)
테스트 15 통과 (0.03ms, 77.1MB)
테스트 16 통과 (0.04ms, 75.8MB)
테스트 17 통과 (0.05ms, 74.5MB)
테스트 18 통과 (0.06ms, 75.2MB)
테스트 19 통과 (0.05ms, 77.4MB)
테스트 20 통과 (0.04ms, 73.3MB)
테스트 21 통과 (0.04ms, 77.4MB)
테스트 22 통과 (0.04ms, 72MB)
테스트 23 통과 (0.04ms, 69.5MB)
테스트 24 통과 (0.07ms, 78.5MB)
테스트 25 통과 (0.08ms, 76.4MB)
테스트 26 통과 (0.06ms, 74.9MB)
테스트 27 통과 (0.04ms, 75.9MB)
테스트 28 통과 (0.07ms, 74.2MB)

 

 

 

 

 

경우의 수 공식만 알면 쉽게 풀 수 있는 문제

 

 

 

 

 

728x90
728x90
코딩 테스트 풀이 체크리스트
2시간 내에 풀었는가? O
본인의 실력으로 풀었는가? O

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

 

 

function solution(n) {
    let list = new Array();
    list[1] = 1;
    list[2] = 2;
    
    for (var i = 3; i <= n; i++) {
        list[i] = (list[i-1] + list[i-2]) % 1000000007;
    }
    
    return list[n];
}

 

정확성 테스트
테스트 1 통과 (0.45ms, 30.3MB)
테스트 2 통과 (0.16ms, 30.2MB)
테스트 3 통과 (0.38ms, 30.1MB)
테스트 4 통과 (0.57ms, 30.1MB)
테스트 5 통과 (0.12ms, 30.2MB)
테스트 6 통과 (0.49ms, 30.3MB)
테스트 7 통과 (0.11ms, 30.1MB)
테스트 8 통과 (0.47ms, 30.3MB)
테스트 9 통과 (0.42ms, 30.3MB)
테스트 10 통과 (0.61ms, 30.2MB)
테스트 11 통과 (0.34ms, 30.3MB)
테스트 12 통과 (0.13ms, 30.2MB)
테스트 13 통과 (0.16ms, 30.3MB)
테스트 14 통과 (0.32ms, 30.1MB)
 
효율성 테스트
테스트 1 통과 (3.34ms, 32.8MB)
테스트 2 통과 (3.54ms, 33.2MB)
테스트 3 통과 (3.28ms, 32.9MB)
테스트 4 통과 (3.15ms, 32.8MB)
테스트 5 통과 (3.69ms, 33.4MB)
테스트 6 통과 (3.67ms, 33.6MB)

 

 

 

 

 

자세한 설명은 자바 코드에 작성되어 있음

 

[Java] 프로그래머스 - 2 x n 타일링 (2단계)

코딩 테스트 풀이 체크리스트 2시간 내에 풀었는가? O 본인의 실력으로 풀었는가? O 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을

b-sseung.tistory.com

 

 

 

 

 

 

728x90
728x90
코딩 테스트 풀이 체크리스트
2시간 내에 풀었는가? O
본인의 실력으로 풀었는가? O

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

 

 

class Solution {
    public int solution(int n) {
        int[] list = new int[n+1];
        list[1] = 1;
        list[2] = 2;
        
        for (int i = 3; i <= n; i++) {
            list[i] = (list[i-2] + list[i-1]) % 1000000007;
        }
        return list[n];
    }
}
 
정확성 테스트
테스트 1 통과 (0.19ms, 69.3MB)
테스트 2 통과 (0.05ms, 72.1MB)
테스트 3 통과 (0.16ms, 72.9MB)
테스트 4 통과 (0.23ms, 78.4MB)
테스트 5 통과 (0.05ms, 77.2MB)
테스트 6 통과 (0.20ms, 73.1MB)
테스트 7 통과 (0.05ms, 72.7MB)
테스트 8 통과 (0.19ms, 74.9MB)
테스트 9 통과 (0.26ms, 72.2MB)
테스트 10 통과 (0.25ms, 70.4MB)
테스트 11 통과 (0.14ms, 77.1MB)
테스트 12 통과 (0.06ms, 73.9MB)
테스트 13 통과 (0.11ms, 77.5MB)
테스트 14 통과 (0.13ms, 78.7MB)
 
효율성 테스트
테스트 1 통과 (0.91ms, 52.3MB)
테스트 2 통과 (1.34ms, 52.3MB)
테스트 3 통과 (0.87ms, 52.2MB)
테스트 4 통과 (0.68ms, 51.8MB)
테스트 5 통과 (1.56ms, 51.7MB)
테스트 6 통과 (1.68ms, 53MB)

 

 

 

 

 

처음에는 코드를 dfs로 작성했는데 정확성 테스트에서부터 시간 초과가 나왔다.

 

class Solution {
    int answer;
    public int solution(int n) {
        answer = 0;
        func(n);
        return answer;
    }
    
    public void func(int size) {
        if (size == 0) {
            answer++;
            return;
        }
        
        if (size - 1 >= 0) func(size-1);
        if (size - 2 >= 0) func(size-2);
    }
}

 

 

 

 

 

그래서 절대 dfs로 작성하면 안되겠구나 생각을 했는데 이를 통해서 알게 된 점은 아래의 표이다

 

가로 길이 방법
1 1
2 2
3 3
4 5
5 8
6 13
7 21
8 34
9 55
... ...

 

 

 

 

 

만약에 가로 길이가 3이면 방법은 길이가 2인 경우와 1인 경우의 방법을 더하는 것이었다.

그래서 동적계획법으로 코드를 짜기 위해 배열을 만들고 그 안에 방법 수를 넣었고,

코드의 내용대로 for문으로 3부터 n번까지 돌렸다.

적어도 이렇게 한다면 n의 최대 길이인 60,000번까지 간다고 해도 반복은 60,000번 밖에 안하는 것이기 때문에

시간 초과도 뜨지 않을 것이라고 확신했다.

 

 

 

 

 

근데 점점 숫자가 커지면 int 범위를 넘어갈 것이기 때문에

i-2와 i-1을 더한 값을 문제에서 나누라고 한 1,000,000,007로 나눈 나머지를 넣는 것으로 계산했다.

 

 

 

 

 

 

728x90
728x90

 

 

 

자바에서는 객체를 만들려면 보통 class를 이용하여 새로운 객체를 생성한다.

근데 자바 스크립트에서는 object 객체를 더 많이 쓰는 것 같았음.

내가 배운 것도 Object 객체 뿐이었고...

그래서 바로 인터넷 검색

 

 

 

 

Object 객체의 경우에는

const people = {
	name: 이름,
    	age: 나이
}

 

뭐 이런 식으로 값을 딱 넣어놓고 선언을 해야하기 때문에 재사용이 어려움

그래서 자바에서 people 자료형의 배열을 만들기 위해서는 각각 생성을 달리 해야 함.

 

 

 

 

Constructor 생성자는 자바와 마찬가지로 class를 이용하는 것임

class people {
     constructor() {
    	//초기화하는 부분
    }
    
    const 함수명 = function(이름, 나이) {
         this.name = 이름;
         this.age = 나이;
    }
}

 

이런 식으로 만들어 놓으면 재사용할 수 있게 됨

 

 

 

 

 

단, 자바의 경우에는 자료형을 정해놓고 배열을 생성하지만

class people {
	String name;
    int age;
	public people(String n, int a) {
         this.name = n;
         this.a;
    }
}

class Main {
	public void main() {
         people[] p = new people[5];
    }
}

 

 

 

 

 

자바 스크립트의 경우에는 그냥 배열로 선언한 후에 그냥 추가하면 됨

class people {
     constructor(이름, 나이){
     	this.name = 이름;
        this.age = 나이;
     }
}

function main() {
	let p = new Array();
}

 

 

 

 

 

여하튼 자바스크립트는 자바랑 비슷한듯 하지만 어렵다.....

 

 

 

 

 

728x90

'공부 일지' 카테고리의 다른 글

[JavaScript] Map 객체 함수 정리  (0) 2022.08.02
[JavaScript] Array 객체 함수 정리  (0) 2022.08.02
728x90
코딩 테스트 풀이 체크리스트
2시간 내에 풀었는가? O
본인의 실력으로 풀었는가? O

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

 

 

자바 코드에 설명이 적혀 있어서 참고 하면서 보면 됩니다~

 

[Java] 프로그래머스 - 배달 (2단계)

코딩 테스트 풀이 체크리스트 2시간 내에 풀었는가? O 본인의 실력으로 풀었는가? O 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을

b-sseung.tistory.com

 

function solution(N, road, K) {
    let answer = new Array();
    let r = new Array(N);
    let times = new Array(N);
    let check = new Array(N);
    for (var i = 0; i < times.length; i++) {
        times[i] = new Array(N);
        check[i] = false;
    }

    for (var i = 0; i < road.length; i++) {
        var a = road[i][0] - 1;
        var b = road[i][1] - 1;
        var 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);
        times[a][b] = times[a][b] == null ? time : Math.min(times[a][b], time);
        times[b][a] = times[b][a] == null ? time : Math.min(times[b][a], time);
    }
    
    const func = function(K, start, k) {
        if (K < k) return;
        if (answer.indexOf(start) == -1) answer.push(start);
        
        let arr = r[start].arr;
        for (var i = 0; i < arr.length; i++) {
            var num = arr[i];
            if (check[num]) continue;
            check[num] = true;
            func(K, num, k + times[start][num]);
            check[num] = false;
        }
    }
        
    check[0] = true;
    func(K, 0, 0);

    return answer.length;
}

class Road {
    constructor() {
        this.arr = new Array();
    }

    addRoad(num) {
        if (this.arr.indexOf(num) == -1) this.arr.push(num);
    }
}

 

테스트 1 통과 (0.36ms, 29.9MB)
테스트 2 통과 (0.32ms, 30.1MB)
테스트 3 통과 (0.38ms, 30MB)
테스트 4 통과 (0.36ms, 30.2MB)
테스트 5 통과 (0.34ms, 30MB)
테스트 6 통과 (0.21ms, 30.1MB)
테스트 7 통과 (0.22ms, 30.2MB)
테스트 8 통과 (0.40ms, 30MB)
테스트 9 통과 (0.36ms, 30MB)
테스트 10 통과 (0.39ms, 29.8MB)
테스트 11 통과 (0.38ms, 30MB)
테스트 12 통과 (0.38ms, 30MB)
테스트 13 통과 (0.40ms, 30.1MB)
테스트 14 통과 (0.99ms, 30.2MB)
테스트 15 통과 (1.58ms, 30.1MB)
테스트 16 통과 (0.35ms, 29.9MB)
테스트 17 통과 (0.24ms, 30MB)
테스트 18 통과 (0.51ms, 30.1MB)
테스트 19 통과 (1.01ms, 30.1MB)
테스트 20 통과 (0.56ms, 30.2MB)
테스트 21 통과 (1.19ms, 30.3MB)
테스트 22 통과 (0.75ms, 30.1MB)
테스트 23 통과 (1.55ms, 30MB)
테스트 24 통과 (4.05ms, 33MB)
테스트 25 통과 (1.53ms, 30.2MB)
테스트 26 통과 (1.70ms, 30.1MB)
테스트 27 통과 (1.68ms, 29.8MB)
테스트 28 통과 (2.22ms, 31.9MB)
테스트 29 통과 (4.43ms, 32.2MB)
테스트 30 통과 (2.23ms, 32.1MB)
테스트 31 통과 (0.45ms, 30.1MB)
테스트 32 통과 (8337.31ms, 33.1MB)

 

 

 

 

 

 

728x90
728x90
코딩 테스트 풀이 체크리스트
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;
        }
    }
}

 

 

 

 

 

 

728x90

+ Recent posts