0_ch4n
기계쟁이\n개발자
0_ch4n
0chn.xxx@gmail.com @0ch._.n
전체 방문자
오늘
어제

공지사항

  • All (282)
    • 🖥 CS (21)
      • 네트워크 (12)
      • 운영체제 (3)
      • 자료구조 (2)
      • Web (4)
    • 🧠 Algorithm (185)
      • [C] BOJ (93)
      • [JAVA] Programmers (91)
    • 📚 Study (69)
      • HTML&CSS (19)
      • MySQL (11)
      • JAVA (22)
      • Servlet&JSP (8)
      • Thymeleaf (2)
      • Spring (5)
      • JPA (2)
    • 📖 Book (1)
    • 📃 Certification (6)
      • 정보처리기사 (6)

인기 글

최근 글

최근 댓글

태그

  • CSS
  • java
  • kakao
  • 프로그래머스
  • 카카오
  • Programmers
  • til
  • 코테
  • 코딩테스트
  • 자바

블로그 메뉴

  • 홈
  • 태그
  • 방명록

티스토리

hELLO · Designed By 정상우.
0_ch4n

기계쟁이\n개발자

[87390번] n^2 배열 자르기
🧠 Algorithm/[JAVA] Programmers

[87390번] n^2 배열 자르기

2022. 6. 17. 15:52
반응형

월간 코드 챌린지 시즌3

 

✔️ 문제 설명

정수 n, left, right가 주어집니다. 다음 과정을 거쳐서 1차원 배열을 만들고자 합니다.

  1. n행 n열 크기의 비어있는 2차원 배열을 만듭니다.
  2. i = 1, 2, 3, ..., n에 대해서, 다음 과정을 반복합니다.
    • 1행 1열부터 i행 i열까지의 영역 내의 모든 빈 칸을 숫자 i로 채웁니다.
  3. 1행, 2행, ..., n행을 잘라내어 모두 이어붙인 새로운 1차원 배열을 만듭니다.
  4. 새로운 1차원 배열을 arr이라 할 때, arr[left], arr[left+1], ..., arr[right]만 남기고 나머지는 지웁니다.

정수 n, left, right가 매개변수로 주어집니다. 주어진 과정대로 만들어진 1차원 배열을 return 하도록 solution 함수를 완성해주세요.

 

더보기

✔️ 입출력 예

입출력 예 #1

  • 다음 애니메이션은 주어진 과정대로 1차원 배열을 만드는 과정을 나타낸 것입니다.

입출력 예 #2

  • 다음 애니메이션은 주어진 과정대로 1차원 배열을 만드는 과정을 나타낸 것입니다.

 

✔️ 제한 사항

  • 1 ≤ n ≤ 107
  • 0 ≤ left ≤ right < n2
  • right - left < 105

 

✔️ 코드 구상

makeCube로 2차원 배열의 각 위치에 알맞은 값을 넣고

divideCube로 각 열마다 잘라서 1차원 배열을 다시 구성

solution에선 만들어진 1차원 배열을 받아 left~right까지 잘라내서 반환

 

✔️ 1차 코드 (실패)

  • 범위 내의 전체 값을 구하려다보니 메모리 초과가 뜨는거 같다...
  • left~right 값만 구하도록 다시 짜봐야겠다.
class Solution {
    public int[] solution(int n, long left, long right) {
        int[] arr = divideCube(n, makeCube(n));
        int[] answer = new int[(int) (right - left + 1)];
        int breakpoint = (int) (right - left);

        for (int i = 0; i <= breakpoint; i++) {
            answer[i] = arr[(int) left++];
        }

        return answer;
    }

    public int[][] makeCube(int n) {
        int[][] cube = new int[n][n];

        for(int i = 0; i < n; i++) {
            for(int j = 0; j < n; j++) {
                if(i == 0 && j == 0) {
                    cube[i][j] = 1;
                } else if(i == j) {
                    cube[i][j] = i + 1;
                } else {
                    cube[i][j] = i > j ? i + 1 : j + 1;
                }
            }
        }

        return cube;
    }

    public int[] divideCube(int n, int[][] cube) {
        int[] result = new int[n * n];
        int iter = 0;
        int i = 0;

        while(iter < n * n) {
            for(int j = 0; j < n; j++) {
                result[iter++] = cube[i][j];
            }
            i++;
        }

        return result;
    }
}

 

✔️ 2차 코드 (성공)

  • left / n 으로 x좌표를 구하고 left % n 으로 y좌표를 구한 후 규칙성을 천천히 살펴보니 규칙이 있었다!!!!
  • 그렇게 left~right만 뽑아내서 구하는 코드로 다시 갈아엎었다...
class Solution {
    public int[] solution(int n, long left, long right) {
        int[] answer = new int[(int) (right - left + 1)];

        for(int i = 0; left <= right; left++) {
            int x = (int) (left / (long) n);
            int y = (int) (left % (long) n);
            int max = x > y ? x : y;

            if(x == 0 || y == 0 || x == y) {
                answer[i++] = max + 1;
            } else if(x == n - 1 || y == n - 1) {
                answer[i++] = n;
            } else {
                answer[i++] = x + y > max + 1 ? max + 1 : x + y;
            }
        }

        return answer;
    }
}

 

📄 원문

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

반응형
저작자표시 (새창열림)

'🧠 Algorithm > [JAVA] Programmers' 카테고리의 다른 글

[1835번] 단체사진 찍기  (0) 2022.06.19
[42888번] 오픈채팅방  (0) 2022.06.18
[60057번] 문자열 압축  (0) 2022.06.16
[12917번] 문자열 내림차순으로 배치하기  (0) 2022.06.16
[12915번] 문자열 내 마음대로 정렬하기  (0) 2022.06.15
    0_ch4n
    0_ch4n
    while(true) { study(); }

    티스토리툴바