プログラマー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;
}
結果は通過!
Reference
この問題について(プログラマーn^2配列カットJava Java解題), 我々は、より多くの情報をここで見つけました
https://velog.io/@youngblue/프로그래머스-n2-배열-자르기-Java-자바-문제풀이
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
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,
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;
}
結果は通過!Reference
この問題について(プログラマーn^2配列カットJava Java解題), 我々は、より多くの情報をここで見つけました https://velog.io/@youngblue/프로그래머스-n2-배열-자르기-Java-자바-문제풀이テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol