본문 바로가기

반응형

1. n^2 배열 자르기

https://school.programmers.co.kr/learn/courses/30/lessons/87390

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

class Solution {
    public int[] solution(int n, long left, long right) {
        int leftC = (int) ((left-1)%n);
        int leftR = (int) ((left-1-leftC)/n);
        int rightC = (int) ((right-1)%n);
        int rightR = (int) ((right-1-rightC)/n);
        
        int rml = (int) (right - left);
        int[] answer = new int[rml+1];
        int ansInd = 0;
        
        for(int i = leftR; i <= rightR; i++){
            for(int j = 0; j < n; j++){
                if(i == leftR && j < leftC+1) j = leftC+1;
                if(i == rightR && j > rightC+1) break;
                answer[ansInd] = i > j ? i+1 : j+1;
                ansInd++;
            }
        }
        
        return answer;
    }
}

 이번 코드는 난이도에 비해서 고민할 것이 조금 많았습니다. 실제로는 문제에서 보여준 순서대로 진행했으나 left와 right의 자료형이 long임을 까먹어서 자료형 때문에 생긴 오류로 실패 했고, 그 다음엔 성공적으로 실행했으나 n^2의 2차원 배열과 n*n크기의 1차원 배열이 메모리를 초과하게 만들어서 실패 했습니다.
 그러고 나니 이젠 2차원 배열과 1차원 배열 만들기를 모두 스킵하고 규칙을 찾아서 풀었습니다. 처음 infrC부터 rightR까지가 모두 제가 찾은 규칙들입니다. 가상으로 2차원 배열을 만들고 각 인덱스의 순서를 부여해서 left와 right의 위치를 찾아 이중 for문이 그 범위 만큼만 반복되게 했습니다.
 메모리를 최소한으로 사용하는 법을 익히도록 해준 문제였던 것 같습니다.

2. 행렬의 곱셈

https://school.programmers.co.kr/learn/courses/30/lessons/12949

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

class Solution {
    public int[][] solution(int[][] arr1, int[][] arr2) {
        int a = arr1.length;
        int b = arr1[0].length;
        int c = arr2[0].length;

        int[][] answer = new int[a][c];

        for (int i = 0; i < a; i++) {
            for (int j = 0; j < c; j++) {
                for (int k = 0; k < b; k++) {
                    answer[i][j] += arr1[i][k] * arr2[k][j];
                }
            }
        }

        return answer;
    }
}

 진짜 오랜만에 행렬의 곱셈을 보는 것 같습니다. 어떻게 하는 것인지 기억이 안나서 다시 검색해 봤습니다.
 흥미롭게도 X * Y행렬과 Y * Z 행렬의 곱셈은 Y가 사라져서 X * Z 행렬이 되더군요. answer 배열의 크기를 여기서 유추할 수 있었습니다. 그리고 지금까지와는 다른 식으로 for문을 써봤습니다. 다른 식이라고 해봤자 생긴 것은 다르지는 않지만 단순히 i와 j만 바꾸는 것이 아닌 k까지 섞어서 쓰는 것은 처음이었습니다.

반응형
댓글