IT's 우

[java] 프로그래머스 - n^2 배열 자르기 본문

알고리즘/프로그래머스

[java] 프로그래머스 - n^2 배열 자르기

디우 2023. 8. 16. 15:54
728x90

📖 풀이한 문제


 

💡 문제에서 사용된 알고리즘

  • 수학

 

📜 코드 설명

  • left와 right의 인덱스에 해당하는 값을 넣을 배열
// 답 배열 (left ~ right)
        int[] answer = new int[(int)(right - left + 1)];
  • answerIdx : answer에 해당하는 인덱스
  • left와 right의 위치 (이때 left와 right가 long 타입인 점을 유의하여야 한다.)
// left와 right의 2차원 배열에서 위치
        int left_r = (int)(left / n);
        int left_c = (int)(left % n);

        int right_r = (int)(right / n);
        int right_c = (int)(right % n);
  • 2차원 배열의 값은 행과 열 중 큰 수 + 1인 것을 알 수 있다.
  • 이중포문으로 answer에 값을 넣어준다. 첫번째 for문은 행, 두 번째 for문은 열에 해당한다.
  • 여기서 유의할 점은
    • 행의 시작은 left_r~reight_r까지이고
    • 열의 시작은 행이 left_r일 경우에는 left_c부터 해주고 아닌 경우에는 0부터 두 번째 for문 탐색을 시작한다. 또한 행이 right_r이고 열이 right_c이면 right까지 찾아주었으므로 반복문을 종료한다. (시간초과를 위해)

📜 코드

class Solution {
    public int[] solution(int n, long left, long right) {
        // 답 배열 (left ~ right)
        int[] answer = new int[(int)(right - left + 1)];
      
    
        // left~right 배열(answer)에 해당하는 인덱스 
        int answerIdx = 0;
        
        // left와 right의 2차원 배열에서 위치
        int left_r = (int)(left / n);
        int left_c = (int)(left % n);
        
        int right_r = (int)(right / n);
        int right_c = (int)(right % n);
        
        // 2차원 배열의 값은 행과 열 중 큰 수 + 1
        // 첫번째 반복문은 행, 두번째 반복문은 열
        // (첫번째 반복문)행의 시작은 left의 행 시작부터
        for (int i = left_r; i <= right_r; i++) {
                // (두번째 반복문)열은 행의 시작일 경우는 left_c부터 시작하고 아니면 0부터
        
            int start_c = i == left_r ? left_c : 0;
            
            for (int j = start_c; j < n; j++) {         
                answer[answerIdx++] = Math.max(i, j) + 1;
                
                // 열과 행이 right의 위치일 경우 반복문 종료
                if (i == right_r && j == right_c) break;
            }
        }
        return answer;
    }
}
728x90
반응형