잡다한 배똥월드

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

 

 

코딩테스트 연습 - 정수 내림차순으로 배치하기

함수 solution은 정수 n을 매개변수로 입력받습니다. n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요. 예를들어 n이 118372면 873211을 리턴하면 됩니다. 제한 조건 n은 1이

programmers.co.kr

 

 

 

 

 

class Solution {
    fun solution(n: Long): Long {
        var arr = LongArray(n.toString().length);
        var num = n;
        var index = 0;
        do {
            arr[index] = num % 10;
            num /= 10;
            index++;
        } while (num > 0);
        
        arr.sortDescending();
        
        var answer = 0L;
        
        for (i in 0..arr.size - 1) {
            answer = answer * 10 + arr[i];    
        }
        return answer;
    }
}

 

테스트 1 통과 (13.54ms, 66.6MB)
테스트 2 통과 (13.73ms, 64.9MB)
테스트 3 통과 (13.72ms, 65.5MB)
테스트 4 통과 (13.72ms, 64.8MB)
테스트 5 통과 (13.82ms, 65.1MB)
테스트 6 통과 (14.28ms, 64.8MB)
테스트 7 통과 (13.66ms, 65.1MB)
테스트 8 통과 (13.83ms, 64.9MB)
테스트 9 통과 (13.59ms, 65.2MB)
테스트 10 통과 (13.67ms, 65.3MB)
테스트 11 통과 (20.77ms, 65.5MB)
테스트 12 통과 (13.62ms, 65.4MB)
테스트 13 통과 (13.84ms, 66.1MB)
테스트 14 통과 (13.74ms, 65.3MB)
테스트 15 통과 (13.74ms, 65.7MB)
테스트 16 통과 (14.01ms, 64.6MB)

 

 

 

 

 

배열 하나 넣고, 10으로 나누면서 나머지 넣기

그리고 나서 내림차순 정렬 후 다시 10씩 곱하면서 배열 값들 하나씩 추가해서 만들었는데

생각보다 코드도 길고, 시간도 많이 걸리는 것 같아서 다른 방법을 생각해봤다.

 

 

 

 

class Solution {
    fun solution(n: Long): Long {
        var arr = n.toString().toCharArray();
        arr.sortDescending();
        return arr.joinToString("").toLong();
    }
}

 

테스트 1 통과 (13.30ms, 65MB)
테스트 2 통과 (13.98ms, 65MB)
테스트 3 통과 (13.76ms, 65.3MB)
테스트 4 통과 (13.53ms, 65.2MB)
테스트 5 통과 (13.48ms, 66.4MB)
테스트 6 통과 (13.61ms, 65MB)
테스트 7 통과 (13.52ms, 65.1MB)
테스트 8 통과 (13.26ms, 64.9MB)
테스트 9 통과 (20.50ms, 64.5MB)
테스트 10 통과 (15.66ms, 65.7MB)
테스트 11 통과 (18.56ms, 64.8MB)
테스트 12 통과 (13.83ms, 65.4MB)
테스트 13 통과 (15.75ms, 65.3MB)
테스트 14 통과 (13.35ms, 65.3MB)
테스트 15 통과 (14.27ms, 64.5MB)
테스트 16 통과 (14.05ms, 65.2MB)

 

 

 

 

 

이번에는 char배열로 만들어서 내림차순 정렬 후 그대로 String으로 합친 것을 Long형으로 바꾸는 것으로 했는데

이것도 시간복잡도는 비슷해서 의아함

그래도 새로운 방법을 찾은걸로 만족..

 

 

 

 

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

 

 

코딩테스트 연습 - 정수 제곱근 판별

임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다. n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함

programmers.co.kr

 

 

 

 

class Solution {
    fun solution(n: Long): Long {
        var temp = Math.sqrt(n.toDouble()).toLong();
        
        return if (temp * temp == n) (temp + 1) * (temp + 1) else -1;
    }
}

 

테스트 1 통과 (0.07ms, 62.5MB)
테스트 2 통과 (0.04ms, 60.7MB)
테스트 3 통과 (0.08ms, 63.7MB)
테스트 4 통과 (0.04ms, 64.1MB)
테스트 5 통과 (0.03ms, 64MB)
테스트 6 통과 (0.07ms, 63.3MB)
테스트 7 통과 (0.03ms, 63.6MB)
테스트 8 통과 (0.03ms, 63MB)
테스트 9 통과 (0.04ms, 63MB)
테스트 10 통과 (0.03ms, 64.2MB)
테스트 11 통과 (0.03ms, 62.5MB)
테스트 12 통과 (0.03ms, 62.1MB)
테스트 13 통과 (0.09ms, 62.7MB)
테스트 14 통과 (0.04ms, 62.4MB)
테스트 15 통과 (0.03ms, 64.7MB)
테스트 16 통과 (0.04ms, 62.9MB)
테스트 17 통과 (0.03ms, 64MB)
테스트 18 통과 (0.04ms, 64.5MB)

 

 

 

 

 

Math.sqrt()로 n의 제곱근을 구하는데, 이 때 안에 넣을 숫자는 double형으로 넣어야 error: type mismatch: inferred type is Long but Double was expected 오류가 뜨지 않는다.

그래서 n.toDouble()로 형 변환 후 파라미터로 넣었음.

그리고 리턴값은 long이길 원해서 toLong()으로 형 변환을 했음.. 

 

 

 

 

그리고나서 if문을 돌릴 때 그냥 리턴 값인 temp의 제곱이 n과 일치한지를 파악하고, 맞으면 temp + 1의 제곱을 리턴, 아니면 -1을 리턴하도록 작성하였다.

 

 

 

 

이 때 제곱을 구하는 것은 그냥 (temp + 1) * (temp + 1)로 작성하였지만,

Math.pow((temp + 1).toDouble(), 2.0)으로도 작성할 수 있다.

 

 

 

 

 

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

 

 

코딩테스트 연습 - 제일 작은 수 제거하기

정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1

programmers.co.kr

 

 

 

 

 

class Solution {
    fun solution(arr: IntArray): IntArray {
        var answer = IntArray(arr.size - 1);
        if (answer.size == 0) {
            answer = IntArray(1, {-1});
        } else {
            var temp  = arr.copyOf();
            temp.sort();
            
            var min = temp[0];
            var position = 0;
            
            for (num in 0..arr.size-1) {
                if (min != arr[num]) {
                    answer[position] = arr[num];
                    position++;
                }
            }
        }
        return answer
    }
}

 

테스트 1 통과 (27.59ms, 77.8MB)
테스트 2 통과 (10.40ms, 66.8MB)
테스트 3 통과 (9.63ms, 66.5MB)
테스트 4 통과 (9.95ms, 66MB)
테스트 5 통과 (12.16ms, 65MB)
테스트 6 통과 (10.81ms, 67MB)
테스트 7 통과 (10.06ms, 66.5MB)
테스트 8 통과 (9.94ms, 65.8MB)
테스트 9 통과 (9.35ms, 64.6MB)
테스트 10 통과 (9.77ms, 65.9MB)
테스트 11 통과 (9.71ms, 66.6MB)
테스트 12 통과 (9.68ms, 65.3MB)
테스트 13 통과 (15.00ms, 64.7MB)
테스트 14 통과 (9.76ms, 66.2MB)
테스트 15 통과 (9.59ms, 65.9MB)
테스트 16 통과 (9.81ms, 64.5MB)

 

 

 

 

 

일단 코틀린에 ArrayList가 있는지도 이제 알았고... 걱정이네 이번주에 시험 볼 수 있을라나..

 

 

 

 

 

일단 answer을 arr의 길이 - 1로 배열 길이를 설정한다.

이 때 만약 answer의 길이가 0이면 새로 answer을 초기화해서 -1을 넣고 끝내고,

answer의 길이가 0이 아니면 이제 arr을 복사해서 새로운 배열을 하나 만들고, 그걸 sort()로 오름차순 정렬을 한다.

 

 

 

 

그래서 가장 작은 값을 구하고, for문으로 그 값이 아니면 answer에 넣는 것으로 진행한다.

 

 

 

 

 

 

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

 

 

코딩테스트 연습 - 짝수와 홀수

정수 num이 짝수일 경우 "Even"을 반환하고 홀수인 경우 "Odd"를 반환하는 함수, solution을 완성해주세요. 제한 조건 num은 int 범위의 정수입니다. 0은 짝수입니다. 입출력 예 num return 3 "Odd" 4 "Even"

programmers.co.kr

 

 

 

 

 

class Solution {
    fun solution(num: Int): String {
        return if (num % 2 == 0) "Even" else "Odd";
    }
}

 

테스트 1 통과 (0.01ms, 63.8MB)
테스트 2 통과 (0.01ms, 64.8MB)
테스트 3 통과 (0.01ms, 62.7MB)
테스트 4 통과 (0.01ms, 63.8MB)
테스트 5 통과 (0.01ms, 63.6MB)
테스트 6 통과 (0.01ms, 63.6MB)
테스트 7 통과 (0.01ms, 64.6MB)
테스트 8 통과 (0.01ms, 64.5MB)
테스트 9 통과 (0.01ms, 60.8MB)
테스트 10 통과 (0.02ms, 62MB)
테스트 11 통과 (0.01ms, 63.5MB)
테스트 12 통과 (0.02ms, 63.2MB)
테스트 13 통과 (0.01ms, 63.3MB)
테스트 14 통과 (0.01ms, 63.9MB)
테스트 15 통과 (0.01ms, 62.3MB)
테스트 16 통과 (0.01ms, 63.8MB)

 

 

 

 

 

코틀린에는 삼항연산식이 없어서 if문으로 그대로 넣었음..

%은 나머지를 구하는 연산자이기 때문에 2로 나눠서 나머지가 0이면 짝수, 1이면 홀수이기 때문에 그렇게 해서 Even 이냐 Odd냐를 리턴하게 만들었다.

 

 

 

 

 

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

 

 

코딩테스트 연습 - 최대공약수와 최소공배수

두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다. 예를 들어 두 수 3, 12의

programmers.co.kr

 

 

 

 

 

class Solution {
    fun solution(n: Int, m: Int): IntArray {
        var answer = IntArray(2);
        
        for (i in Math.min(n, m) downTo 1) {
            if (m % i == 0 && n % i == 0) {
                answer[0] = i;
                break;
            }
        }
        
        var index = 1;
        do {
            var num = n * index;
            
            if (num % m == 0) {
                answer[1] = num;
                break;
            }
            
            index++;
        } while (true)
              
        return answer
    }
}

 

테스트 1 통과 (0.03ms, 64.4MB)
테스트 2 통과 (0.02ms, 64.4MB)
테스트 3 통과 (0.03ms, 63.4MB)
테스트 4 통과 (0.04ms, 63.1MB)
테스트 5 통과 (0.11ms, 64MB)
테스트 6 통과 (0.04ms, 63.6MB)
테스트 7 통과 (0.04ms, 63.2MB)
테스트 8 통과 (0.04ms, 64.1MB)
테스트 9 통과 (0.06ms, 64.4MB)
테스트 10 통과 (0.05ms, 62.7MB)
테스트 11 통과 (0.04ms, 63.5MB)
테스트 12 통과 (0.06ms, 63.3MB)
테스트 13 통과 (0.05ms, 63.5MB)
테스트 14 통과 (0.10ms, 62.9MB)
테스트 15 통과 (0.03ms, 63.9MB)
테스트 16 통과 (0.05ms, 64.7MB)

 

 

 

 

 

처음으로 while문 쓰는 것 같네..

최대공약수는 둘 중 작은 숫자부터 1까지 1씩 빼면서 나눴을 때 나머지가 0이 되는지 확인 해보면서 구했고,

최소공배수는 아무 숫자나 1씩 늘려가면서 숫자 * (1씩 늘린 숫자)가 나머지 숫자와 나눴을 때 0이 되는지를 확인하면서 구했다.

 

 

 

 

 

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

 

 

코딩테스트 연습 - 콜라츠 추측

1937년 Collatz란 사람에 의해 제기된 이 추측은, 주어진 수가 1이 될때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측입니다. 작업은 다음과 같습니다. 1-1. 입력된 수가 짝수라면 2

programmers.co.kr

 

 

 

 

 

class Solution {
    fun solution(num: Int): Int {
        var answer = 0;
        var n = num.toLong();
        
        while (n != 1L && answer <= 500) {
            answer++;
            
            if (n % 2 == 0L) {
                n = n / 2;
            } else {
                n = (n * 3) + 1;
            }
        }
        
        return if (n == 1L) answer else -1;
    }
}

 

테스트 1 통과 (0.02ms, 63.2MB)
테스트 2 통과 (0.02ms, 62.8MB)
테스트 3 통과 (0.02ms, 65MB)
테스트 4 통과 (0.01ms, 63.1MB)
테스트 5 통과 (0.03ms, 63.2MB)
테스트 6 통과 (0.02ms, 63.8MB)
테스트 7 통과 (0.04ms, 62.7MB)
테스트 8 통과 (0.02ms, 62.9MB)
테스트 9 통과 (0.01ms, 63.2MB)
테스트 10 통과 (0.03ms, 63.8MB)
테스트 11 통과 (0.03ms, 61.1MB)
테스트 12 통과 (0.01ms, 63.6MB)
테스트 13 통과 (0.01ms, 63.4MB)
테스트 14 통과 (0.02ms, 65.5MB)
테스트 15 통과 (0.02ms, 60.7MB)
테스트 16 통과 (0.01ms, 63.4MB)

 

 

 

 

 

while문으로 500번만 돌리고, n이 1이 아닐 경우에는 -1을 리턴

 

 

 

 

여기서 문제가 있었던 것은 long형과 int형은 == 비교 연산자가 안 됨.

Operator == cannot be applied to ‘Long’ and ‘Int’ in Kotlin 라는 오류가 뜨므로 숫자 뒤에 L을 붙여서 long형이라고 인식 시켜주는 역할을 함.

 

 

 

 

 

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

 

 

코딩테스트 연습 - 평균 구하기

정수를 담고 있는 배열 arr의 평균값을 return하는 함수, solution을 완성해보세요. 제한사항 arr은 길이 1 이상, 100 이하인 배열입니다. arr의 원소는 -10,000 이상 10,000 이하인 정수입니다. 입출력 예 arr

programmers.co.kr

 

 

 

 

 

class Solution {
    fun solution(arr: IntArray): Double {
        var answer = 0.0;
        
        for (i in 0..arr.size - 1){
            answer += arr[i];
        }
        return answer / arr.size;
    }
}

 

테스트 1 통과 (0.05ms, 61.7MB)
테스트 2 통과 (0.04ms, 60.9MB)
테스트 3 통과 (0.04ms, 61.4MB)
테스트 4 통과 (0.04ms, 64.1MB)
테스트 5 통과 (0.03ms, 64MB)
테스트 6 통과 (0.03ms, 63.7MB)
테스트 7 통과 (0.03ms, 65.3MB)
테스트 8 통과 (0.03ms, 64.6MB)
테스트 9 통과 (0.03ms, 63.9MB)
테스트 10 통과 (0.03ms, 65.4MB)
테스트 11 통과 (0.03ms, 61.3MB)
테스트 12 통과 (0.09ms, 63.9MB)
테스트 13 통과 (0.03ms, 63.3MB)
테스트 14 통과 (0.03ms, 64.4MB)
테스트 15 통과 (0.03ms, 63.4MB)
테스트 16 통과 (0.04ms, 63.1MB)

 

 

 

 

 

배열 값 중에 0이 있을려나 걱정했는데 다행히 없었고,

그냥 배열 값들 다 더해주고, 배열 길이로 나누면 되는 문제.

 

 

 

 

코틀린에서는 따로 double형으로 변수 선언하는 것이 아니라 var로 통합해버리니까

answer이 double 이라는 것을 인식(?)하기 위해서 첫 선언 때 0이 아닌 0.0으로 선언함.

 

 

 

 

 

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

 

 

코딩테스트 연습 - 하샤드 수

양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하

programmers.co.kr

 

 

 

 

 

class Solution {
    fun solution(x: Int): Boolean {
        var xString = x.toString().chunked(1);
        
        var num = 0;
        for (i in 0..xString.size-1) {
            num += Integer.parseInt(xString[i]);
        }
        
        return if (x % num == 0) true else false; 
    }
}

 

테스트 1 통과 (10.14ms, 64.1MB)
테스트 2 통과 (8.73ms, 64.4MB)
테스트 3 통과 (10.15ms, 63.7MB)
테스트 4 통과 (12.17ms, 62.8MB)
테스트 5 통과 (13.80ms, 64.3MB)
테스트 6 통과 (11.47ms, 65MB)
테스트 7 통과 (8.40ms, 64.9MB)
테스트 8 통과 (11.43ms, 64.2MB)
테스트 9 통과 (8.38ms, 63.9MB)
테스트 10 통과 (8.27ms, 63.9MB)
테스트 11 통과 (8.14ms, 65MB)
테스트 12 통과 (8.55ms, 64.1MB)
테스트 13 통과 (10.25ms, 64.5MB)
테스트 14 통과 (9.44ms, 65.1MB)
테스트 15 통과 (8.09ms, 64.9MB)
테스트 16 통과 (8.55ms, 64.1MB)
테스트 17 통과 (7.94ms, 63.8MB)

 

 

 

 

 

코틀린에서 문자열을 배열로 만드는 방법으론 split과 chunked 두 가지의 함수가 있다.

 

 

 

근데 자바와 같이 split("")은 계속 오류가 나서 코틀린에서는 구분자를 제대로 넣어야 진행할 수 있는 것 같고, 그래서 chunked(길이)를 이용하여 배열로 만들었다.

 

 

 

 

그리고 리턴할 때 역시 코틀린은 삼항 연산자가 없어서 x % num == 0 ? true : false 가 오류가 났고,

삼항 연산자를 쓸 수 없다는 것을 알게 되서 if (x % num == 0) true else false; 로 표현하였다.

 

 

 

 

 

728x90

+ Recent posts