プログラマーn^2配列カットJava Java解題


プログラマーn^2配列カットJava Java解題


問題の説明と例


問題は以下の通りです.


nxnの正方形の2次元配列では,順次チャージすればよい.
rowとcolumnで計算すると、次のように値を入力できます.
1)r=cの場合
以前の1を例にとると、rとcの値は同じ位置(0,0)上の1にある.
次に2を見ると,同じrとcの値は同じ位置(1,1)に2がある.
3,4もそうです.
すなわち、rとcが一致する各位置には、左上から右下にかけて順次対角線が引かれる.(もちろん座標は0,0ですが、値は1からなので+1だと思います)
2)(r,c)中(r=i)または(c=i)の場合
例では、rまたはcの値が現在のループの値と同じである場合、対応する値を入力します.
(0,1)と(1,0)および(1,1)に2が入力されていることがわかる.
(1,2)と(2,1)および(2,2)に3が入力されていることがわかる.
したがって、行と列に対応する値が同じ行または列の場合は、値を入力します.
これで基本的に位置ごとにチャージするルールがわかります.
1番と2番を合わせると、最終的に行と列の中で現在のループの値と同じ場合、入力して繰り返します.
でもこの時は大切な2番には(1、0)も1、(1、2)もそれぞれ1がありますが、入力した値はそれぞれ2と3です.いったいどういうことですか.
つまり、2つの値に大きな値を入力します.
すなわち,(1,2)では,2つの大きな値に+1の3を入力し,2を除外する.
このようなルールで探せばいいです.

しかし、問題で与えられたように、2番目の配列を書き出して接続し、1番目の配列として切り取ると、nが10^7に与えられると、n^2はint範囲の10^9を超える.
したがって、効率テストに合格できなかったり、最大値が与えられなかったりすると、制限条件を満たすことができません.

では、どうすればいいのでしょうか。


上に見たルールのように,(r,c)で2つのうちの最値を求めればよい.
class Solution {
  public int[] solution(int n, long left, long right) {
     int answer = new int[(left-right) + 1]; //시작점부터 포함해야 하므로 +1 크기로 선언

     int idx = 0; //list로 변형해서 처리하면 필요 없음
     for(int i = left; i<right+1; i++){
         answer[idx] = (Math.max(i/n, i%n) + 1);
         idx++;
     }
}
 n = 3;
 left = 2;
 right = 5; 
 1, 
大きな問題が発生した.与えられた左と右のlong値により、実行結果が汚くなります.
したがって、戻り値自体をListに変更する.
    public List<Long> solution(int n, long left, long right) {
        List<Long> answer = new ArrayList<>();

        for (long i = left; i < right + 1; i++) {
            answer.add(Math.max(i / n, i % n) + 1);
        }
        return answer;
    }
結果は通過!