💡 오늘의 학습 키워드
- 배열
✅ 오늘 공부한 내용
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
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을 해주는 것
- row(가로), col(세로) 값이 있다면 그 중에 큰 값 + 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 문제 풀기
- 프로그래머스 코테 문제 풀다 만 문제 풀기
'개인 공부 > TIL' 카테고리의 다른 글
[ TIL - PGS ] 99클럽 코테 스터디 3일차 TIL + 오늘의 학습 가이드 (0) | 2024.07.24 |
---|---|
[ TIL - PGS ] 99클럽 코테 스터디 2일차 TIL + 오늘의 학습 가이드 (0) | 2024.07.23 |
[ TIL ] 2023.06.08 TIL + 지난 회고 및 일기 (0) | 2023.06.08 |
[ TIL ] 2023.04.28 TIL + 오늘의 트렌드 분석 (0) | 2023.04.28 |
[ TIL ] 2023.04.27 TIL + 오늘의 트렌드 분석 (0) | 2023.04.27 |