[BaekJoon] 1262 알파벳 다이아몬드

17186 단어 baekjoonbaekjoon

1.  문제 링크

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

2.  문제



요약

  • 알파벳 다이아몬드는 정수 길이로 마름모가 누적되는 모양입니다.
  • 각 마름모는 하나의 소문자 알파벳으로 그리고 가운데가 a, 그 이후로 양쪽으로 z까지 진행됩니다. z까지 진행됐다면 다시 a부터 시작합니다.
  • 정수 N에 대해서 알파벳 다이아몬드는 위의 그림을 참조하기 바랍니다.
  • 정수 N이 주어지고 왼쪽 위 좌표(R1, C1)과 오른쪽 아래 좌표(R2, C2)가 주어졌을 때 해당 좌표를 이용하여 만든 직사각형에 쓰여 있는 알파벳을 구하는 문제입니다.
  • 입력: 첫 번째 줄에 N, R1, C1, R2, C2가 주어집니다.
  • 출력: (R2 - R1 + 1)개의 줄에 (C2 - C1 + 1)개의 문자를 출력합니다.

3.  소스코드

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

public class Main {
	public String[] getAlphabetDiamond(int n, int x1, int y1, int x2, int y2) {
		String[] alphabetDiamond = new String[x2 - x1 + 1];
		int length = 2 * n - 1;
		int row = x1;
		for(int i = 0; i < (x2- x1 + 1); i++) {
			String temp = "";
			int col = y1;
			for(int j = 0; j < (y2 - y1 + 1); j++) {
				int x = row % length;
				int y = col % length;
				int distance = Math.abs((n - 1) - x) + Math.abs((n - 1) - y);
				if(distance > (n - 1)) {
					temp += ".";
				} else {
					temp += Character.toString((char)(97 + (distance % 26)));
				}
				col++;
			}
			alphabetDiamond[i] = temp;
			row++;
		}

		return alphabetDiamond;
	}
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		String input = br.readLine();
		br.close();
		StringTokenizer st = new StringTokenizer(input);
		int n = Integer.parseInt(st.nextToken());
		int x1 = Integer.parseInt(st.nextToken());
		int y1 = Integer.parseInt(st.nextToken());
		int x2 = Integer.parseInt(st.nextToken());
		int y2 = Integer.parseInt(st.nextToken());
		Main m = new Main();
		String[] result = m.getAlphabetDiamond(n, x1, y1, x2, y2);
		for(int i = 0; i < result.length; i++) {
			bw.write(result[i] + "\n");
		}
		bw.flush();
		bw.close();
	}
}

4.  접근

  • 마름모의 특징을 이용하여 문제를 풀 수 있습니다.
  • 알파벳 다이아몬드에서 마름모의 둘레는 같은 알파벳으로 이루어져있고 이는 중앙으로부터 같은 거리를 갖고 있는 곳에는 같은 알파벳이 있음을 의미합니다.
  • 여기서 거리는 (중앙 x좌표로부터 해당 위치 x좌표의 차이 + 중앙 y좌표로부터 해당 위치 y좌표의 차이)를 의미합니다.
  • 하나의 알파벳 다이아몬드는 가로, 세로가 (2* N - 1)의 길이로 이루어져있기 때문에 이를 이용하여 현재 구하고자 하는 위치가 알파벳 다이아몬드에서 몇 번째에 위치하는지를 구할 수 있습니다.
  • 해당 위치의 x좌표, y좌표를 알파벳 다이아몬드의 길이로 나눈 나머지를 이용하여 알파벳 다이아몬드에서 몇 번째 x좌표, y좌표에 있는지 알 수 있고 이를 이용하여 중심으로부터 거리를 구합니다.
  • 중심은 ((N - 1), (N - 1))에 위치하고 있기 때문에 위에서 구한 x좌표, y좌표와 중심의 x좌표, y좌표를 빼서 더한 값이 중심으로부터의 거리가 됩니다.(거리이기 때문에 뺀 값에 절댓값을 씌워줍니다)
  • 중심으로부터 알파벳이 존재하는 최대 거리는 (N - 1)이므로 이 거리를 넘는다면 .으로 채워주고 알파벳 소문자는 ASCII 코드로 97(a)부터 시작하여 26개이기 때문에 해당 위치의 알파벳은 (97 + 거리)로 구할 수 있습니다.
  • 위에서 구한 거리가 26을 넘는다면 알파벳 소문자를 넘어가기 때문에 거리를 26으로 나눈 나머지를 거리로 이용합니다.
  • 위 작업을 왼쪽 위 좌표부터 오른쪽 아래 좌표까지 진행한다면 해당 직사각형 내에 쓰여있는 알파벳을 구할 수 있습니다.

좋은 웹페이지 즐겨찾기