코딩도장 Lv.2

|
문제는 다음과 같다:

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 매트릭스에 나선형 회전을 한 값을 출력해야 한다.

// javaScript 풀이
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html lang="ko">

<head>
    <script>
        function solution() {
            var m, n; // 배열의 크기
            var k = 0; // 출력 값
            var flag = 1; // 회전 값

            var m = parseInt(prompt('첫번째 숫자를 입력 하세요.'));
            console.log("첫번째 입력값 : " + m);
            var n = parseInt(prompt('두번째 숫자를 입력 하세요.'));
            console.log("두번째 입력값 : " + n);
            var answer = new Array(); // 출력값이 들어갈 배열

            for(var i=0; i<m; i++){
                answer[i] = new Array();
                for(var j=0; j<n; j++){
                    answer[i][j] = k;
                    k++;
                }
            }
            // 배열을 출력
            for(var i=0; i<answer.length; i++){
                document.write('<br/>')
                for(j=0; j<answer[i].length; j++){
                    document.write(answer[i][j] + ", ");
                }
            }
        }
    </script>
</head>

<body>
    <input type="button" value="알고리즘 부시기" onClick="solution()">
</body>


</html>

// JAVA 풀이
import java.util.Scanner;

public class go {

    public static void main(String args[]) {

        Scanner sc = new Scanner(System.in);
        System.out.print("숫자를 입력하세요  ex) 6 6 : ");
        int num1 = sc.nextInt();
        int num2 = sc.nextInt();

        spiralArray(num1, num2);

    }

    public static void spiralArray(int x, int y) {

        int[][] copy = new int[x][y]; 
        int count = 0;      // 0  ~  x*y-1 값
        int flag = 0;       // 진행방향
        int i = 0, j = 0;   

        while (true) {
            switch (flag) {                         //  진행방향    -> 
            case 0:                                 //  방에 값을 넣고 1 증가 시킴
                copy[i][j++] = count++;             //  다음 방향으로 한칸 이동
                if (j == y || copy[i][j] != 0) {    //  이동한 방에 값이 있거나 방이 없으면
                    j--;                            //  이전 방으로 돌아온다
                    i++;                            //  다음 진행할 방향으로 한칸이동
                    flag = 1;                       //  진행방향 설정
                }
                break;
            case 1:                                 //  진행방향    ↓
                copy[i++][j] = count++;
                if (i == x || copy[i][j] != 0) {
                    i--;
                    j--;
                    flag = 2;
                }
                break;
            case 2:                                 //  진행방향    <-
                copy[i][j--] = count++;
                if (j == -1 || copy[i][j] != 0) {
                    i--;
                    j++;
                    flag = 3;
                }
                break;
            case 3:                                 //  진행방향    ↑
                copy[i--][j] = count++;
                if (i == 0 || copy[i][j] != 0) {
                    i++;
                    j++;
                    flag = 0;
                }
                break;
            }

            if (count == x * y)    // 모든방에 값이 들어가면 나가기
                break;
        }

        for (i = 0; i < x; i++) {
            for (j = 0; j < y; j++) {
                System.out.print(copy[i][j] + "\t");
            }
            System.out.println();
        }
    }

}

// 풀이중

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html lang="ko">

<head>
    <script>
        function solution() {
            var m, n; // 배열의 크기
            var k = 0; // 출력 값
            var flag = 1; // 회전 값

            var m = parseInt(prompt('첫번째 숫자를 입력 하세요.'));
            console.log("첫번째 입력값 : " + m);
            var n = parseInt(prompt('두번째 숫자를 입력 하세요.'));
            console.log("두번째 입력값 : " + n);
            var answer = new Array(); // 출력값이 들어갈 배열

            for(var i=0; i<m; i++){
                answer[i] = new Array();
                if(flag == 1){
                    for(var a=0; a<n; a++){ // -> 진행 채우기
                        answer[i][a] = k;
                        k++;
                    }
                    flag *= (-1);
                }

                var temp = m;
                if(flag == -1){
                    for(var b=1; b<temp; b++){ // 아래 진행 채우기
                        answer[b] = new Array();
                        answer[b][temp-1] = k;
                        k++;
                    }
                    flag *= (-1);
                }

                var temp1 = n;
                if(flag == 1){
                    for(var c=1; c<temp1; c++){ // <- 진행 채우기
                        answer[temp1] = new Array();
                        answer[temp1][temp1-c] = k;
                        k++;
                    }
                    flag *= (-1);
                }

                /*
                for(var j=0; j<n; j++){ // 위 진행 채우기
                    answer[i][j] = k;
                    k++;
                }
                */
            }
            // 배열을 출력
            for(var i=0; i<answer.length; i++){
                document.write('<br/>')
                for(j=0; j<answer[i].length; j++){
                    document.write(answer[i][j] + ", ");
                }
            }
        }
    </script>
</head>

<body>
    <input type="button" value="알고리즘 부시기" onClick="solution()">
</body>


</html>

'Algorithm Study' 카테고리의 다른 글

재귀함수? rescursive? 이진함수트리?  (0) 2022.02.10
코딩도장 Lv.1  (0) 2020.01.09
And