여니의 취준 준비/코딩테스트 (Java)

[10994] 별찍기 - 19 in Java

여니's 2022. 8. 3. 14:33

https://www.acmicpc.net/problem/10994

 

10994번: 별 찍기 - 19

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.

www.acmicpc.net


(1) for문 이용

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		int I=Integer.parseInt(br.readLine());
		int n=4*I-3; // 격자 크기
		char[][] array=new char[n][n];
		int idx=0;
		
		for(int k=1; k<=I; k++) { // n번 사각형 그리기			 
			for(int i=idx; i<n-idx; i++) {	
				array[idx][i]='*'; // 사각형 맨 윗줄 그리기
				array[n-idx-1][i]='*'; // 맨 아랫줄 그리기
				array[i][idx]='*'; // 사각형 맨 왼쪽줄 그리기
				array[i][n-idx-1]='*'; // 사각형 맨 오른쪽줄 그리기
			}
			idx+=2; // 점점 작은 정사각형을 안쪽에 그려가기 위한 값 변경
		}
		
		for(int i=0; i<n; i++) {
			for(int j=0; j<n; j++) {
				if (array[i][j]!='*') {
					bw.write(' ');
				}else {
					bw.write('*');
				}
			}
			bw.write("\n");
		}
		bw.close();
	}
}

사각형 그리는 순서

가장 가장자리에 위치한 박스 (1) -> (2) -> (3)

 


(2) bfs로 푼 코드

-> 시간 훨씬 오래 걸림

package day_0920;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Queue;

class Point{
	int x,y,cnt;

	public Point(int x, int y,int cnt) {
		super();
		this.x = x;
		this.y = y;
		this.cnt=cnt;
	}
	
}

public class n10994 {
	static int n;
	static char[][] map;
	static boolean[][] visited;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		n=Integer.parseInt(br.readLine());
		n-=1;
		if(n==0) {
			System.out.print("*");
		}else {
			int N=n*4+1;
			map=new char[N][N];
			visited=new boolean[N][N];
			bfs((N)/2,(N)/2, N);
			for (int i = 0; i < N; i++) {
				for (int j = 0; j < N; j++) {
					System.out.print(map[i][j]);
				}
				System.out.println();
			}
		}
		
		
		
	}
	private static void bfs(int x, int y, int N) {
		int[] dxs= {-1,-1,0,1,1,1,0,-1};
		int[] dys= {0,1,1,1,0,-1,-1,-1};
		Queue<Point> queue=new ArrayDeque<>();
		queue.add(new Point(x,y,1));
		visited[x][y]=true;
		map[x][y]='*';
		while(!queue.isEmpty()) {
			Point p= queue.poll();
			for (int i = 0; i < 8; i++) {
				int nx=p.x+dxs[i];
				int ny=p.y+dys[i];
				if(canGo(nx,ny,N) && !visited[nx][ny]) {
					queue.add(new Point(nx,ny,p.cnt+1));
					visited[nx][ny]=true;
					if(p.cnt%2!=0) {
						map[nx][ny]=' ';
					}else {
						map[nx][ny]='*';
					}
				}
			}
		}
	}
	private static boolean canGo(int nx, int ny, int N) {
		return nx>=0 && nx<N && ny>=0 && ny<N;
	}

}