문제 링크 : 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);
    }
}

 

1. Enum

enum Direction {
    EAST(1),
	SOUTH(2),
	WEST(3),
	NORTH(4);

	private final int value;
	private Direction(int value) { this.value = value }
}


TO

1. Class

class Direction {
    static final Direction EAST = new Direction(“EAST”);
	static final Direction SOUTH = new Direction(“SOUTH”);
	static final Direction WEST = new Direction(“WEST”);
	static final Direction NORTH = new Direction(“NORTH”);

	private final String name;

	private Direction(String name) {
		this.name = name;
	}
}

2. Extends Enum

class MyEnum<? extends MyEnum<T>> implements Comparable<T> {
    static in id = 0;

	int ordinal;
	String name = “”;

	public int ordinal() { return ordinal; }

	MyEnum(String name) {
		this.name = name;
		ordinal = id++;
	}

	public int compareTo(T t) {
		// t.ordinal()은 MyEnum<? extends MyEnum<T>> 때문에 에러 없이 사용가능하다.
		// MyEnum<T> 였다면 T에 ordinal()이 있는지 확인이 되지 않아 에러가 발생했을 것이다.
		return ordinal - t.ordinal();
	}
}

3. Enum Abstract Method

3.1 Enum EX)

enum Direction {
    EAST(1) {
        Point move(Point p) { … }
    },
    SOUTH(2) {
        Point move(Point p) { … }
	},
    WEST(3) {
        Point move(Point p) { … }
    },
    NORTH(4) {
        Point move(Point p) { … }
    };
	
    // protected인 이유는 추상 메서드를 구현하는 상수에서 접근 하기 위함이다.
    protected final int value;
	
    Direction(int value) { this.value = value }
	
    abstract Point move(Point p);
}

3.2 Class EX)

abstract class Direction extends MyEnum {
    // 추상 클래스인 Direction을 생성하였기에 익명 클래스 형태로 추상 메서드인 move구현
    static final Direction EAST = new Direction(“EAST”) {
        Point move(Point p) { … }
    }

    // 추상 클래스인 Direction을 생성하였기에 익명 클래스 형태로 추상 메서드인 move구현
    static final Direction SOUTH = new Direction(“SOUTH”) {
        Point move(Point p) { … }
    }

    // 추상 클래스인 Direction을 생성하였기에 익명 클래스 형태로 추상 메서드인 move구현
    static final Direction WEST = new Direction(“WEST”) {
        Point move(Point p) { … }
    }

    // 추상 클래스인 Direction을 생성하였기에 익명 클래스 형태로 추상 메서드인 move구현
    static final Direction NORTH = new Direction(“NORTH”) {
        Point move(Point p) { … }
    }

    private String name;
    private Direction(String name) { this.name = name }

    // Direction의 추상 메서드 move 선언
    abstract Point move(Point p);
}

'개발 언어 > Java' 카테고리의 다른 글

[Java] Double Underscore  (0) 2021.10.22
[Java] 예외 처리  (0) 2021.08.27
[Java] 내부 클래스  (0) 2021.08.27
[Java] 인터페이스  (0) 2021.08.27
[Java] 추상 클래스&추상 메서드  (0) 2021.08.26

+ Recent posts