본문 바로가기
개인 공부/TIL

[ TIL - PGS ] 99클럽 코테 스터디 1일차 TIL + 오늘의 학습 가이드

by 킴도비 2024. 7. 22.

💡 오늘의 학습 키워드

  • 배열

 

✅ 오늘 공부한 내용

 

프로그래머스

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

programmers.co.kr

  • 오늘의 문제! 프로그래머스 n^2 배열 자르기

 

 

👀 오늘의 회고

🤣 오늘의 문제점

  • 역시나가 역시나를 했다.. 제한 사항의 10⁷을 무시했더니 역시 바로 시간 초과로 탈락했었다.
  • 그래서 한시간 정도 시도하고, 도저히 안되겠어서 질문하기를 참고했다.

 

🔥 어떤 시도를 했는가?

  • 전체 배열 생성 -> 배열 한줄로 만들기 -> 배열 해당하는 내용 자르기로 했으나 대실패✨
더보기
import java.util.*;

class Solution {
    public int[] solution(int n, long left, long right) {
        // n, left, light
        // n * n 2차원 배열 생성
        // i = 1 ~ n
        // i행 i열까지 모든 빈칸을 숫자 i로 채움
        // 1~n행을 잘라 모두 이어붙여 새로운 1차원 배열 생성
        // 새 배열 arr[left], arr[left + 1] , ...arr[right]만 남기기
        int[][] nn = new int[n][n];
        
        int i = 1;
        
        // 문제는 어떻게 채울 것인가..?
        // 보니까 ㄴ 반대 모양으로 점차 채워야 하는데 얘는 어떻게 배치를 할 것인가
        // 1차로 풀어 보니 test case 2, 3, 12~ 시간 초과가 발생하였다.
        
        int cnt = 0;
        //int cntx = 1;
        while(i != n){
            for(int x = i - 1; x < n; x++){
                if(nn[cnt][x] == 0){
                    nn[cnt][x] = x + 1;
                }
                if(nn[x][cnt] == 0){
                    nn[x][cnt] = x + 1;
                }
            }
            i++;
            cnt++;
            //System.out.println(i + ", n : " + n);
        }
        
        nn[n-1][n-1] = n;
        //System.out.println(Arrays.deepToString(nn));
        
        int[] arr = new int[n * n];
        
        cnt = 0;
        for(int x = 0; x < n; x++){
            for(int y = 0; y < n; y++){
                arr[cnt++] = nn[x][y];
            }
        }
        
       // System.out.println(Arrays.toString(arr));
        
        int[] answer = new int[(int)(right - left) + 1];
        cnt = 0;
        for(int x = (int)left; x <= (int)right; x++){
            answer[cnt++] = arr[x];
        }
        
        return answer;
    }
}
  • 일단 질문하기에서 참고했던 팁은
    • left 이전 값과 right 이후 값 만들지 않기
    • 어디서 규칙이 생기는지 보고 규칙 구하는 소스코드 구하기
    • 배열의 row와 col 값 구하기
    • left / n 과 left % n을 활용하기
  • 일단 이해가 잘 안되었기 때문에 역시 필기로 그려서 해결해보기 시작했다!

  • 이것 저것 그리고 뚫어져라 쳐다보니 나온 답
    • row(가로), col(세로) 값이 있다면 그 중에 큰 값 + 1 값이 우리가 구하고자 하는 값이 나온다.
      • nn(1, 2) 가 있다면 1 < 2니까 2 + 1을 하면 3이 나온다.
    • row를 구하는 방법은 (index 값 / n) + 1을 해주는 것
    • col을 구하는 방법은 (index 값 % n) + 1을 해주는 것
  • 그래서 우리가 구하고자 하는 7 인덱스를 참고하면
    • 7 / 4 -> 1
    • 7 % 4 -> 3
    • 1 < 3 
    • 3 + 1 = 4가 된다.
  • 이런식으로 right까지 쭉 반복하면 되는데
  • 어쨌든 배열에 저장을 해야 하는 것 아닌가 그래서 나는 아래와 같이 해서 풀이를 풀었다..!
class Solution {
    public int[] solution(int n, long left, long right) {
        // 1, 2, 3, 4, 2, 2, 3, 4, 3, 3, 3, 4, 4, 4, 4, 4
        // 모든 배열을 다 돌면 시간 초과 발생 됨.
        // 그 중에서 규칙을 찾아 보면 row, col 좌표 값 중 큰 값 + 1이 된다.
        // row, col 구하는 방식을 찾아서 계산해주면 끝
        
        int len = (int)(right - left) + 1;
        
        int[] answer = new int[len];
        
        for(int i = 0; i < len; i++){
            int row = (int)((i + left) / n) + 1;
            int col = (int)((i + left) % n) + 1;
            
            answer[i] = Math.max(row, col);
        }
        
        
        return answer;
    }
}

 

 

 

👏 무엇을 새로 알았는가?

  • 행과 열의 규칙 찾기

 

👩‍💻 내일은 무엇을 학습할 것인가?

  • 내일 항해 99 문제 풀기
  • 프로그래머스 코테 문제 풀다 만 문제 풀기