[Algorithm] 백준 1262 알파벳 다이아몬드JAVA

유형찬·2022년 9월 14일
0

알고리즘

목록 보기
1/8

문제

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

접근 방식

  • 최초에는 Array에 알파벳 다이아몬드를 만들어 놓는 방식을 생각 했다.
    • 이 방식의 경우는 문제에서 최대 다이아몬드의 크기가 39999 * 39999 였기 때문에 무리가 있는 방식이였다. 시간 초과 , 메모리 초과가 눈에 보이는 수준
  1. 접근 방식은 마름모의 성질을 이용 하는 것과 테두리 값

    • 문제에서 주어진 힌트를 보면 네 변의 길이가 같은 마름모가 반복되는 형태인 것 을 볼 수 있다.
    • 여기서 특징을 보자 , 각 마름모의 테두리 알파벳이 같은 것을 알 수 있다. 이 특징과 마름모의 성질을 이용한다.
    • 아래 그림과 같이 각각의 테두리의 알파벳이 일치하는 것을 볼 수 있다.

  2. 위 성질을 이용하면 다음과 같이 된다.

    • 중앙 Index 좌표 X1,Y1 에서 테두리 좌표까지의 거리는 같다.
    • 여기서 거리란 테두리 좌표를 X2 , Y2 라고 할 때 |X1-X2| + |Y1-Y2| 를 의미한다.
  3. 다시 좌표를 정의 해보자. 먼저 알파벳 반복회수를 N 이라고 했을 때 ( a,b,c,d,e ... N번째 알파벳) 다이아몬드의 크기는 2N - 1 의 크기이다. 또한 상하 좌우의 크키가 같기 때문에
    중앙 좌표는 N-1 , N-1 이 된다.

  4. 코드를 살펴보자.

package org.example;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

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());
        // 주어진 x = r1 , y = c1 좌표를 for 문을 돌려서 . 인지 알파벳인지 판별 
        // r2 , c2 좌표 까지 
        for(int i = 0, s = r1; i < r2 -r1 +1; i++,s++){
            for(int j = 0, t = c1; j < c2 - c1 +1; j++, t++){
                int x = s % (2 * n - 1); // 마름모 도형에서 0,0 좌표로 부터 상대적으로 x 좌표 계산 
                int y = t % (2 * n - 1); // 마름모 도형에서 0,0 좌표로 상대적으로 y 좌표 계산 
                // 도형의 크키가 2N -1 때문에 도형의 크기 / 주어진 좌표 나머지 -> 마름모에서 상대적인 x , y 좌표 
                int dis = Math.abs(n-1-x) + Math.abs(n-1-y); // 중앙 좌표로 부터 거리 계산
                if(dis > n -1) System.out.print("."); // 다이아몬드 중앙 좌표에서 알파벳 문자까지 최대거리는 N-1 이기 때문에 dis > N - 1 인 경우 알파벳이 아님
                else System.out.print( Character.toString((dis % 26) + 'a') );
            }
            System.out.println();
        }


    }
    // 다이아몬드 별 찍기



}
profile
rocoli에요

0개의 댓글