백준 뚊

KIMYEONGJUN·2025년 9월 10일
0
post-thumbnail

문제

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

입력의 첫 번째 줄에 N, M (1 ≤ N, M ≤ 10)이 주어진다.
다음 N개의 줄의 각 줄에는 M개의 문자가 주어진다.
다음 N개의 줄의 각 줄에는 2M개의 문자가 주어진다.
모든 문자는 영문 알파벳 대문자 혹은 소문자이다.

첫 번째로 주어진 이미지를 가로로 두 배로 늘렸을 때 두 번째 이미지가 된다면 "Eyfa"을 출력하고, 되지 않는다면 "Not Eyfa"을 출력한다.

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

초기 설정 및 입력 읽기:
BufferedReader와 StringTokenizer를 사용하여 N과 M 값을 읽어온다. 
N은 행의 수, M은 첫 번째 이미지의 열의 수이다.
firstImage와 secondImage라는 String 배열을 선언하여 각 이미지를 문자열 형태로 저장한다. 
N번 반복하여 각 이미지의 행을 한 줄씩 읽어 배열에 저장한다.
isEyfa 플래그:
boolean isEyfa = true; 변수를 선언한다. 
이 변수는 두 이미지가 "Eyfa" 관계인지 여부를 나타낸다. 
초기에는 "Eyfa"라고 가정하고, 검사 과정에서 불일치를 발견하면 false로 바꾼다.
이미지 비교 로직 (중첩 반복문):
for (int i = 0; i < N; i++): 이 외부 반복문은 이미지의 각 행(row)을 순회한다. 
i는 현재 행 인덱스이다.
for (int j = 0; j < M; j++): 이 내부 반복문은 첫 번째 이미지의 각 열(column)을 순회한다. 
j는 현재 열 인덱스이다. 
첫 번째 이미지의 (i, j) 위치에 있는 문자를 확인하기 위함이다.
char originalChar = firstImage[i].charAt(j);: 첫 번째 이미지의 i행 j열에 있는 문자를 originalChar에 저장한다.
char charInSecond1 = secondImage[i].charAt(2 * j);: originalChar는 두 번째 이미지의 같은 행(i)에서 2 * j번째 위치에 나와야 한다.
char charInSecond2 = secondImage[i].charAt(2 * j + 1);: 또한, originalChar는 두 번째 이미지의 같은 행(i)에서 2 * j + 1번째 위치에도 나와야 한다.
if (originalChar != charInSecond1 || originalChar != charInSecond2): 이 조건문은 세 가지 경우 중 하나라도 해당하면 true가 된다.
originalChar가 charInSecond1과 다를 때
originalChar가 charInSecond2와 다를 때
두 가지 모두 다를 때
즉, originalChar가 2*j 위치와 2*j+1 위치에 모두 동일하게 나타나지 않는 경우이다.
isEyfa = false;: 불일치가 발견되면 isEyfa를 false로 설정한다.
break;: 불일치가 발견되면 더 이상 검사할 필요가 없으므로 가장 안쪽(j 반복문) for 루프를 즉시 종료한다.
if (!isEyfa) { break; }: 안쪽 for 루프가 break되어 나왔을 때 isEyfa가 false라면, 이미 불일치가 확인된 것이므로 외부(i 반복문) for 루프도 종료한다. 
이렇게 하면 불필요한 추가 검사를 피할 수 있어 효율적이다.
결과 출력:
모든 반복이 끝난 후 isEyfa 값이 true이면 "Eyfa"를 출력하고, false이면 "Not Eyfa"를 출력한다.
br.close();: 사용이 끝난 BufferedReader를 닫아 자원을 해제한다.

코드로 구현

package baekjoon.baekjoon_30;

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

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

        // N: 첫 번째 이미지의 행 수, M: 첫 번째 이미지의 열 수
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());

        // 첫 번째 이미지를 저장할 문자열 배열
        String[] firstImage = new String[N];
        // 두 번째 이미지를 저장할 문자열 배열
        String[] secondImage = new String[N];

        // 첫 번째 이미지 N줄 읽기
        for(int i = 0; i < N; i++) {
            firstImage[i] = br.readLine();
        }

        // 두 번째 이미지 N줄 읽기
        for(int i = 0; i < N; i++) {
            secondImage[i] = br.readLine();
        }

        // 결과 플래그: 기본적으로 Eyfa라고 가정하고, 조건에 맞지 않으면 false로 변경
        boolean isEyfa = true;

        // 이미지를 행(세로) 단위로 반복
        for(int i = 0; i < N; i++) {
            // 각 행의 문자를 열(가로) 단위로 반복
            for(int j = 0; j < M; j++) {
                // 첫 번째 이미지의 현재 문자
                char originalChar = firstImage[i].charAt(j);

                // 이 문자가 두 번째 이미지에서 두 번 반복되는지 확인
                // 첫 번째 반복: 2*j 위치
                char charInSecond1 = secondImage[i].charAt(2 * j);
                // 두 번째 반복: 2*j + 1 위치
                char charInSecond2 = secondImage[i].charAt(2 * j + 1);

                // 원본 문자가 두 번째 이미지의 해당 위치 두 군데와 모두 다르면
                if(originalChar != charInSecond1 || originalChar != charInSecond2) {
                    isEyfa = false; // Eyfa가 아님을 표시
                    break; // 더 이상 검사할 필요 없으므로 가장 안쪽 반복문 탈출
                }
            }
            if(!isEyfa) { // 안쪽 반복문에서 Eyfa가 아님이 확인되었으면 바깥쪽 반복문도 탈출
                break;
            }
        }

        // 최종 결과 출력
        if(isEyfa) {
            System.out.println("Eyfa");
        } else {
            System.out.println("Not Eyfa");
        }

        br.close(); // BufferedReader 닫기
    }
}

마무리

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

profile
Junior backend developer

0개의 댓글