백준 상근이의 체스판

KIMYEONGJUN·6일 전
0
post-thumbnail

문제

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

첫째 줄에 두 양의 정수 R과 C가 주어진다. (1 ≤ R, C ≤ 10)
둘째 줄에 두 양의 정수 A와 B가 주어진다. (1 ≤ A, B ≤ 10)

출력은 R * A행 C * B열로 이루어져 있어야 하며, 문제에서 설명한 상근이의 체스판을 출력한다.

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

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));: 표준 입력(콘솔)으로부터 한 줄씩 읽어오기 위한 BufferedReader 객체를 생성한다.
StringTokenizer st = new StringTokenizer(br.readLine());: 첫 번째 줄(R과 C가 있는 줄)을 읽어서 공백 기준으로 나누기 위해 StringTokenizer를 초기화한다.
int R = Integer.parseInt(st.nextToken());: 첫 번째 토큰(R)을 int형으로 변환하여 R 변수에 저장한다.
int C = Integer.parseInt(st.nextToken());: 두 번째 토큰(C)을 int형으로 변환하여 C 변수에 저장한다.
st = new StringTokenizer(br.readLine());: 두 번째 줄(A와 B가 있는 줄)을 읽기 위해 StringTokenizer를 새로 생성한다.
br.readLine()을 다시 호출하여 다음 줄을 읽다.
int A = Integer.parseInt(st.nextToken());: A 값을 파싱한다.
int B = Integer.parseInt(st.nextToken());: B 값을 파싱한다.
결과 문자열 구성 (Building the Result String):
StringBuilder sb = new StringBuilder();: 많은 문자열을 반복적으로 결합할 때 String 객체의 + 연산보다 훨씬 효율적인 StringBuilder를 사용한다. 
최종 출력할 체스판을 여기에 하나씩 쌓아나갈 것이다.
외부 반복문 (for (int i = 0; i < R * A; i++)):
이 반복문은 실제 출력될 총 행의 수인 R * A만큼 반복됩니다. i는 현재 출력 중인 실제 행 인덱스를 나타낸다.
논리적인 행 인덱스 계산 (int logicalRow = i / A;):
현재 실제 행 i가 논리적인 체스판의 어떤 행에 해당하는지를 계산한다. 
예를 들어, A=2이고 i=0, 1일 때는 logicalRow가 0이 되고, i=2, 3일 때는 logicalRow가 1이 되는 식이다.
이렇게 하면 A줄마다 같은 논리적인 행의 패턴을 반복할 수 있다.
내부 반복문 (for (int j = 0; j < C * B; j++)):
이 반복문은 실제 출력될 각 행의 총 열의 수인 C * B만큼 반복된다. 
j는 현재 출력 중인 실제 열 인덱스를 나타낸다.
논리적인 열 인덱스 계산 (int logicalCol = j / B;):
현재 실제 열 j가 논리적인 체스판의 어떤 열에 해당하는지를 계산한다. 
예를 들어, B=2이고 j=0, 1일 때는 logicalCol이 0이 되고, j=2, 3일 때는 logicalCol이 1이 되는 식이다.
이렇게 하면 B칸마다 같은 논리적인 열의 패턴을 반복할 수 있다.
문자 결정 및 추가 (if (...)):
(logicalRow + logicalCol) % 2 == 0 조건을 사용하여 현재 논리적인 위치가 'X'를 출력해야 하는지 '.'을 출력해야 하는지 판단한다.
논리적인 행과 열의 합이 짝수이면 'X' (검정색)를 StringBuilder에 추가한다.
논리적인 행과 열의 합이 홀수이면 '.' (흰색)를 StringBuilder에 추가한다.
sb.append('\n');: 안쪽 반복문(한 줄 구성)이 모두 끝나면, 현재 행이 완성되었으므로 줄바꿈 문자를 StringBuilder에 추가한다.
최종 출력 및 마무리 (Final Output and Cleanup):
System.out.print(sb.toString());: StringBuilder에 저장된 모든 내용을 하나의 문자열로 변환하여 표준 출력(콘솔)에 한 번에 출력한다.
이렇게 한 번에 출력하는 것이 반복적으로 System.out.println()을 호출하는 것보다 빠르고 효율적이다..
br.close();: 사용이 끝난 BufferedReader 객체를 닫아 자원을 해제한다.

코드로 구현

package baekjoon.baekjoon_30;

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

// 백준 3076번 문제
public class Main1160 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int R = Integer.parseInt(st.nextToken());
        int C = Integer.parseInt(st.nextToken());

        st = new StringTokenizer(br.readLine()); // 두 번째 줄 입력을 위해 다시 초기화
        int A = Integer.parseInt(st.nextToken());
        int B = Integer.parseInt(st.nextToken());

        StringBuilder sb = new StringBuilder(); // 효율적인 문자열 생성을 위해 StringBuilder 사용

        // 총 R * A 개의 행을 출력합니다.
        for(int i = 0; i < R * A; i++) {
            // 현재 행이 논리적인 체스판의 몇 번째 행에 해당하는지 계산합니다.
            // i / A 를 통해 0부터 R-1까지의 논리적인 행 인덱스를 얻습니다.
            int logicalRow = i / A;

            // 각 행마다 문자열을 구성합니다.
            for(int j = 0; j < C * B; j++) {
                // 현재 열이 논리적인 체스판의 몇 번째 열에 해당하는지 계산합니다.
                // j / B 를 통해 0부터 C-1까지의 논리적인 열 인덱스를 얻습니다.
                int logicalCol = j / B;

                // 논리적인 체스판에서 (logicalRow, logicalCol) 칸의 색을 결정합니다.
                // (logicalRow + logicalCol)이 짝수이면 'X' (검정), 홀수이면 '.' (흰색)
                if((logicalRow + logicalCol) % 2 == 0) {
                    sb.append('X');
                } else {
                    sb.append('.');
                }
            }
            sb.append('\n'); // 한 행이 끝나면 줄바꿈 문자를 추가합니다.
        }

        System.out.print(sb.toString()); // 완성된 체스판을 한 번에 출력합니다.
        br.close(); // BufferedReader 닫기
    }
}

마무리

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

profile
Junior backend developer

0개의 댓글