문제 링크
n^2 배열 자르기
풀이
- 문제 명, 문제 설명은 함정이다.
- 규칙성을 발견해야 풀 수 있다.
- 나는 왼쪽 좌표가 (left / n, left % n) , 오른쪽 좌표가 (right / n , right % n), 그리고 2차원 배열에 들어갈 값은 좌표중에 큰값 + 1 이라는 규칙성을 발견하긴 했지만, 이는 문제를 푸는데 전혀 도움되지 않았다.
- 좌표로 찾으면 결국엔 또 2차원 배열을 만들어야했기 때문이다.
- 심지어 그걸 통해서 list건 array건 뭘 써도 주어진 left와 right의 값이 long값이라는걸 알고서는 기존에 내장메서드도 사용할 수 없게 되었다.
- 결국 또 누군가가 찾아놓은 규칙성에 숟가락만 얹었다.
- 처음 주어진 예제가 2에서 5까지라면 그에 맞는 값은 다음과 같다.
범위 : |2|3|4|5|
결과 : |3|2|2|3|
- 위 경우에 순서대로 범위를 n으로 나눈 몫과 나머지를 비교해서 max값을 취하면 아래의 결과값이 나온다.
- 두번째로 주어진 예시를 확인해보자
범위 : |7|8|9|10|11|12|13|14|
결과 : |4|3|3|3|4|4|4|4|
- 이 경우에도 동일하게 적용되는 것을 알 수 있다.
- 위의 규칙성을 갖고 코드를 짜봤다.
class Solution {
public int[] solution(int n, long left, long right) {
int[] answer = new int[(int) (right - left) + 1];
for (long i = left; i < right + 1; i++) {
answer[(int) (i - left)] = (int) Math.max(i / n, i % n) + 1;
}
return answer;
}
}
소감