백준 1262 알파벳 다이아몬드 python, java

gobeul·2023년 9월 5일
0

알고리즘 풀이

목록 보기
27/70
post-thumbnail

어렵다.. 실버 문제지만 유독 별찍기같은 문제는 어렵게 느껴진다..
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() 메서드를 이용하는 것도 방법이 될 수 있겠다.

profile
뚝딱뚝딱

0개의 댓글