본문 바로가기
프로그래밍/알고리즘

1262 알파벳 다이아몬드

by 오답노트의 주인 2022. 8. 20.

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

 

1262번: 알파벳 다이아몬드

알파벳 다이아몬드는 정수 길이의 마름모가 여러 개 누적되는 모양이다. 각각의 마름모는 하나의 알파벳 소문자로 그리며, a로 시작해서 z로 끝난다. (가운데에서부터) 그리고, z 이후에는 다시 a

www.acmicpc.net


N=5라면 아래의 패턴이 반복될 것이다.

....e........e....
...ede......ede...
..edcde....edcde..
.edcbcde..edcbcde.
edcbabcdeedcbabcde
.edcbcde..edcbcde.
..edcde....edcde..
...ede......ede...
....e........e....
....e....
...ede...  9x9크기의 패턴 반복 ...
..edcde..
.edcbcde.
edcbabcde
.edcbcde.
..edcde..
...ede...
....e....

 

 

9x9크기의 패턴이 반복된다. 패턴마다 중심점을 기준으로 거리를 계산해 문자를 표현하면 된다.

 

패턴의 크기는 2N-1이다. 위의 N=5인 경우 edcbabcde가 출력된 것을 보면 알 수 있다.

 

좌표값을 패턴의 크기로 나머지 연산을 하면 패턴의 범위 내에서 좌표값이 어디에 있는가만 남는다.

 

두 좌표는 패턴의 크기에 따라 나머지 연산을 했을 때 동일하다.

 

따라서 어떤 좌표가 (i,j)라면, 이 좌표를 (i % ( 2*N-1 ), j % ( 2*N-1 ))으로 만든다. 

 

패턴의 중심좌표는 (N-1, N-1)이다. 중심좌표에서 간단하게 만들었던 좌표, (i % ( 2*N-1 ), j % ( 2*N-1 ))를 빼면 거리가 나온다.

편차를 구해야 하므로, 각 좌표별로 절댓값을 씌워주면 거리가 나온다. 

거리 = abs( N-1 - i % ( 2*N-1 ) ) + abs( N-1 - j % ( 2*N-1 ) )

 

거리가 26보다 클 수 있으므로 a~z사이의 문자가 나오도록 나머지 연산을 한다. 하지만 N을 넘어가면 점(.)을 출력해야한다.

 

멍청했던 점은, 거리값을 char에 담았더니 오버플로우가 일어났었다. N의 범위가 20000이니까 int에 담아야 한다.

#include <iostream>
#define ABS(X) (((X)>=0)?X:-(X))
int main() {
    int N, R1, C1, R2, C2;
    scanf("%d %d %d %d %d", &N, &R1, &C1, &R2, &C2);
    for (int i = R1; i <= R2; i++) {
        for (int j = C1; j <= C2; j++) {
            int c = (ABS(N - j % (2 * N - 1) - 1) + ABS(N - i % (2 * N - 1) - 1));
            if (c < N)
                printf("%c", 'a' + c % 26);
            else
                printf(".");
        }
        puts("");
    }
}

 

'프로그래밍 > 알고리즘' 카테고리의 다른 글

2232 지뢰  (0) 2022.08.29
2226 이진수  (0) 2022.08.29
9020 골드바흐의 추측  (0) 2022.08.19
11653 소인수분해  (0) 2022.08.19
1018 체스판 다시 칠하기  (0) 2022.08.19

댓글