
우선 오답 풀이 먼저....
import java.util.*;
class Solution {
public int[] solution(int n) {
int[] answer = new int[(n*(n+1))/2];
int[][] arr = new int[n+1][n+1];
int i = 0;
int j = 0;
int count = 0;
int num = 1;
while(n>0) {
//밑으로 내려가기
while(count<n) {
arr[i][j] = num++;
i++;
count++;
}
count = 0;
n--;
//오른쪽으로 가기
while(count<n) {
arr[i][j] = num++;
j++;
count++;
}
count = 0;
n--;
//왼쪽 대각선
while(count<n) {
arr[i][j] = num++;
i--;
j--;
count++;
}
count = 0;
n--;
}
int idx = 0;
for(int k=0; k<arr.length; k++) {
for(int h=0; h<arr[0].length; h++) {
if(arr[k][h] != 0) {
answer[idx] = arr[k][h];
idx++;
}
}
}
return answer;
}
}
결과
테스트 1
입력값 〉 4
기댓값 〉 [1, 2, 9, 3, 10, 8, 4, 5, 6, 7]
실행 결과 〉 실행한 결괏값 [1,2,3,10,4,9,5,6,7,8]이 기댓값 [1,2,9,3,10,8,4,5,6,7]과 다릅니다.
테스트 2
입력값 〉 5
기댓값 〉 [1, 2, 12, 3, 13, 11, 4, 14, 15, 10, 5, 6, 7, 8, 9]
실행 결과 〉 실행한 결괏값 [1,2,3,13,4,14,12,5,15,11,6,7,8,9,10]이 기댓값 [1,2,12,3,13,11,4,14,15,10,5,6,7,8,9]과 다릅니다.
테스트 3
입력값 〉 6
기댓값 〉 [1, 2, 15, 3, 16, 14, 4, 17, 21, 13, 5, 18, 19, 20, 12, 6, 7, 8, 9, 10, 11]
실행 결과 〉 실행한 결괏값 [1,2,3,16,4,17,15,5,18,14,6,19,20,21,13,7,8,9,10,11,12]이 기댓값 [1,2,15,3,16,14,4,17,21,13,5,18,19,20,12,6,7,8,9,10,11]과 다릅니다.
테스트 결과 (~˘▾˘)~
3개 중 0개 성공
뭐야? 순간 맞은 줄;
또 연습장에 내 코드대로 촵촵 풀어봤더니.. 문제 발견!
위 코드의 문제점은 i와 j가 제대로 갱신되지 않아서 생긴것이었다!
즉, 첫 사이클 끝난 후 i = 1, j = 1인데, 바로 그 다음에 i++하면 위치가 틀어진다. 이런 식으로 방향 전환 후 다음 시작점 위치가 꼬이고, 결과 순서가 망가져버리는 이슈..
i와 j는 다음 반복에서 영향을 주기 때문에 마지막 arr에 들어간 i, j값이 고대로 다음 반복으로 넘어가야 한다. 하지만 내 코드는 arr에 넣은 후 i와 j의 값이 변경된다. 이 부분을 수정했다.
import java.util.*;
class Solution {
public int[] solution(int n) {
int[] answer = new int[(n*(n+1))/2];
int[][] arr = new int[n+1][n+1];
int i = -1;
int j = 0;
int count = 0;
int num = 1;
while(n>0) {
//밑으로 내려가기
while(count<n) {
i++;
arr[i][j] = num++;
count++;
}
count = 0;
n--;
//오른쪽으로 가기
while(count<n) {
j++;
arr[i][j] = num++;
count++;
}
count = 0;
n--;
//왼쪽 대각선
while(count<n) {
i--;
j--;
arr[i][j] = num++;
count++;
}
count = 0;
n--;
}
int idx = 0;
for(int k=0; k<arr.length; k++) {
for(int h=0; h<arr[0].length; h++) {
if(arr[k][h] != 0) {
answer[idx] = arr[k][h];
idx++;
}
}
}
return answer;
}
}
x=-1.. 약간 임시방편? 느낌으로 했는데 맞아서 당황했다;
당연히 x=0, y=0으로 두고 후위증가를 했더니 틀리길래 연습장에 슥슥 풀어본 결과 먼저 x와 y를 증가하거나 감소한 뒤 arr에 넣어야 맞는 답이 나오더라. 그러기 위해서는 x가 -1부터 시작해야 하는데... 싶어서 -1로 바꿔서 돌려봤는데 정답이였다..
암튼 이렇게 정답! ㅎㅎ
import java.util.*;
class Solution {
public int[] solution(int n) {
int[][] arr = new int[n][n];
int x = -1;
int y = 0;
int num = 1;
for(int i=0; i<n; i++) {
//아래
if(i%3==0) {
for(int j=i; j<n; j++) {
x++;
arr[x][y] = num++;
}
}
//오른쪽
else if(i%3==1) {
for(int j=i; j<n; j++) {
y++;
arr[x][y] = num++;
}
}
//왼쪽 대각선
else if(i%3==2) {
for(int j=i; j<n; j++) {
x--;
y--;
arr[x][y] = num++;
}
}
}
//answer에 넣기
int[] answer = new int[(n*(n+1))/2];
int idx = 0;
for(int i=0; i<n; i++) {
for(int j=0; j<n; j++) {
//0이 아닐경우
if(arr[i][j] != 0) {
answer[idx] = arr[i][j];
idx++;
}
}
}
return answer;
}
}
예전 풀이를 보니 이중 for문을 통해 풀었더라
고거 참고해서 한번 더 풀어봄
내가 푼 코드보다 훨씬 깔끔해 보이는 건 기분탓일까...?
이 문제도 즐찾 되어있어서 일단 쫄고 시작했고... 역시나 쉽지 않더라
아 푸는 방법은 알겠는데 뭔가 코드로 만드는게 쉽지 않다.
이전에 풀었던 방식이랑 현재 푼 방식이 다른 것도 신기하다
같은 문제, 같은 머리인데도 다른 풀이가 나와버리고~
시야가 넓어진거라고 생각할게요 &*