변경이력

돌아가기
3 16개 문자 추가 15개 문자 삭제

2015/04/25 14:27

홍옥

4일이나 걸렸어요... 매일 2시간씩 해서 했는데 <p>이 코드는 아무래도 if문이 너무 많아서 반복문내에서 매 번 if문을 하나하나 다 검사한다는게<p>썩 좋진 않아보이네요. 실행속도가 현저히 느릴거 같아요... 그래도 완성해서 매우 기쁩니다!<br> ```{.java} /* 입력: 6 6 출력: 0 1 2 3 4 5 19 20 21 22 23 6 18 31 32 33 24 7 17 30 35 34 25 8 16 29 28 27 26 9 15 14 13 12 11 10 위처럼 6 6 이라는 입력을 주면 6 X 6 매트릭스에 나선형 회전을 한 값을 출력해야 한다. */ import java.util.Arrays; import java.util.Scanner; public class Spiral_Array { public static void main(String[] args) { // 출력될 숫자 int output_Number=0; // 값을 두 개 입력받습니다. Scanner in = new Scanner(System.in); int n1 = in.nextInt(); int n2 = in.nextInt(); // 숫자가 들어갈 매트릭스를 생성합니다. int[][] Matrix = new int[n1][n2]; // 배열 값들을 다 -1로 초기화 (2D) for (int[] row: Matrix) Arrays.fill(row, -1); //위치 선택용 변수 int col=0, row=0, t_col=0, t_row=1, angle = 0; // row가 늘고 col가 늘고 row가 줄고 col가 줄고 row가 늘고 col가 늘고 ... 계속 반복함 for(int i=0; i<(n1*n2); i++) { Matrix[col][row]=output_Number; output_Number++; row = row + t_row; col = col + t_col; if(row==n2){ // 1번째 코너 row--; col++; t_col = t_row; t_row = 0; } if(col==n1){ // 2번째 코너 col--; row--; t_row = -t_col; t_col = 0; } if(row<0){ // 3번째 코너 row++; col--; t_col = t_row; t_row = 0; } if(Matrix[col][row] != -1) // 다른 수가 있다면(3번째 이후 모서리 봉착) { angle++; if(angle == 1)// ┌자 구간에 진입했을때 { row++; col++; t_col = 0; t_row = 1; } else if(angle == 2) // ┐자 구간에 진입했을때 { col++; row--; t_col = 1; t_row = 0; } else if(angle == 3) // ┘자 구간에 진입했을때 { col--; row--; t_col = 0; t_row = -1; }// └자 구간에 진입했을때 else if(angle == 4) // └자 구간에 진입했을때 { col--; row++; t_col = -1; t_row = 0; angle = 0; // 다시 초기화 } } } // 출력 for(int a=0; a<n1; a++){ for(int b=0; b<n2; b++){ System.out.print(Matrix[a][b] + "\t"); } System.out.println(); } } // main } // class ```
4일이나 걸렸어요... 매일 2시간씩 해서 했는데 <p>이 코드는 아무래도 if문이 너무 많아서 반복문내에서 매 번 if문을 하나하나 다 검사한다는게<p>썩 좋진 않아보이네요. 실행속도가 현저히 느릴거 같아요... 그래도 완성해서 매우 기쁩니다!<br> ```{.java} /* 입력: 6 6 출력: 0 1 2 3 4 5 19 20 21 22 23 6 18 31 32 33 24 7 17 30 35 34 25 8 16 29 28 27 26 9 15 14 13 12 11 10 위처럼 6 6 이라는 입력을 주면 6 X 6 매트릭스에 나선형 회전을 한 값을 출력해야 한다. */ import java.util.Arrays; import java.util.Scanner; public class Spiral_Array { public static void main(String[] args) { // 출력될 숫자 int output_Number=0; // 값을 두 개 입력받습니다. Scanner in = new Scanner(System.in); int n1 = in.nextInt(); int n2 = in.nextInt(); // 숫자가 들어갈 매트릭스를 생성합니다. int[][] Matrix = new int[n1][n2]; // 배열 값들을 다 -1로 초기화 (2D) for (int[] row: Matrix) Arrays.fill(row, -1); //위치 선택용 변수 int col=0, row=0, t_col=0, t_row=1, angle = 0; // row가 늘고 col가 늘고 row가 줄고 col가 줄고 row가 늘고 col가 늘고 ... 계속 반복함 for(int i=0; i<(n1*n2); i++) { Matrix[col][row]=output_Number; output_Number++; row = row + t_row; col = col + t_col; if(row==n2){ // 1번째 코너 row--; col++; t_col = t_row; t_row = 0; } if(col==n1){ // 2번째 코너 col--; row--; t_row = -t_col; t_col = 0; } if(row<0){ // 3번째 코너 row++; col--; t_col = t_row; t_row = 0; } if(Matrix[col][row] != -1) // 다른 수가 있다면(3번째 이후 모서리 봉착) { angle++; if(angle == 1)// ┌자 구간에 진입했을때 { row++; col++; t_col = 0; t_row = 1; } else if(angle == 2) // ┐자 구간에 진입했을때 { col++; row--; t_col = 1; t_row = 0; } else if(angle == 3) // ┘자 구간에 진입했을때 { col--; row--; t_col = 0; t_row = -1; }// └자 구간에 진입했을때 else if(angle == 4) // └자 구간에 진입했을때 { col--; row++; t_col = -1; t_row = 0; angle = 0; // 다시 초기화 } } } // 출력 for(int a=0; a<n1; a++){ for(int b=0; b<n2; b++){ System.out.print(Matrix[a][b] + "\t"); } System.out.println(); } } // main } // class ```
2 2개 문자 추가

2015/04/25 14:27

홍옥

1 Original

2015/04/25 14:27

홍옥

코딩도장

코딩도장은 프로그래밍 문제풀이를 통해서 코딩 실력을 수련(Practice)하는 곳입니다.