문제 링크 : 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;
    }
}
문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/12953
레벨 : Level 2
분류 : 연습문제
 

코딩테스트 연습 - N개의 최소공배수

두 수의 최소공배수(Least Common Multiple)란 입력된 두 수의 배수 중 공통이 되는 가장 작은 숫자를 의미합니다. 예를 들어 2와 7의 최소공배수는 14가 됩니다. 정의를 확장해서, n개의 수의 최소공배

programmers.co.kr

이 문제는 최대 공약수와 최소 공배수를 구하는 로직이 필요하다.

주어진 배열의 개수만큼 앞에서 부터 차례대로 최소 공배수를 구해나가면 된다.

 

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

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

 

문제 링크 : https://www.acmicpc.net/problem/13305
문제 등급 : Silver IV
 

13305번: 주유소

표준 입력으로 다음 정보가 주어진다. 첫 번째 줄에는 도시의 개수를 나타내는 정수 N(2 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 인접한 두 도시를 연결하는 도로의 길이가 제일 왼쪽 도로부터 N-1

www.acmicpc.net

문제 해결 로직

  1. 리터당 가격을 기준으로 반복문을 돌린다.
  2. 이전 리터의 가격과 현재 리터의 가격을 비교하여 작은 값을 기록한다.
  3. 작은 값으로 거리와 곱해 주유 비용을 계산한다.

위의 로직을 보면 매우 간단하다.

하지만 처음 문제를 풀었을 때 17점을 받았었다.

 

간단히 공유하자면

1. 이전 도시에서 주유한 주유비와 현재 도시의 주유 비와 앞으로 갈 전체 거리를 계산하여 기록하였다.

2. 이전의 주유비와 비교하여 작은 값을 기록하였다.

3. 앞으로 간 거리만큼 전체 거리에서 빼주고 이전 도시에서 주유한 주유비를 기록하였다.

long tot = Integer.MAX_VALUE, stat = 0;

for(int i = 0; i < dis.length; i++) {
  long d = dis[i];
  long a = Long.parseLong(amounts[i]);
  tot = Math.min(tot, stat + (a * totDis));
  totDis -= d;
  stat += (a * d);
}

위의 1~3번을 반복하면 가장 작은 값의 주유비가 나온다 하지만 값이 너무 커질 수 있다.

BigInteger로 구현해도 17점이였다. 

차이점은 틀린 로직에서 불필요한 계산이 들어가는것 밖에 없었는데 17점을 받았다.

메모리나 시간상의 문제도 없었다.

왜 틀렸는지 의문이지만 해결된 로직이 더 간결하긴하다...

 

아래와 같이 해결 로직의 소스를 공유합니다.

public class 주유소 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        br.readLine();

        String[] dis = br.readLine().split(" ");
        String[] amounts = br.readLine().split(" ");

        long min = Long.parseLong(amounts[0]), tot = 0;
        
        for (int i = 0; i < dis.length; i++) {
            long d = Long.parseLong(dis[i]);
            long a = Long.parseLong(amounts[i]);

            if(a < min) min = a;

            tot += (min * d);
        }

        System.out.println(tot);
    }
}

+ Recent posts