8
H L L H L L L L
H H L H Y L L H
L H L H L L Y L
H L L H L H L L
H Y L H L L L L
L H L H H L H L
L L L H L L L L
L X L H L H L L
10
H L L H L L L L L L
H H L H Y L L H L L
L H L H L L Y L L L
H L L H L H L L L L
H Y L H X L H H L L
L H L H H L H L L L
L L L H L L L L L L
L L L H Y H L L L L
L L L H L H L L L L
L L L H H H L L L L
10
H L L H L L L L L L
H H L H Y L L H L L
L H L H L L Y L L L
H L L H L H L L L L
H Y L H L L H H L L
L H L H H L H L L L
L L L H L L L L L L
L L L H Y H L L L L
L L L H L H L L L L
X L L H H H L L L L
10
H L L H L L L L L L
H H L H Y L L H L L
L H L H L L Y L L L
H L L H L H L L L L
H Y L H L L H H L L
L H L H H L H L L L
L L L H L L L L L L
L L L H Y H L L L L
L L L H L H L L L L
L H H H X H H Y H L

 

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

public class JanggiCannon {
	public static void main(String[] args) throws FileNotFoundException {
		System.setIn(new FileInputStream("res/sample_input.txt"));
		
		Scanner sc = new Scanner(System.in);
		
		int mapSize = 0;
		int[] cannonCoordinate = new int[2];
		Boolean findMyCannon = false;
		int problemN = 1;
		int result = 0;
		int resultH = 0;
		int resultV = 0;
		
		while(true) {
			try {
				mapSize = Integer.parseInt(sc.nextLine());	// 장기판의 크기를 입력 받는다. nextInt를 사용시 return 소거용 nextLine을 한 번 더 써야 하기 대문에 형변환을 사용함.
			} catch (Exception e) {
				break;
			}
			
			// 장기판 맵을 매트릭스 배열로 만든다.
			char[][] map = new char[mapSize][mapSize];
			
			// 장기판에 알을 담는다.
			for (int i = 0; i < mapSize; i++) {
				map[i] = sc.nextLine().replace(" ", "").toCharArray();
				
				// 장기판을 채우다 포가 나오면 위치를 기억한다.
				if (!findMyCannon) {	// 포의 위치를 찾으면 그 문제에서는 더이상 찾는 시도를 하지 않는다.
					for (int j = 0; j < mapSize; j++) {
						if (map[i][j] == 'X') {
							cannonCoordinate[0] = i;
							cannonCoordinate[1] = j;
							findMyCannon = true;
						}
					}
				}
			}
	
			// Step 1. 수평 계산.
			// 내 포("X")가 있는 수평줄의 문자열을 구한다.
			String horizontal = new String(map[cannonCoordinate[0]], 0, mapSize);
						
			// 계산 메소드에 넣는다.
			resultH = calcAttack(horizontal);
			
			// Step 2. 수직 계산.
			// 내 포("X")가 있는 수직줄의 문자열을 구한다.
			StringBuilder sbd = new StringBuilder();
			for (int i = 0; i < mapSize; i++) {
				sbd.append(map[i][cannonCoordinate[1]]);
			}
			String vertical = sbd.toString();

			// 계산 메소드에 넣는다.
			resultV = calcAttack(vertical);

			// Step 3. 결과 산출 및 다음 문제를 위한 초기화.
			result = resultH + resultV;
			
			System.out.printf("%d번째 문제의 답은 : %d \n", problemN, result);
			findMyCannon = false;
			problemN++;
			result = resultH = resultV = 0;
		}
	}
	
	private static int calcAttack(String line) {
		int result = 0;
		
		// Step 1. 상대 캐논("Y")을 기준으로 나눈다.
		String[] target = line.split("Y"); 
		// Step 2. 내 캐논("X")이 포함된 유효한 구간만 가져온다.
		int targetIndex = includingTargetIndex(target);
		// Step 3. 공백("L")을 제거한다.
		String targetList = target[targetIndex].replace("L", "");
		// Step 4. 계산을 위해 내 캐논("X")을 기준으로 2개의 구간으로 나눈다.
		String[] splitedTargetList = targetList.split("X");
		
		int target1 = 0;
		int target2 = 0;
		// 배열이 존재하지 않을 경우에 대한 예외처리.
		try {
			target1 = (splitedTargetList[0].isEmpty()) ? 0 : splitedTargetList[0].length() - 1;	// 배열이 비어있다면 0, 비어있지 않다면 알을 하나 건너 뛰어야 하니 개수 - 1을 리턴.
		} catch (Exception e) {
			// TODO: handle exception
		}
		try {
			target2 = (splitedTargetList[1].isEmpty()) ? 0 : splitedTargetList[1].length() - 1;
		} catch (Exception e) {
			// TODO: handle exception
		}

		return target1 + target2;
	}
	
	// 캐논("X")이 포함된 문자열의 인덱스를 찾는 메소드.
	private static int includingTargetIndex(String target[]) {
		int result = 0;
		while (result < target.length) {
			if (target[result].contains("X")) break;
			result++;
		}	
		return result;
	}
}



결과 : 

1번째 문제의 답은 : 1 
2번째 문제의 답은 : 1 
3번째 문제의 답은 : 5 
4번째 문제의 답은 : 3 

 

함수를 쓰는게 코딩 테스트에서 효율이 좋은지 나쁜지 모르겠다...

 

문자열을 여러번 더할 경우는 String 말고 StringBuffer나 StringBuilder를 써야 빠르다.

char[]로 가져오면 문자라 바로 확인이 가능하다.
String[]로 가져오면 for문을 돌려야 문자 확인이 가능하다.

배열이 비어있는지 확인하려면 null로는 불가능하고, isEmpty()isBlank()를 써야하는데 isEmpty()가 좀 더 구버전까지 지원한다.

XHH를 'X'를 기준으로 나누면 {빈 배열} + {HH} 이렇게 2개의 배열로 나뉜다.
HHX를 'X'를 기준으로 나누면 {HH} 이렇게 1개의 배열만 생긴다. 따라서 이 경우 배열이 존재하지 않기 때문에 이 결과를 가지고 무언가를 하려면 try ~ catch를 해줘야한다. ()

		try {
			target2 = (splitedTargetList[1].isEmpty()) ? 0 : splitedTargetList[1].length() - 1;
		} catch (Exception e) {
			// TODO: handle exception
		}

이 부분...

 

 

 

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

Prim's Algorithm  (0) 2020.09.21
Kruskal's Algorithm  (0) 2020.09.14
04. 토끼 잡기  (0) 2020.08.28
02. 수열 A와 수열 B가 같은지 확인하기  (0) 2020.08.24
01. 괄호 짝 유효 여부와 N번째 괄호 짝 찾기  (0) 2020.08.24

동기와 팀즈로 원격으로 서로의 알고리즘을 공유했다.

코로나 때문에 비대면 되어서 이렇게라도 해야지 ㅠㅠ

혼자만 코드 짜는 것 보다 훨씬 난 것 같다.

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

TIL 20.09.01  (0) 2020.09.03
TIL 20.08.31  (0) 2020.08.31
TIL 20.08.27  (0) 2020.08.27
TIL 20.08.26  (0) 2020.08.27
TIL 20.08.25  (0) 2020.08.26

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

span 태그가 HTML 코드 안에만 들어가는줄 알았는데.... 자바스크립트에서 코드 안에 추가로 더 넣을 수 있다!!!

신기하다!!!

남은 시간은 알고리즘 풀다 만거 얼른 풀어서 제출해야겠다

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

TIL 20.08.31  (0) 2020.08.31
TIL 20.08.28  (0) 2020.08.28
TIL 20.08.26  (0) 2020.08.27
TIL 20.08.25  (0) 2020.08.26
TIL 20.08.24  (0) 2020.08.26

오늘은 1학기때 배운 자바를 천천히 복습하는 시간을 가졌다.

코로나 때문에 부연 설명 없이 너무 빠르게 나가고 응용단계로 넘어가서 많이 힘들었는데

차근차근 정리해주시니까 좋다

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

TIL 20.08.28  (0) 2020.08.28
TIL 20.08.27  (0) 2020.08.27
TIL 20.08.25  (0) 2020.08.26
TIL 20.08.24  (0) 2020.08.26
TIL 20.08.18 ~ 20.08.21  (0) 2020.08.26

알고리즘! 알고리즘! 알고리즘!

 

근데 이걸 1학기때 하고 2학기때 블록체인 하는게 나을뻔했다... 진짜 중요한거였네 ㅠㅠ

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

TIL 20.08.27  (0) 2020.08.27
TIL 20.08.26  (0) 2020.08.27
TIL 20.08.24  (0) 2020.08.26
TIL 20.08.18 ~ 20.08.21  (0) 2020.08.26
TIL 20.08.04 ~ 20.08.12  (0) 2020.08.12

하루 종일 SQL을 했다.

여러 데이터를 조인시키고 수요예측 모델 구현에 필요한 모델 정확도를 위한 6주 아카이브를 MAPE하기 위한 쿼리...?

중간중간 수작업으로 검증했는데...

sum이랑 group by를 이용한 sum으로 검증하라고 ㅠㅠ

쿼리를 이용해 다시 검증해봐야겠다...

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

TIL 20.08.26  (0) 2020.08.27
TIL 20.08.25  (0) 2020.08.26
TIL 20.08.18 ~ 20.08.21  (0) 2020.08.26
TIL 20.08.04 ~ 20.08.12  (0) 2020.08.12
TIL 20.08.03  (0) 2020.08.04

+ Recent posts