본문 바로가기
PS/BOJ

[자바] 백준 25755 - 거울반사 (java)

by Nahwasa 2022. 10. 20.

 문제 : boj25755


 

필요 알고리즘 개념

  • 구현
    • 문제에 제시된걸 그대로 구현하는 문제이다.

※ 제 코드에서 왜 main 함수에 로직을 직접 작성하지 않았는지, 왜 Scanner를 쓰지 않고 BufferedReader를 사용했는지 등에 대해서는 '자바로 백준 풀 때의 팁 및 주의점' 글을 참고해주세요. 백준을 자바로 풀어보려고 시작하시는 분이나, 백준에서 자바로 풀 때의 팁을 원하시는 분들도 보시는걸 추천드립니다.

 


 

풀이

  우선 뒤집는다는 말이 애매할 수 있으므로 그림으로 표현해보면 아래와 같이 이해하면 된다. 저건 L 또는 R로 뒤집는 것이다.

 

 

  왜 L 또는 R이냐면, 어차피 좌우로 뒤집거나 상하로 뒤집은 결과는 동일하다.

 

  배열을 사용해 표현할 것이므로 arr이라는 n*n 크기의 2차원 배열이 있다고 하자. 이 때 L 또는 R로 뒤집는 경우, 원본이 arr[i][j]라면 해당 값은 뒤집어진 이후 arr[i][n-j-1] 의 위치에 가게 될 것이다 (오른쪽에 있는게 왼쪽으로 가고, 왼쪽에 있는게 오른쪽으로 갈 것이므로). 마찬가지로 이번엔 D 또는 U인 경우엔 상하가 바뀌므로 arr[i][j] -> arr[n-i-1][j] 로 변경될 것이다.

for (int i = 0; i < n; i++) {
    st = new StringTokenizer(br.readLine());
    for (int j = 0; j < n; j++) {
        arr[isLR?i:n-i-1][isLR?n-j-1:j] = getReverseChar(st.nextToken().charAt(0));
    }
}

  

 

  그럼 이제 변경되서 들어갈 위치값은 알았으니, 문제에 제시된 대로 문자를 치환해주면 된다.

private char getReverseChar(char c) {
    switch (c) {
        case '2': return '5';	// 2는 5로
        case '5': return '2';	// 5는 2로
        case '1': case '8': return c;	//1과 8은 그대로
        default: return '?';	// 나머지는 ? 이다.
    }
}

 


 

코드 : github

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

public class Main {
    private char getReverseChar(char c) {
        switch (c) {
            case '2': return '5';
            case '5': return '2';
            case '1': case '8': return c;
            default: return '?';
        }
    }
    private void solution() throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        char w = st.nextToken().charAt(0);
        int n = Integer.parseInt(st.nextToken());
        char[][] arr = new char[n][n];
        boolean isLR = w=='L'||w=='R';
        for (int i = 0; i < n; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < n; j++) {
                arr[isLR?i:n-i-1][isLR?n-j-1:j] = getReverseChar(st.nextToken().charAt(0));
            }
        }
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                sb.append(arr[i][j]).append(' ');
            }
            sb.append('\n');
        }
        System.out.print(sb);
    }

    public static void main(String[] args) throws Exception {
        new Main().solution();
    }
}

댓글