Spiral Array

문제는 다음과 같다:

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

2012/01/10 11:04

길가의풀

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

169개의 풀이가 있습니다. 1 / 17 Page

Scanner scan = new Scanner(System.in);

    int a,b,i,j;
    int r = 0,c = 0,num=0, l=0;
    //l=0 R, 1=1 B, 1=2 L, l=3 U 
    a = scan.nextInt();
    b = scan.nextInt();

    int[][] test = new int[a][b];

    for(i=0;i<a;i++)
    {
        for(j=0;j<b;j++)
        {
            test[i][j] = -1 ;
        }
    }

    while (num < a * b)
    {   
        test[r][c] = num++;

        switch (l) {
        case 0:
            if(c+1<b && test[r][c+1] == -1)
                c++;
            else{
                l=1;
                r++;
            }
            break;
        case 1:
            if(r+1<a && test[r+1][c] == -1)
                r++;
            else{
                l=2;
                c--;
            }
            break;
        case 2:
            if(c-1>=0 && test[r][c-1] == -1)
                c--;
            else{
                l=3;
                r--;
            }
            break;
        case 3:
            if(r-1>=0 && test[r-1][c] == -1)
                r--;
            else{
                l=0;
                c++;
            }
            break;
        default:
            break;
        }

    }

    for(i=0;i<a;i++)
    {
        for(j=0;j<b;j++)
        {
            System.out.print(test[i][j] + "\t");
        }
        System.out.println("");
    }


}

}

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
$row = 6;
$col= 6;

$total = $row*$col;

$x_max = $row-1;
$y_max = $col-1;
$total=$row*$col;

$array = process(0,0,$x_max,0,$y_max,0,1,0,$total);

for($x=0;$x<=$x_max;$x++){
    for($y=0;$y<=$y_max;$y++){
        if(strlen($array[$x][$y])==1) $array[$x][$y] = "0".$array[$x][$y]; 
        echo $array[$x][$y]."&nbsp;&nbsp;&nbsp;&nbsp;";

    }
    echo "<br>";
}

// $x =  x좌표값
// $y =  y좌표값
// $x_max = x 변수에 세팅할 수 있는 최대값
// $y_max = y 변수에 세팅할 수 있는 최대값
// $x_min = x 변수에 세팅할 수 있는 최소값
// $y_min = y 변수에 세팅할 수 있는 최소값
// $type = 어떤 좌표의 값이 증가할지 감소할지를 결정하는 값
// $insert = 배열에 세팅되는 숫자
// $max = 배열에 세팅되는 최대값

// 1) y좌표가 증가하고(X최대값 까지)
// 2) X좌표가 증가하고(Y최대값 까지)
    // ------------------------------ X최소값 증가, Y최대값 감소
// 3) Y좌표가 감소하고(Y최소값 까지)
// 4) X좌표가 감소하고(X최소값 까지)
    // ------------------------------ Y최소값 증가, X최대값 감소

// 1->2->3->4->1 ....  

function process($x,$y,$x_max,$x_min,$y_max,$y_min,$type,$insert,$max){

    for($cnt = 0; $cnt < $max; $cnt++){
        $array[$x][$y] = $insert;
        if($type ==1 && $y < $y_max){
            $y++;
            if($y == $y_max)    $type=2;

        }else if($type ==2 && $x < $x_max){
            $x++;
            if($x == $x_max){
                $type=3;
                $x_min++;
                $y_max--;
            }
        }else if($type ==3 && $y > $y_min){
            $y--;
            if($y == $y_min)    $type=4;
        }else if($type ==4 && $x > $x_min){
            $x--;
            if($x == $x_min){
                $type=1;
                $y_min++;
                $x_max--;
            }
        }
        $insert++;
    }

    return $array;
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
row=int(input('행의 수를 입력해주세요:'))
col=int(input('열의 수를 입력해주세요:'))

array=[['\n' for y in range(col)] for x in range(row)]
cnt=0
i=0
j=0
num=1
array[0][0]=0
while cnt < round(row/2):
    for j in range(j+1, col):
        if array[i][j]=='\n':
            array[i][j]=num
            num+=1
        else:
            j-=1
            break

    for i in range(i+1, row):
        if array[i][j]=='\n':
            array[i][j]=num
            num+=1
        else:
            i-=1
            break

    for j in range(j-1, -1, -1):
        if array[i][j]=='\n':
            array[i][j]=num
            num+=1
        else:
            j+=1
            break

    for i in range(i-1, -1, -1):
        if array[i][j]=='\n':
            array[i][j]=num
            num+=1
        else:
            i+=1
            break
    cnt+=1

print(array)


※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

일단은 try, except 써서 문제는 풀긴 했는데

except랑 finally 부분을 줄여 보려고 하면 CPU가 계속 돌더라구요;;

while 부분도 계속 돌아가길래 일단은 count 변수로 4번까지로 한정해두긴 했는데.. 이런 부분들이 해결이 안 되네요..

x, y = map(int, input().split(' '))
l=[]
for i in range(x):
    l.append(["0"]*y)

def view(mat):
    print("="*2*y)
    for opo in range(len(l)):
        print(" ".join(mat[opo]))

i = 0
j = 0
di = 0
dj = 1

for k in range(x*y):
    l[i][j]=str(k+1)
    view(l)
    count=0
    while count<4:
        count+=1
        try:
            if l[i+di][j+dj]=="0":
                i+=di
                j+=dj
                break
        except:
            pass
        finally:
            if l[i][j]!="0":
                a=di
                b=dj
                di=b
                dj=-a
                count+=1
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
def SpiralArray(X, Y):
    result = [[0 for i in range(X)] for j in range(Y)]
    x, y = (0, 0)
    min_x, min_y = (0, 1)
    max_x = X-1
    max_y = Y-1
    flag = 0

    for i in range(X*Y):
        print('x: ' + str(x) +' y: '+str(y) + ' = ' + str(i))
        result[y][x] = i
        if(flag == 0):
            x+=1
            if(x == max_x):
                max_x-=1
                flag = 1
        elif(flag == 1):
            y+=1
            if(y == max_y):
                max_y-=1
                flag = 2
        elif(flag == 2):
            x-=1
            if(x == min_x):
                min_x+=1
                flag = 3
        elif(flag == 3):
            y-=1
            if(y == min_y):
                min_y+=1
                flag = 0
    return result

def main():
    if (__name__ == '__main__'):
        for i in SpiralArray(6,6):
            row = ''
            for j in i:
                row += ('%3d'%j)
            print(row+'\n')

main()
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
public class SpiralArray {

    static int gop = 0;
    public static int[][] moveArray(int[][] arr, String move, int colStart, int colEnd, int rowStart, int rowEnd, int num) {

        if(num == 0) {
            gop = (colEnd+1) * (rowEnd+1);
        }

        if(num == gop) {
            return arr;
        }else {

            if(move.equals("r")) { 
                // 오른쪽으로
                // col 증가
                for(int i=colStart; i<=colEnd; i++) {
                    arr[rowStart][i] = num;
                    num++;
                }
                return moveArray(arr, "d", colStart, colEnd, rowStart+1, rowEnd, num);


            }else if(move.equals("d")) { 
                // 아래로
                // row 증가
                for(int i=rowStart; i<=rowEnd; i++) {
                    arr[i][colEnd] = num;
                    num++;
                }
                return moveArray(arr, "l", colStart, colEnd-1, rowStart, rowEnd, num);

            }else if(move.equals("l")) { 
                // 왼쪽으로
                // col 감소
                for(int i=colEnd; i>=colStart; i--) {
                    arr[rowEnd][i] = num;
                    num++;
                }
                return moveArray(arr, "u", colStart, colEnd, rowStart, rowEnd-1, num);

            }else {
                // 위로
                // row감소
                for(int i=rowEnd; i>=rowStart; i--) {
                    arr[i][colStart] = num;
                    num++;
                }
                return moveArray(arr, "r", colStart+1, colEnd, rowStart, rowEnd, num);
            }
        }
    }

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int arr1 = sc.nextInt();
        int arr2 = sc.nextInt();

        int[][] sArr = new int[arr1][arr2];

        int[][] moveArray = moveArray(sArr, "r", 0, arr1-1, 0, arr2-1, 0); // index는 0부터이기 때문에 -1씩 해줌

        for(int i=0; i<arr1; i++) {
            for(int j=0; j<arr2; j++) {
                System.out.print(moveArray[i][j] + "  ");
            }
            System.out.println();
        }


    }
}

재귀함수 써서 풀어봤어요

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
import java.util.Scanner;
enum Direction {R, D, L, T} 

public class Calculate {

    public static void main(String[] args) {

        Scanner s = new Scanner(System.in);
        Direction d = Direction.R;

        System.out.println("생성하고자 하는 매트릭스 크기를 입력하세요.");
        System.out.println("(6x6 생성시 6, 6 을 입력)");

        System.out.print("X축 크기 : ");
        int x = s.nextInt();
        System.out.print("Y축 크기 : ");
        int y = s.nextInt();
        int[][] table = new int[x][y];

        //배열을 -1로 초기화 (입력되지 않은 위치)
        for(int i=0 ; i<x ; i++)
            for(int j=0 ; j<y ; j++)
                table[i][j] = -1;

        int pX = 0;
        int pY = 0;
        String str = "";

        for(int i=0 ; i<x*y ; i++) { //전체 매트릭스 횟수 반복
            table[pY][pX] = i;

            //현재 방향으로 계속 이동 가능 여부 확인
            if( (d == Direction.R && pX+1<x  && table[pY][pX+1] == -1) || //오른쪽 이동 가능
                (d == Direction.D && pY+1<y  && table[pY+1][pX] == -1) || //하단   이동 가능
                (d == Direction.L && pX-1>-1 && table[pY][pX-1] == -1) || //왼쪽   이동 가능
                (d == Direction.T && pY-1>-1 && table[pY-1][pX] == -1)    //상단   이동 가능
              ){
                ;// 이동이 가능하면 아무것도 수행하지 않음
            } else {
            //현재 방향으로 계속 이동 불가능할 경우 다음 방향으로 변경
                if     (d == Direction.R) d = Direction.D;
                else if(d == Direction.D) d = Direction.L;
                else if(d == Direction.L) d = Direction.T;
                else if(d == Direction.T) d = Direction.R;
            }

            //다음 위치로 좌표 이동
            if     (d == Direction.R) ++pX;
            else if(d == Direction.D) ++pY;
            else if(d == Direction.L) --pX;
            else if(d == Direction.T) --pY;
        }
        for(int i=0 ; i<y ; i++){
            for(int j=0 ; j<x ; j++){
                str = table[i][j] < 10 ? " 0"+table[i][j] : " "+table[i][j];
                System.out.print(str);
            }
            System.out.println();
        }
    }

}

2017/08/04 09:16

SH

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

파이썬입니다

#2. Spiral Array

#1. row column input
#2. build up an array by using list-in-list
#3. 방향자를 복소수로하여 부딪히면 방향전환
#4. 출력 (출력시 오른쪽정렬하는법을 일반적으로 하는 방법은 모르겠음)

#1. 잘못 입력시 에러만 남
size = input()
space = size.find(' ')
row = int(size[0:space])
col = int(size[space+1:])

#2.
Array = []
hub = []
for i in range(col):
    hub.append(-1)
for i in range(row):
    Array.append(hub[:])

#3.
m, n, k = 0, 0, 0
Array[m][n] = k
D = complex(1,0)

while k < row*col -1:
    m = m + int(D.real)
    n = n + int(D.imag)
    try:
        if Array[m][n]!=-1:
            m = m - int(D.real)
            n = n - int(D.imag)
            D = D*(1j)
        else:
            k = k+1
            Array[m][n]=k
    except IndexError:
        m = m - int(D.real)
        n = n - int(D.imag)
        D = D*(1j)

#4.
for j in range(col):
    for i in range(row):
        print('{:2d}'.format(Array[i][j]),end=' ')
    print()

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

Python 3으로 풀었습니다. 뭔가 깔끔해보이지 않네요.

def print_spiral_array(m, n):
    array = [[-1 for _ in range(n)] for _ in range(m)]

    x, y, invalid = 0, 0, -1
    steps = [(0, 1), (1, 0), (0, -1), (-1, 0)]
    curr = 0

    for i in range(m * n):
        # print(i, x, y)
        array[x][y] = i
        new_x, new_y = x + steps[curr][0], y + steps[curr][1]

        # collision
        if new_x < 0 or new_x >= m or new_y < 0 or new_y >= n or array[new_x][new_y] != invalid:
            curr = (curr + 1) % len(steps)
            new_x, new_y = x + steps[curr][0], y + steps[curr][1]
        x, y = new_x, new_y

    for row in array:
        for item in row:
            print('%4s' % item, end='')
        print()
    print()

print_spiral_array(6, 6)
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
package java_tutorial;

import java.util.Scanner;

public class SpiralArray {

    public static void main(String[] args) {

        int movement = 1;
        int count = 0;
        int a = 0, b = -1;

        Scanner sc = new Scanner(System.in);

        System.out.print("가로, 세로 몇 칸짜리? : ");

        int length = sc.nextInt();
        int height = sc.nextInt();

        int [][]spiral = new int[height][length];

        int lenLimit = length;
        int heiLimit = height;

        while(true){             

            for(int i = 0; i < lenLimit; i++){
                    b = b + movement;
                    spiral[a][b]=count;
                    count++;
            }


            lenLimit--;
            heiLimit--;

            for(int i = 0; i < heiLimit; i++)
            {
                    a = a + movement;
                    spiral[a][b] = count;
                    count++;
            }
            if(lenLimit >= heiLimit && lenLimit == 0) 
            {
                    break;
            }

            if(lenLimit <= heiLimit && heiLimit == 0) 
            {
                    break;
            }

            movement=-movement;
        }

        for(int i = 0; i < height; i++)
        {
            for(int j = 0; j < length; j++)
            {
                System.out.print(spiral[i][j]+"\t");
            } 
            System.out.println();
        }
    }
}

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

풀이 작성

※ 풀이작성 안내
  • 본문에 코드를 삽입할 경우 에디터 우측 상단의 "코드삽입" 버튼을 이용 해 주세요.
  • 마크다운 문법으로 본문을 작성 해 주세요.
  • 풀이를 읽는 사람들을 위하여 풀이에 대한 설명도 부탁드려요. (아이디어나 사용한 알고리즘 또는 참고한 자료등)
  • 작성한 풀이는 다른 사람(빨간띠 이상)에 의해서 내용이 개선될 수 있습니다.
목록으로
코딩도장

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


언어별 풀이 현황
전 체 x 169
기 타 x 20
php x 1
python x 55
java x 37
go x 2
objectivec x 2
javascript x 2
cpp x 35
cs x 6
delphi x 1
ruby x 2
lisp x 2
clojure x 1
scala x 3