sample_input.txt

3 10 10 1 5 6 8 2 17
4 3 3 2 1 4 2 5 3 4 5
6 10 10 13 7 17 17 1 1 4 10 20 10 10 1

3 : 토끼의 수

(10, 10) : 여우의 좌표

(1, 5), (6, 8), (2, 17) : 토끼의 좌표

(20, 20) : 바둑판의 크기

 

음... 처음 생각한 방법은 20 x 20 매트릭스 배열을 생성하고, 이중 for문을 돌아 여우의 좌표를 기준으로 +1 기울기와 -1 기울기를 가지는 방정식을 만들고 x값을 1~20까지 돌려서 y값이 1~20안에 포함되는지 검사... 그리고 여우와 같은 x축 또는 y축을 검사...... 직선 4개를 그리려고 했는데...

 

생각해보니 바둑판 크기는 고려할 필요가 없다..... 그냥 혹시 모르니 바둑판 크기는 여우와 각 토끼가 바둑판 안에 있는지만 검사하는 정도로만 써도 될 듯... 아니면 애초에 문제에 오류가 없다고 가정하면 이 예외처리가 필요 없고...

 

그냥 여우의 좌표를 구하고 토끼의 좌표를 구해서 x축이 같은지, y축이 같은지, 기울기가 +1이거나 -1인지만 구하면 되겠다.

 

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class Matrix {
	public static void main(String[] args) throws FileNotFoundException {
		System.setIn(new FileInputStream("res/sample_input.txt"));
		
		Scanner sc = new Scanner(System.in);

		int problemN = 1;
		int rabbitNumber;
		int result = 0;
		
		while(true) {
			try {
				rabbitNumber = sc.nextInt();	// 토끼의 수를 입력 받는다.
			} catch (Exception e) {
				break;
			}
			
			// 여우의 좌표를 입력 받는다.
			int fox_x = sc.nextInt();
			int fox_y = sc.nextInt();
			
			// 그냥 1차원 배열만 쓰는게 더 빠를 것 같은데 연습하느라 2차원 배열 사용해봄... 토끼의 좌표 입력 받기.
			int rabbitCoordinate[][] = new int[rabbitNumber][2];
			
			for (int i = 0; i < rabbitNumber; i++) {
				rabbitCoordinate[i][0] = sc.nextInt();	// i 번째 토끼의 x좌표
				rabbitCoordinate[i][1] = sc.nextInt();	// i 번째 토끼의 y좌표

				// 토끼가 여우와 같은 x축이나 y축에 있다면 true
				if ((rabbitCoordinate[i][0] == fox_x) | (rabbitCoordinate[i][1] == fox_y)) {
					result++;
					continue;
				}
				
				// 토끼가 여우와 기울기 +1 직선 또는 -1 직선에 있다면 true (나눗셈의 경우 0으로 나누는 경우에 대한 예외처리를 해야하지만,
				// 위 if문에서 분모가 0인 경우(y = fox_y 직선 위에 있는 경우) continue를 통해 아래 나눗셈 if문으로 들어오지 않기 때문에 중복 검증을 하지 않음)
				if ( ( ( (fox_y - rabbitCoordinate[i][1]) / (fox_x - rabbitCoordinate[i][0]) ) == 1) | 
					 ( ( (fox_y - rabbitCoordinate[i][1]) / (fox_x - rabbitCoordinate[i][0]) ) == -1)) {
					result++;
				}
			}
			
			System.out.printf("%d번 문제의 답은 : %d \n", problemN, result);
			problemN++;
			result = 0;

		}
	}
}

기울기를 구한 다음 절대값을 씌워서 |△y / △x| = 1 로 해도 된다. 다만 함수를 불러와야해서 속도가 더 느릴 것 같아서 그냥 저렇게 했는데 어떤게 더 좋은걸까...?

위 경우는 0으로 나누는 경우의 수가 발생하지 않기 때문에 나눗셈에서 0으로 나누는 경우에 대한 예외처리를 직접적으로 하지 않았다. (위에 있는 if문에서 해당 경우의 수를 걸러냄) 다만 나눗셈 할 때는 반드시 0으로 나누는 경우를 실수하면 안 된다. 중요!!!

 

'개발자 > Algorithm' 카테고리의 다른 글

Kruskal's Algorithm  (0) 2020.09.14
05. 장기판 포 말잡기  (0) 2020.08.30
02. 수열 A와 수열 B가 같은지 확인하기  (0) 2020.08.24
01. 괄호 짝 유효 여부와 N번째 괄호 짝 찾기  (0) 2020.08.24
Dynamic Programing  (0) 2020.04.21

+ Recent posts