메이쁘

(JAVA) 백준 3023번 : 마술사 이민혁 본문

Algorithm

(JAVA) 백준 3023번 : 마술사 이민혁

메이쁘 2020. 4. 2. 23:04

 

https://www.acmicpc.net/problem/3023

 

3023번: 마술사 이민혁

문제 유명한 마술사인 이민혁이 사용하는 카드의 뒷 면은 모두 자신이 디자인한 카드이다. 민혁이는 카드 뒷 면 전체를 디자인하지 않고, 왼쪽 위 1/4만 디자인한다. 그 다음 대칭시켜 오른쪽 위를 만들고, 다시 대칭시켜서 아래 부분을 모두 만든다. 이렇게 대칭시켜서 전체를 디자인 한 이후에는, 마술하는데 사용하기 위한 의도된 에러를 넣는다. 에러는 원래 '#'이어야 하는 칸을 '.'로 바꾸거나 '.'이어야 하는 칸을 '#'로 바꾸는 것이다. 왼쪽 위의 디자

www.acmicpc.net

 

간단하다.

 

이중 for문으로 카드 문자 하나씩 받기 전

 

입력하는 Y, X 크기의 2배 만큼 char 배열을 생성해놓고

 

카드 문자를 하나씩 받을 때 대칭되는 부분까지 넣어준다.

 

그래서 2중 for문 하나로 전체 카드를 만들 수 있어야 더욱 빨라진다.

 

 

그 후, 에러나는 부분의 문자만 바꿔주면 끝.

** 나는 단순하게 대칭되는 부분씩 바꿨기 때문에 속도가 상대적으로 조금 느리다.

 

 

 

감사합니다.

 

 

 

소스코드


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

// 마술사 이민혁
// 구현 문제
public class p3023 {
	static int cardX, cardY;
	static char[][] card;
	
	public static void main(String args[]) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		int y = Integer.valueOf(st.nextToken());
		int x = Integer.valueOf(st.nextToken());
		
		cardX = x * 2;
		cardY = y * 2;
		card = new char[cardY][cardX];
		
		// 입력 받기
		for(int i = 0; i < y; i++) {
			 String str = br.readLine();
			for(int j = 0; j < x; j++) {
				card[i][j] = str.charAt(j);
			}
		}
		
		// 오른쪽 대칭
		for(int i = 0; i < y; i++) {
			for(int j = 0; j < x; j++) {
				int reverseX = cardX - 1 - j;
				card[i][reverseX] = card[i][j];
			}
		}
		
		// 아래 대칭
		for(int i = 0; i < y; i++) {
			int reverseY = cardY - 1 - i;
			for(int j = 0; j < cardX; j++) {
				card[reverseY][j] = card[i][j];	
			}
		}
		
		// 에러 수정
		st = new StringTokenizer(br.readLine());
		int errorX = Integer.valueOf(st.nextToken());
		int errorY = Integer.valueOf(st.nextToken());
		char ch = card[errorY - 1][errorX - 1];
		if(ch == '#') {
			card[errorY - 1][errorX - 1] = '.';
		}
		else {
			card[errorY - 1][errorX - 1] = '#';
		}
		
		// 결과 출력
		for(int i = 0; i < cardY; i++) {
			for(int j = 0; j < cardX; j++) {
				System.out.print(card[i][j]);
			}
			System.out.println();
		}
	}
}
Comments