알고리즘/삼성 SW expert Academy

[SWEA] 1954. 달팽이 숫자_JAVA

뇌장하드 2022. 5. 9. 21:58

https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=2&contestProbId=AV5PobmqAPoDFAUq&categoryId=AV5PobmqAPoDFAUq&categoryType=CODE&problemTitle=&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=2&pageSize=10&pageIndex=2 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

D2문제를 풀다가 마주한 달팽이 처음에 어떻게 구현을 해야할지 몰라서 다른 블로그를 참고해서 곰곰히 생각하니깐 괜찮았다. 

 

import java.util.Scanner;
import java.io.FileInputStream;
 
class Solution
{
    public static void main(String args[]) throws Exception
    {
        int[] dy={1,0,-1,0};
        int[] dx={0,1,0,-1}; 
        Scanner sc = new Scanner(System.in);
        int T;
        T=sc.nextInt();
        for(int test_case = 1; test_case <= T; test_case++)
        {
            int num=1;
            int x=0,y=0,dir=0;
            int n=sc.nextInt();
            int map [][] =new int[n][n];
            while(num<=(n*n)){
                map[x][y]=num++; //하나씩 증가시키기 이제 상하좌우로 이동 먼저 오른쪽에서 왼쪽으로 
                x+=dx[dir];
                y+=dy[dir];
                if(x>n-1||x<0|| y > n-1 || y < 0 || map[x][y] != 0){ //범위 밖이거나 값이 저장되었을 경우 방향을 바꿔준다.
                    x-=dx[dir]; //왔던거 되돌아 가주고
                    y-=dy[dir];
                    dir=(dir+1)%4; // 방향 체인지
                    x+=dx[dir];     // 방향으로 이동
                    y+=dy[dir];              
                }              
            }
            System.out.println("#"+test_case);
         for(int i = 0; i < n; i++) {
                for(int j = 0; j < n; j++) {
                    System.out.print(map[i][j] + " ");
                }
                System.out.println();
            }
        }
    }
}

 

 

내가 참고하려고 만든 코드 버전

import java.util.*;
import java.io.*;
 
class Solution
{
    public static void main(String args[]) throws Exception
    {
        StringBuilder sb=new StringBuilder();
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        int [] day =  {0,31,28,31,30,31,30,31,31,30,31,30,31};
        int T=Integer.parseInt(br.readLine());
        for(int test_case = 1; test_case <= T; test_case++)
        {
            StringTokenizer st=new StringTokenizer(br.readLine());
            int x1=Integer.parseInt(st.nextToken());
            int x2=Integer.parseInt(st.nextToken());
            int y1=Integer.parseInt(st.nextToken());
            int y2=Integer.parseInt(st.nextToken());
            int sum=0;
            for(int i=x1; i<y1; i++){
                sum+=day[i];
            }
            sum+=(y2-x2+1);
            sb.append("#").append(test_case).append(" ").append(sum);
            sb.append("\n");
        }
        System.out.print(sb.toString());
    }
}

미약하게나마 빨라진다.