N*N의 격자판이 주어지면 각 행의 합, 각 열의 합, 두 대각선의 합 중 가 장 큰 합을 출력합니다.
function solution(arr){
let answer=Number.MIN_SAFE_INTEGER;
let n=arr.length;
let rowMax=0, colMax=0, diaMax=0, tmp;
for(i=0; i<n; i++) {
tmp=0;
for(let x of arr[i]) {
tmp += x;
}
if(rowMax < tmp) rowMax=tmp;
}
for(i=0; i<n; i++) {
tmp=0;
for(j=0; j<n; j++) {
tmp += arr[j][i];
}
if(colMax < tmp) colMax=tmp;
}
let s=0,d=0;
for(i=0; i<n; i++) {
s += arr[i][i];
d += arr[n-i-1][i];
}
diaMax = (s > d ? s : d);
answer = Math.max(rowMax,colMax,diaMax);
return answer;
}
let arr=[[10, 13, 10, 12, 15],
[12, 39, 30, 23, 11],
[11, 25, 50, 53, 15],
[19, 27, 29, 37, 27],
[19, 13, 30, 13, 19]];
console.log(solution(arr));
function solution(arr){
let answer=Number.MIN_SAFE_INTEGER;
let n=arr.length;
let sum1=sum2=0;
for(let i=0; i<n; i++){
sum1=sum2=0;
for(let j=0; j<n; j++){
sum1+=arr[i][j];
sum2+=arr[j][i];
}
answer=Math.max(answer, sum1, sum2);
}
sum1=sum2=0;
for(let i=0; i<n; i++){
sum1+=arr[i][i];
sum2+=arr[i][n-i-1];
}
answer=Math.max(answer, sum1, sum2);
return answer;
}
let arr=[[10, 13, 10, 12, 15],
[12, 39, 30, 23, 11],
[11, 25, 50, 53, 15],
[19, 27, 29, 37, 27],
[19, 13, 30, 13, 19]];
console.log(solution(arr));
나의 풀이의 경우 rowMax
와 colMax
를 통해 각각 for
문을 통해서 2번 반복하여 행의 최댓값과 열의 최댓값을 구했는데 반해, 정답 풀이의 경우, for
문의 중첩을 이용한 것 까지는 나의 풀이와 동일하지만, arr[i][j]
와 arr[j][i]
를 사용하여 한번에 행과 열의 합을 구하고, 반복을 통해 Math.Max(answer,sum1,sum2)
중 가장 큰 값을 매 반복 갱신해주도록 하였다. 이 또한 나의 경우는 행을 각각 비교, 열을 각각 비교한 후 마지막에 최댓값을 계산해준 것에 비해 훨씬 효율적이고 가독성이 좋은 코드이다.
지도 정보가 N*N 격자판에 주어집니다. 각 격자에는 그 지역의 높이가 쓰여있습니다. 각 격자 판의 숫자 중 자신의 상하좌우 숫자보다 큰 숫자는 봉우리 지역입니다. 봉우리 지역이 몇 개 있는지 알아내는 프로그램을 작성하세요.
격자의 가장자리는 0으로 초기화 되었다고 가정한다.
function solution(arr){
let answer=0;
let n=arr.length;
for(i=0; i<n; i++) {
for (j=0; j<n; j++) {
let isPeak = true;
if(i !== 0) {
if(arr[i][j] <= arr[i-1][j]) isPeak = false;
}
if(i !== n-1) {
if(arr[i][j] <= arr[i+1][j]) isPeak = false;
}
if(j !== 0) {
if(arr[i][j] <= arr[i][j-1]) isPeak = false;
}
if(j !== n-1) {
if(arr[i][j] <= arr[i][j+1]) isPeak = false;
}
if(isPeak) answer ++;
}
}
return answer;
}
let arr=[[5, 3, 7, 2, 3],
[3, 7, 1, 6, 1],
[7, 2, 5, 3, 4],
[4, 3, 6, 4, 1],
[8, 7, 3, 5, 2]];
console.log(solution(arr));
function solution(arr){
let answer=0;
let n=arr.length;
let dx=[-1, 0, 1, 0];
let dy=[0, 1, 0, -1];
for(let i=0; i<n; i++){
for(let j=0; j<n; j++){
let flag=1;
for(let k=0; k<4; k++){
let nx=i+dx[k];
let ny=j+dy[k];
if(nx>=0 && nx<n && ny>=0 && ny<n && arr[nx][ny]>=arr[i][j]){
flag=0;
break;
}
}
if(flag) answer++;
}
}
return answer;
}
let arr=[[5, 3, 7, 2, 3],
[3, 7, 1, 6, 1],
[7, 2, 5, 3, 4],
[4, 3, 6, 4, 1],
[8, 7, 3, 5, 2]];
console.log(solution(arr));
나의 풀이의 경우 if
문의 중첩을 4번 반복하여 상하좌우의 사례를 확인했으나, 정답 풀이의 경우는 let dx=[-1, 0, 1, 0];
와 let dy=[0, 1, 0, -1];
를 통해서 상하좌우의 경우를 지정하고, k
를 포함한 for
문으로 나의 풀이의 4개의 if
문을 하나의 if
문으로 통합시켰다.
우아한 테크코스
의 후기를 통해 알게된 점인데, 코드 과제의 indent(깊이)
를 3으로 제한하는 조건이 주어지곤 한다고 한다. 그렇다면 내 풀이와 정답 풀이의 경우는 indent
가 4인 경우로 추정되는데, 해당 문제를 indent
를 3으로 제한 할 경우 어떻게 해야 문제를 해결할 수 있을까?