잡다한 배똥월드

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

 

 

코딩테스트 연습 - 자릿수 더하기

자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요. 예를들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다. 제한사항 N의 범위 : 100,000,000 이하의 자연수 입출

programmers.co.kr

 

 

 

 

 

class Solution {
    fun solution(n: Int): Int {
        var answer = 0;
        var num = n;
        
        do {
            answer += num % 10;
            num /= 10;
        } while (num > 0)

        return answer;
    }
}

 

테스트 1 통과 (0.01ms, 63.8MB)
테스트 2 통과 (0.01ms, 63.4MB)
테스트 3 통과 (0.01ms, 64.3MB)
테스트 4 통과 (0.02ms, 61.8MB)
테스트 5 통과 (0.02ms, 63.2MB)
테스트 6 통과 (0.01ms, 63.4MB)
테스트 7 통과 (0.01ms, 65.2MB)
테스트 8 통과 (0.01ms, 62.7MB)
테스트 9 통과 (0.01ms, 63.4MB)
테스트 10 통과 (0.01ms, 61.8MB)
테스트 11 통과 (0.01ms, 63.4MB)
테스트 12 통과 (0.01ms, 63.2MB)
테스트 13 통과 (0.01ms, 63.3MB)
테스트 14 통과 (0.01ms, 63.6MB)
테스트 15 통과 (0.01ms, 64.8MB)
테스트 16 통과 (0.01ms, 64.1MB)
테스트 17 통과 (0.02ms, 62.2MB)
테스트 18 통과 (0.02ms, 63.4MB)
테스트 19 통과 (0.01ms, 63.5MB)
테스트 20 통과 (0.01ms, 63MB)
테스트 21 통과 (0.01ms, 64.5MB)

 

 

 

 

123을 10으로 나눈 나머지 = 3

123을 10으로 나눈 몫 = 12

 

12를 10으로 나눈 나머지 = 2

12를 10으로 나눈 몫 = 1

 

1을 10으로 나눈 나머지 = 1

1을 10으로 나눈 몫 = 0

 

 

 

 

이렇게 숫자가 0이 될 때까지 나머지를 더해주면서 10으로 나눠주면서 진행한다.

 

 

 

 

 

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

 

 

코딩테스트 연습 - 멀쩡한 사각형

가로 길이가 Wcm, 세로 길이가 Hcm인 직사각형 종이가 있습니다. 종이에는 가로, 세로 방향과 평행하게 격자 형태로 선이 그어져 있으며, 모든 격자칸은 1cm x 1cm 크기입니다. 이 종이를 격자 선을

programmers.co.kr

 

 

 

 

 

class Solution {
    public long solution(int w, int h) {
        long answer = (long) w * h;
        int temp = 0;
        
        for (int i = Math.min(w, h); i >= 1; i--) {
            if (w % i == 0 && h % i == 0) {
                temp = i;
                break;
            }
        }
        
        return answer - ((w / temp) + (h / temp) - 1) * temp;
    }
}

 

테스트 1 통과 (0.07ms, 71.1MB)
테스트 2 통과 (0.15ms, 76.3MB)
테스트 3 통과 (0.11ms, 72.8MB)
테스트 4 통과 (0.11ms, 77.2MB)
테스트 5 통과 (0.11ms, 74.2MB)
테스트 6 통과 (0.22ms, 75.8MB)
테스트 7 통과 (0.06ms, 71MB)
테스트 8 통과 (0.17ms, 72.7MB)
테스트 9 통과 (0.06ms, 74.5MB)
테스트 10 통과 (0.05ms, 74.1MB)
테스트 11 통과 (0.08ms, 77.5MB)
테스트 12 통과 (0.05ms, 77.5MB)
테스트 13 통과 (29.33ms, 85.3MB)
테스트 14 통과 (0.06ms, 77.5MB)
테스트 15 통과 (45.74ms, 79.3MB)
테스트 16 통과 (1.08ms, 77.4MB)
테스트 17 통과 (20.04ms, 80.8MB)
테스트 18 통과 (0.07ms, 73.7MB)

 

 

 

 

 

 

테스트 케이스의 위 도형을 보면 대각선이 꼭지점을 지나는 부분은

( 0 0 ), ( 2 3 ), ( 4 6 ), ( 6, 9 ), ( 8 12 ) 이다.

 

 

이걸 봤을 때 가로는 2씩, 세로는 3씩 커지는 것을 볼 수 있는데

각각 가로 세로 높이를 2와 3으로 나눠보면 4라는 숫자가 나오는 것을 알 수 있다.

가로와 세로가 8과 12라는 것을 봤을 때 최대공약수인 것을 알 수 있다.

 

 

 

 

그래서 최대 공약수를 구하고

최대 공약수를 이용해서 반복하는 칸에서 대각선이 지나가는 칸을 구해야하는데

위의 예제에서도 4칸인데, 다른 도형의 경우도 계산을 해보면 반복되는 가로 길이 + 반복되는 세로 길이 - 1이라는 공식이 나온다.

최종 공식은 전체 크기 - {(가로 / 최대공약수) + (세로 / 최대공약수) - 1 } * 최대공약수 이다.

 

 

 

 

참고 링크

 

[프로그래머스] 멀쩡한 사각형

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/62048 코딩테스트 연습 - 멀쩡한 사각형 | 프로그래머스 가로 길이가 Wcm, 세로 길이가 Hcm인 직사각형 종이가 있습니다. 종이에는 가로, 세로..

taesan94.tistory.com

 

 

 

 

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

 

 

코딩테스트 연습 - 내적

길이가 같은 두 1차원 정수 배열 a, b가 매개변수로 주어집니다. a와 b의 내적을 return 하도록 solution 함수를 완성해주세요. 이때, a와 b의 내적은 a[0]*b[0] + a[1]*b[1] + ... + a[n-1]*b[n-1] 입니다. (n은 a, b의

programmers.co.kr

 

 

 

 

 

class Solution {
    public int solution(int[] a, int[] b) {
        int answer = 0;
        
        for (int i = 0; i < a.length; i++) {
            answer += (a[i] * b[i]);    
        }
        
        return answer;
    }
}

 

테스트 1 통과 (0.03ms, 78.2MB)
테스트 2 통과 (0.01ms, 76.9MB)
테스트 3 통과 (0.02ms, 73.8MB)
테스트 4 통과 (0.02ms, 75.4MB)
테스트 5 통과 (0.02ms, 74.7MB)
테스트 6 통과 (0.03ms, 75.5MB)
테스트 7 통과 (0.04ms, 72MB)
테스트 8 통과 (0.05ms, 79MB)
테스트 9 통과 (0.03ms, 76.3MB)

 

 

 

 

정말 간단한 문제여서 설명 생략.

 

 

 

 

 

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

 

 

코딩테스트 연습 - 음양 더하기

어떤 정수들이 있습니다. 이 정수들의 절댓값을 차례대로 담은 정수 배열 absolutes와 이 정수들의 부호를 차례대로 담은 불리언 배열 signs가 매개변수로 주어집니다. 실제 정수들의 합을 구하여 re

programmers.co.kr

 

 

 

 

 

class Solution {
    public int solution(int[] absolutes, boolean[] signs) {
        int answer = 0;
        
        for (int i = 0; i < absolutes.length; i++) {
            if (signs[i]) {
                answer += absolutes[i];
            } else {
                answer -= absolutes[i];
            }
        }
        
        return answer;
    }
}

 

테스트 1 통과 (0.05ms, 84.5MB)
테스트 2 통과 (0.04ms, 78.2MB)
테스트 3 통과 (0.04ms, 79.2MB)
테스트 4 통과 (0.04ms, 77.3MB)
테스트 5 통과 (0.05ms, 79.9MB)
테스트 6 통과 (0.03ms, 78.5MB)
테스트 7 통과 (0.04ms, 76.5MB)
테스트 8 통과 (0.04ms, 78.4MB)
테스트 9 통과 (0.04ms, 82MB)

 

 

 

 

 

그냥 정말 말 그대로 for문으로 돌리는데 true면 더하고 false면 뺀다..

 

 

 

 

 

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

 

 

코딩테스트 연습 - 자연수 뒤집어 배열로 만들기

자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다. 제한 조건 n은 10,000,000,000이하인 자연수입니다. 입출력 예 n return 12345

programmers.co.kr

 

 

 

 

 

class Solution {
    fun solution(n: Long): IntArray {
        var answer = IntArray(n.toString().length);
        var num = n;
        var index = 0;
        
        do {
            answer[index] = (num % 10).toInt();
            num /= 10;
            index++;
        } while (num > 0);
        
        return answer
    }
}

 

테스트 1 통과 (0.03ms, 64.4MB)
테스트 2 통과 (0.03ms, 62.5MB)
테스트 3 통과 (0.02ms, 61.4MB)
테스트 4 통과 (0.03ms, 61.8MB)
테스트 5 통과 (0.03ms, 63.6MB)
테스트 6 통과 (0.02ms, 63.7MB)
테스트 7 통과 (0.03ms, 63MB)
테스트 8 통과 (0.02ms, 64.5MB)
테스트 9 통과 (0.02ms, 62.6MB)
테스트 10 통과 (0.02ms, 64.5MB)
테스트 11 통과 (0.02ms, 63.4MB)
테스트 12 통과 (0.02ms, 63.1MB)
테스트 13 통과 (0.03ms, 64.7MB)

 

 

 

 

 

방금 전에 풀었던 식이랑 비슷하게 사용할 수 있어서 그대로 사용

일단 Int배열을 n의 길이로 해서 선언

그리고 n의 값을 그대로 가진 num이라는 녀석을 선언하는데,

이 녀석을 10으로 나누면서 나머지를 answer에 그대로 추가.

이 때 num % 10은 long형이기 때문에 toInt()로 형 변환을 한 후 answer에 넣고

num이 0이 되면 while문 탈출

그리고 그대로 answer을 리턴하면 된다.

 

 

 

 

 

728x90
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

 

 

코딩테스트 연습 - 없는 숫자 더하기

0부터 9까지의 숫자 중 일부가 들어있는 정수 배열 numbers가 매개변수로 주어집니다. numbers에서 찾을 수 없는 0부터 9까지의 숫자를 모두 찾아 더한 수를 return 하도록 solution 함수를 완성해주세요.

programmers.co.kr

 

 

 

 

 

class Solution {
    public int solution(int[] numbers) {
        int answer = 0;
        int[] arr = new int[10];
        
        for (int i = 0; i < numbers.length; i++) {
            arr[numbers[i]]++;
        }
        
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == 0) { answer += i; }
        }
        
        return answer;
    }
}

 

테스트 1 통과 (0.03ms, 73.7MB)
테스트 2 통과 (0.03ms, 78MB)
테스트 3 통과 (0.02ms, 83.9MB)
테스트 4 통과 (0.02ms, 78.2MB)
테스트 5 통과 (0.02ms, 74.4MB)
테스트 6 통과 (0.03ms, 67.3MB)
테스트 7 통과 (0.02ms, 73.1MB)
테스트 8 통과 (0.03ms, 72.5MB)
테스트 9 통과 (0.03ms, 74.5MB)

 

 

 

 

 

9까지 있는 배열을 만들기 위해서 배열 길이는 10으로 설정

numbers를 하나씩 돌리면서 해당 숫자의 배열 위치는 1씩 값을 늘려가고...

그리고 최종적으로 배열에서 0인 값의 위치는 answer에 더해서 리턴하는 것으로...

 

 

 

 

 

728x90

+ Recent posts