
내가 생각했을때 문제에서 원하는부분
첫째 줄에 정수 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();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.