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 len = n * n;
int num = 0;
int cnt = 0;
int arrNum = 0;
int[] answer = new int[(int) (right-left) + 1];
for(int i = 0; i < n ; i ++){
for(int j = 1; j <= n ; j ++){
num = (i + 1) <= j ? j : i + 1;
if(cnt >= (int)left && cnt <= (int)right){
answer[arrNum] = num;
arrNum++;
}
cnt++;
}
}
return answer;
}
}
위와 같은 방식이다
그러니까 이게 결국 col과 row를 지정하고, row가 클 경우 row, 아니면 col을 넣는 방식이다
이 방식은 런타임오류로 ㅠ 틀렸는데 ㅠ
왜냐면 이게 모든 수를 세기 때문이다... 당연함. 애초에 long을 줬는데 전부 돌면 망함.
그렇게 해서 고민하다가...
public int[] t11(int n, long left, long right) {
// 결과 배열의 크기 계산
int[] answer = new int[(int) (right - left) + 1];
// 범위 내의 각 인덱스에 대해 값을 계산
for (long i = left; i <= right; i++) {
// 현재 인덱스에 해당하는 행렬의 행과 열 계산
int row = (int) (i / n);
int col = (int) (i % n);
// 행렬의 값 계산: 각 위치에서의 값은 최대(row + 1, col + 1)
answer[(int) (i - left)] = Math.max(row, col) + 1;
}
return answer;
}
이렇게 한다
결국 위나 아래나 똑같은데, 달라진 건 for문이 한줄이 되었다는 거...!
어차피 위의 방식도 row와 col 둘 중에 큰 값을 가져오는 건데, 아래도 같은 것이다.
나누는 것과 나머지 중에 큰 값 값을 answer 안에 넣는다는 것.
그리고 쓸데없이 0부터 시작하지 않도록 left부터 right까지를 순회한다.
답을 알고 있는 상태에서 식을 줄이는 게 제일 어려운 거 같다 쓰읍...
'Algorithm' 카테고리의 다른 글
[021] 1166.선물 (1) | 2024.02.28 |
---|---|
[020] H-Index (0) | 2024.02.27 |
[018] 할인 행사 (0) | 2024.02.27 |
[017] 괄호 회전하기 (0) | 2024.02.26 |
[016] 연속 부분 수열 합의 개수 (1) | 2024.02.23 |