본문 바로가기

ProgramSoliving

백준 : 1022

반응형

메모리초과를 해결하는 아이디어를 얻지못해서 한참 해맸던 문제이다.

 

이때 문제에 힌트에서는 r1~r2 c1~c2 범위가 200을 넘지않는다.

 

따라서 y,x 를 조작하면서 범위안에 들어왓을 때 배열에 저장해주면된다.

 

문제를 풀면서 한참해맨게 있는데 절대값이 5000이라는 힌트를보고 10000*10000 의 카운트 개수가 한계라고 생각하고 while(1억일때 브레이크)를 해주어서 틀리게 되었다.

 

package algo;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class B1022 {
	static int dy[] = { 0, -1, 0, 1 };
	static int dx[] = { 1, 0, -1, 0 };

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int r1, c1, r2, c2;
		StringTokenizer st = new StringTokenizer(br.readLine());
		r1 = Integer.parseInt(st.nextToken());
		c1 = Integer.parseInt(st.nextToken());
		r2 = Integer.parseInt(st.nextToken());
		c2 = Integer.parseInt(st.nextToken());

		// start num;
		int cnt = 0;
		int value = 1;
		int y = 0;
		int x = 0;
		int d = 0;
		int dis = 0;
		int distance = 1;
		int turn = 0;
		int rstand = r1 * (-1);
		int cstand = c1 * (-1);
		int ans[][] = new int[r2 - r1 + 1][c2 - c1 + 1];
//		System.out.println(rstand +" "+cstand);
		while (cnt!=(r2-r1+1)*(c2-c1+1)) {
//			System.out.println(y+" "+x);
//			System.out.println(y+" "+x);
			if (y >= r1 && y <= r2 && x >= c1 && x <= c2) {
				cnt++;
				ans[y + rstand][x + cstand] = value;
			}

			y = y + dy[d];
			x = x + dx[d];
			value++;
			dis++;
//			if(value==30)
//				break;

			if (dis == distance) {
				turn++;
				d = (d + 1) % 4;
				dis = 0;
				if (turn == 2) {
					turn = 0;
					distance++;
				}
			}

		}
		StringBuilder sb = new StringBuilder();
		int len = 0;

		len = Math.max(len, (ans[r1 + rstand][c1 + cstand] + "").length());
		len = Math.max(len, (ans[r1 + rstand][c2 + cstand] + "").length());
		len = Math.max(len, (ans[r2 + rstand][c1 + cstand] + "").length());
		len = Math.max(len, (ans[r2 + rstand][c2 + cstand] + "").length());
		for (int i = 0; i <= r2 - r1; i++) {
			for (int j = 0; j <= c2 - c1; j++) {
				for (int l = 0; l < len - (ans[i][j] + "").length(); l++)
					sb.append(' ');
				sb.append(ans[i][j]);
				if (j != c2 - c1)
					sb.append(' ');
			}
			sb.append('\n');
		}

		System.out.println(sb.toString());
	}
}
반응형

'ProgramSoliving' 카테고리의 다른 글

백준 : 1443 망가진 시계  (0) 2020.05.16
백준 : 1360 되돌리기  (0) 2020.05.16
백준 : 2252 DFS ,BFS  (0) 2020.05.13
백준 : 2262  (0) 2020.05.06
백준 : 4354 java  (0) 2020.05.05