백준 GIST 찍기

KIMYEONGJUN·2025년 12월 13일
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

첫째 줄에 정수 K가 주어진다. (1 ≤ K ≤ 100)

주어진 그림을 K배 확대한 그림을 예제 출력과 같이 출력한다.

내가 이 문제를 보고 생각해본 부분

입력 처리 및 원본 그림 정의:
BufferedReader를 사용하여 K 값을 입력받는다. 
이는 키보드 입력이나 파일 입력에 효율적인 방식이다.
원본 "GIST" 그림을 char 타입의 2차원 배열 originalImage에 직접 초기화한다. 
이 그림은 3행 4열의 고정된 크기이다.
크기 계산:
N과 M은 원본 그림의 행과 열의 개수입니다. 각각 3과 4가 된다.
enlargedN과 enlargedM은 K배 확대된 그림의 총 행과 열의 개수를 계산한다. (예: K=5일 때, enlargedN = 3 * 5 = 15, enlargedM = 4 * 5 = 20).
확대된 그림 생성 (핵심 로직):
char[][] enlargedImage = new char[enlargedN][enlargedM]; : 확대된 그림을 저장할 새로운 2차원 배열을 enlargedN x enlargedM 크기로 생성한다.
외부 반복문(for (int i = 0; i < enlargedN; i++)): 확대된 그림의 각 행을 순회한다. 
i는 확대된 그림의 현재 행 인덱스이다.
내부 반복문(for (int j = 0; j < enlargedM; j++)): 확대된 그림의 각 열을 순회한다. 
j는 확대된 그림의 현재 열 인덱스이다.
int originalRow = i / K; : 현재 확대된 그림의 행(i)이 원본 그림의 어느 행에 해당하는지 계산한다. 
Java에서 int 타입 변수끼리의 나눗셈은 자동으로 소수점 이하를 버림(floor) 처리하므로, 문제에서 주어진 floor 함수와 동일한 효과를 낸다.
int originalCol = j / K; : 마찬가지로 현재 확대된 그림의 열(j)이 원본 그림의 어느 열에 해당하는지 계산한다.
enlargedImage[i][j] = originalImage[originalRow][originalCol]; : 계산된 원본 행/열 인덱스에 해당하는 문자를 확대된 그림의 현재 (i, j) 위치에 저장한다. 
이 과정이 모든 (i, j) 쌍에 대해 반복되어 확대된 그림이 완성된다.
확대된 그림 출력:
두 개의 중첩된 for 반복문을 사용하여 enlargedImage 배열에 저장된 모든 문자를 순서대로 출력한다.
System.out.print(enlargedImage[i][j]); : 각 문자를 출력하고,
System.out.println(); : 한 행의 출력이 끝나면 줄바꿈을 하여 다음 행이 새로운 줄에 출력되도록 한다.
br.close();를 통해 BufferedReader를 닫아 자원을 해제한다.

코드로 구현

package baekjoon.baekjoon_31;

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

// 백준 31907번 문제
public class Main1235 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int K = Integer.parseInt(br.readLine());

        // 원본 GIST 그림 정의 (3x4)
        char[][] originalImage = {
                {'G', '.', '.', '.'},
                {'.', 'I', '.', 'T'},
                {'.', '.', 'S', '.'}
        };

        // 원본 그림의 행과 열 크기
        int N = originalImage.length; // N = 3
        int M = originalImage[0].length; // M = 4

        // 확대된 그림의 총 행과 열
        int enlargedN = N * K;
        int enlargedM = M * K;

        // 확대된 그림을 저장할 2차원 char 배열
        char[][] enlargedImage = new char[enlargedN][enlargedM];

        // 확대된 그림의 각 칸을 채웁니다.
        for (int i = 0; i < enlargedN; i++) { // 확대된 그림의 행 인덱스 (0부터 KN-1)
            for (int j = 0; j < enlargedM; j++) { // 확대된 그림의 열 인덱스 (0부터 KM-1)
                // 현재 확대된 그림의 (i, j) 칸에 들어갈 문자는
                // 원본 그림의 (i / K, j / K) 칸의 문자입니다.
                // 정수 나눗셈은 자동으로 소수점 이하를 버림합니다.
                int originalRow = i / K;
                int originalCol = j / K;
                enlargedImage[i][j] = originalImage[originalRow][originalCol];
            }
        }

        // 확대된 그림을 출력합니다.
        for (int i = 0; i < enlargedN; i++) {
            for (int j = 0; j < enlargedM; j++) {
                System.out.print(enlargedImage[i][j]);
            }
            System.out.println(); // 한 행이 끝나면 줄바꿈
        }
        br.close();
    }
}

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글