[BaekJoon] 1262 알파벳 다이아몬드
1. 문제 링크
https://www.acmicpc.net/problem/12622. 문제
요약
- 알파벳 다이아몬드는 정수 길이로 마름모가 누적되는 모양입니다.
- 각 마름모는 하나의 소문자 알파벳으로 그리고 가운데가 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으로 나눈 나머지를 거리로 이용합니다.
- 위 작업을 왼쪽 위 좌표부터 오른쪽 아래 좌표까지 진행한다면 해당 직사각형 내에 쓰여있는 알파벳을 구할 수 있습니다.
Author And Source
이 문제에 관하여([BaekJoon] 1262 알파벳 다이아몬드), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@taeho97/BaekJoon-1262-알파벳-다이아몬드저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)