본문 바로가기

알고리즘

Seat

설계보고 코드치다가, 사이즈 부분에서 고민하기 싫어서 배열 크기를 많이 주고 풀었다.

import java.util.Scanner;
public class Main{
    
    public static int[][] arr;
    public static int sero;
    public static int garo;
    public static int target;
    public static int[] dx = new int[]{0,1,0,-1};
    public static int[] dy = new int[]{1,0,-1,0};
    public static void main(String[] args){

      // 나선형 / 나선은 (1,1)에서 시작 (1,1~6)(2~7,6)(7,6~1)만나면 또 돌고
      // (1,6) (2,6) (3,6) (4,6) ... (7,6)
      // (1,5)
      // (1,4)
      // (1,3)
      // (1,2)
      // (1,1)
      // 입력볌위: 5<= 가로,세로 <=1000
      // 입력: 7 6   
      //       12
      // 출력 : 12의 좌표(가로,세로)
      // 이해 : 1,1이 왼쪽위로 오게 만들자
      // 그렇다면 처음 입력받는것을 sero, 두번째 입력받는 것을 garo로 하고
      // [0] sero ,garo 를 입력받는다.
      // [0-1] target을 입력받는다. 만약 타겟 값이 세로*가로 값보다 크면 0 출력하고 종료
      
      // v [1] arr[sero+2][garo+2]로 만들어주자 (배열 생성)
      // v [2] 테두리는 -1로 만들어준다. (4개 초기화)
      // v [3] (중요) dx[],dy[]를 만들어준다.(4방향) (오른쪽,아래,왼쪽,위) 순서로 생성
      // [4] while문 사용, cx=1,cy=1,v=1;arr[cx][cy]=1,int idx=0;
      // [5] arr[cx+dx[idx][cy+dx[idx]]의 값이 0이면 이동, cx = cx+dx[i],cy = cy+dy[i] / v값을 넣어주고 1만큼 늘려준다.
      // [6] 그게 아니면 i의 값을 모듈 연산 해줌
      // [7] 만약 v == 세로* 가로 값에 도달하면 종료 시킨다.
      // [8] 이중 포문을 돌려서 좌표값을 찾는다.
      
      Scanner scan = new Scanner(System.in);
      sero = scan.nextInt();
      garo = scan.nextInt();
      target = scan.nextInt();
      if(target>sero*garo)
      {
        System.out.println(0);return;
      }
      
      arr = new int[1020][1020];
      init();
      int cx = 1;int cy=1;int v=1;arr[cx][cy]=1;int idx=0;
      while(true)
      {
        if(   arr[   cx+dx[idx] ][cy+dy[idx] ]==0)
        {
          // System.out.println(cx+" "+cy);
          cx = cx+dx[idx];
          cy = cy+dy[idx];
          arr[cx][cy]=++v;
        }
        else
        {
          idx=(idx+1)%4;
        }
        // if(v>=40)printArr();
        if(v>=sero*garo)break;
      }
      
      
      printArr();
      
      int px=0;
      int py=0;
      for(int i=1;i<=sero;i++)
      {
        for(int j=1;j<=garo;j++)
        {
          if(arr[i][j]==target)
          {
            px = i;py=j;
          }
        }
      }
      
      System.out.println(px+" "+py);
      
      scan.close();
    }
    public static void init()
    {
      // |  | 
      for(int i=0;i<=sero+1;i++)
      {
        arr[i][0]=-1;  //(0,0)(1,0)(2,0)(3,0)(4,0)(5,0)
        arr[i][garo+1]=-1;//(0,7)(1,7)(2,7)(3,7)(4,7)(5,7)
      }
      // - (0~7)
      for(int i=0;i<=garo+1;i++)
      {
        arr[0][i]=-1;//(0,0)(0,1)(0,2)(0,3)(0,4)(0,5)(0,6)(0,7)
        arr[sero+1][i]=-1;
      }
    }
    
    public static void printArr()
    {
      for(int i=0;i<=sero+2;i++)
      {
        for(int j=0;j<=garo+2;j++)
        {
          System.out.print(arr[i][j]+" ");
        }System.out.println();
      }
    }
}

'알고리즘' 카테고리의 다른 글

inequal  (0) 2019.08.01
Class President  (0) 2019.08.01
Offset  (0) 2019.08.01
상자색칠  (0) 2019.04.16
소수판별2  (0) 2019.04.16