어렵다.. 실버 문제지만 유독 별찍기같은 문제는 어렵게 느껴진다..
N의 범위를 보고 다이아몬드를 미리 만들지 않는다는 것은 알았고 다이아를 만들지 않기 때문에
수학적으로 규칙을 찾아 이렇게 저렇게 잘 해서 식을 세우고 푸는 문젠줄알았다.
실제로 그렇게 풀려고 해봤는데 디버깅이 너무 어려웠다.결국에는 다이아 모양의 규칙 중앙 "a"에서 같은 거리에 있는 자리에는 모두 같은 문자가 들어감을 이용해서 풀어야되는 문제였다.
import sys
input = sys.stdin.readline
N, r1, c1, r2, c2 = map(int, input().split())
alphabet = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
dia = 2*N-1
for i in range(r1, r2+1):
for j in range(c1, c2+1):
i %= dia
j %= dia
dis = abs(N-1-i) + abs(N-1-j)
if dis > N-1:
print(".", end="")
else:
print(alphabet[dis%26], end="")
print()
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int r1 = Integer.parseInt(st.nextToken());
int c1 = Integer.parseInt(st.nextToken());
int r2 = Integer.parseInt(st.nextToken());
int c2 = Integer.parseInt(st.nextToken());
String[] alphabet = new String[]{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"};
int dia = 2*N-1;
for (int i = r1; i < r2+1; i++) {
for (int j = c1; j <c2+1; j++) {
int ni = i % dia;
int nj = j % dia;
int dis = Math.abs(N-1-ni) + Math.abs(N-1-nj);
if (dis > N-1) {
System.out.print(".");
} else {
System.out.print(alphabet[dis%26]);
}
}
System.out.println();
}
}
}
문제 예제를 보면 다이아의 정 중앙에는 항상 문자 "a"가오고 이 좌표는 (N-1, N-1) 이 됨을 알 수 있다.
그리고 중앙의 "a"로부터 동일한 거리에 있는 좌표들의 문자는 모두 동일하다.
이 두가지를 이용하여 문제를 푼다.
주의할 점은 다이아가 여러개 붙어있기 때문에 상대적인 좌표로 바꿔주어야 한다.
"." 을 포함한 다이아 그림은 가로 세로가 같은 정사각형이며 그 길이는 2*N-1
이다.
즉 우리는 주어진 좌표를 2*N-1
로 나눈 나머지로 바꿔 상대적인 좌표로 나타낼 것이다.
또한 그림에서 알 수 있듯이 중앙 "a"에서 가장 먼 문자(그림에서는 "g")까지의 길이는 N-1
이다. 즉 N-1 이 넘어가는 길이에는 "." 이 올 것이다.
마지막으로 "z" 이후에는 다시 "a"차례가 옴으로 거리를 26으로 나눈 나머지로 알파벳 배열 인덱스에 접근했다. 참고로 나처럼 배열을 만들기 귀찮다면 ord()
메서드를 이용하는 것도 방법이 될 수 있겠다.