문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/12941
레벨 : Level 2
분류 : 연습문제
 

코딩테스트 연습 - 최솟값 만들기

길이가 같은 배열 A, B 두개가 있습니다. 각 배열은 자연수로 이루어져 있습니다. 배열 A, B에서 각각 한 개의 숫자를 뽑아 두 수를 곱합니다. 이러한 과정을 배열의 길이만큼 반복하며, 두 수를 곱

programmers.co.kr

 

이 문제는 두 배열의 값을 곱셈하여 최소 값을 구하는 문제이다.

최솟값을 구하기 위한 핵심은 한 개의 배열은 오름차순 정렬, 나머지 한 개의 배열은 내림차순 정렬을 해서 차례대로 곱해 나가면 된다.

하지만 내림차순 정렬 시 for문을 사용하지 않고 int[]를 정렬하려다 보니 쉽지 않았다.

stream도 사용해봤지만 해답을 찾지 못해 너무 꼬아서 생각하는 게 아닌가 싶어 일반적인 for문을 이용하여 새로운 Integer형 배열을 만들고 Arrays.sort(sortB, Collections.reverseOrder());를 통해 내림차순으로 정렬하여 로직을 구현하였다.

 

아래와 같이 소스를 공유합니다.

import java.util.Arrays;
import java.util.Collections;
class Solution
{
    public int solution(int []A, int []B)
    {
        int answer = 0;
        
        Integer[] sortB = new Integer[B.length];
        
        for(int i = 0; i < B.length; i++) sortB[i] = B[i];
        
        Arrays.sort(A);
        Arrays.sort(sortB, Collections.reverseOrder());
        
        for(int i = 0; i < A.length; i++) {
            answer += A[i] * sortB[i];
        }

        return answer;
    }
}​
문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/12945
레벨 : Level 2
분류 : 연습문제
 

코딩테스트 연습 - 피보나치 수

피보나치 수는 F(0) = 0, F(1) = 1일 때, 1 이상의 n에 대하여 F(n) = F(n-1) + F(n-2) 가 적용되는 수 입니다. 예를들어 F(2) = F(0) + F(1) = 0 + 1 = 1 F(3) = F(1) + F(2) = 1 + 1 = 2 F(4) = F(2) + F(3) = 1 + 2 = 3 F(5) = F(3) + F(4) =

programmers.co.kr

 

이 문제는 시간 초과가 발생할 수 있는 문제이다.

피보나치 수를 구하고나서 1234567의 나머지 값을 구한다면 시간 초과가 발생할 것이다.

또한 재귀함수로 피보나치 수를 구했을 때 배열보다 메모리를 많이 차지하여 시간 초과가 발생한다.

그래서 배열로 피보나치의 수식을 적용하고 각각의 값마다 1234567로 나머지를 구해서 로직을 구현하였다.

 

아래와 같이 소스를 공유합니다.

class Solution {
    public int solution(int n) {        
        
        int a = 0;
        int b = 1;
        
        for(int i = 0; i < n; i++) {
            int c = (a+b) % 1234567;
            a = b % 1234567;
            b = c % 1234567;
        }
        
        return a;
    }
}
문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/12949
레벨 : Level 2
분류 : 연습문제
 

코딩테스트 연습 - 행렬의 곱셈

[[2, 3, 2], [4, 2, 4], [3, 1, 4]] [[5, 4, 3], [2, 4, 1], [3, 1, 1]] [[22, 22, 11], [36, 28, 18], [29, 20, 14]]

programmers.co.kr

이 문제는 배열의 움직임을 잘 컨트롤해야 하는 문제이다.

손으로 직접 해보기 전까지 이해하기 쉽지 않았지만 하나씩 차근차근하다 보면 문제를 해결할 수 있다.

다차원 배열의 곱셈은 A배열의 행과 B배열의 열의 개수만큼 결과가 나온다.

예를 들면 A배열이 3*2이고 B배열이 2*2일 때 결과 배열은 3*2이다.

 

3중 배열의 i, j, k의 움직임을 자세히 봐야한다.

 

아래와 같이 소스를 공유합니다.

class Solution {
    public int[][] solution(int[][] arr1, int[][] arr2) {
        int[][] list = new int[arr1.length][arr2[0].length];
        
        for(int i = 0; i < arr1.length; i++) {
            for(int j = 0; j < arr1[0].length; j++) {
                for(int k = 0; k < arr2[0].length; k++) {
                    list[i][k] += arr1[i][j] * arr2[j][k];
                }
            }
        }
        
        return list;
    }
}
문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/12951
레벨 : Level 2
분류 : 연습문제
 

코딩테스트 연습 - JadenCase 문자열 만들기

JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열입니다. 문자열 s가 주어졌을 때, s를 JadenCase로 바꾼 문자열을 리턴하는 함수, solution을 완성해주세요. 제한 조건

programmers.co.kr

 

이 문제는 문자열을 컨트롤하는 문제이다.

여기서 핵심은 불필요한 문자열 컨트롤이 없어야 해결할 수 있다.

풀때는 어렵다는 생각이 들었는데 막상 풀어 놓고 보니 어려운 로직은 없었다.

하지만 문자열 변경을 위한 최적화가 된것 같다.

아래의 소스를 보면 쉽게 이해 할수 잇을것이다.

 

아래와 같이 소스를 공유합니다.

class Solution {
    public String solution(String s) {
        String ans = "";
        
        // 모든 문자열 소문자로 변경
        String[] srr = s.toLowerCase().split("");
        
        boolean isFirst = true;
        
        for(int i = 0; i < srr.length; i++) {
            // 첫 글자일 경우 대문자로 변경
            ans += isFirst ? srr[i].toUpperCase() : srr[i];
            // 공백이 나오면 첫 글자 플그래 true로 변경
            isFirst = srr[i].equals(" ") ? true : false;            
        }
        
        return ans;
    }
}

+ Recent posts