Algorithm

Cos Pro 1κΈ‰ | λΉ„μˆμ΄ 이동 κ°€λŠ₯ν•œ μΉΈ 개수 μ°ΎκΈ°

osean 2020. 12. 10. 01:50

문제

 

Arori | λ‹Ήμ‹ μ˜ 지식

νšŒμ›κ°€μž… 쑰건이 λ§žλŠ”μ§€ λ‹€μ‹œν•œλ²ˆ ν™•μΈν•΄μ£Όμƒˆμš”

www.sysout.co.kr

μ²΄μŠ€μ—μ„œ λΉ„μˆ(Bishop)은 μ•„λž˜ κ·Έλ¦Όκ³Ό 같이 λŒ€κ°μ„  λ°©ν–₯으둜 λͺ‡ 칸이든 ν•œ λ²ˆμ— 이동할 수 μžˆμŠ΅λ‹ˆλ‹€. λ§Œμ•½ν•œ λ²ˆμ— 이동 κ°€λŠ₯ν•œ 칸에 체슀 말이 λ†“μ—¬μžˆλ‹€λ©΄ κ·Έ 체슀 말을 μž‘μ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

8 x 8 크기의 체슀판 μœ„μ— μ—¬λŸ¬ 개의 λΉ„μˆ(Bishop)이 λ†“μ—¬μžˆμŠ΅λ‹ˆλ‹€. μ΄λ•ŒλΉ„μˆ(Bishop)λ“€μ—κ²Œ ν•œ λ²ˆμ— μž‘νžˆμ§€ μ•Šλ„λ‘ μƒˆλ‘œμš΄ 말을 놓을 수 μžˆλŠ” 빈칸의 개수λ₯Ό κ΅¬ν•˜λ €κ³  ν•©λ‹ˆλ‹€.

μœ„ κ·Έλ¦Όμ—μ„œ 원이 그렀진 칸은 λΉ„μˆμ—κ²Œ ν•œ λ²ˆμ— μž‘νžˆλŠ” 칸듀이며 λ”°λΌμ„œ 체슀 말을 놓을 수 μžˆλŠ” 빈칸 κ°œμˆ˜λŠ” 50κ°œμž…λ‹ˆλ‹€.

8 x 8 μ²΄μŠ€νŒμ— 놓인 λΉ„μˆμ˜ μœ„μΉ˜ bishopsκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ λΉ„μˆμ—κ²Œ ν•œ λ²ˆμ— μž‘νžˆμ§€ μ•Šλ„λ‘ μƒˆλ‘œμš΄ 체슀 말을 놓을 수 μžˆλŠ” 빈칸 개수λ₯Ό return ν•˜λ„λ‘ solution λ©”μ†Œλ“œλ₯Ό μ™„μ„±ν•΄μ£Όμ„Έμš”.


λ§€κ°œλ³€μˆ˜ μ„€λͺ…

μ²΄μŠ€νŒμ— 놓인 λΉ„μˆμ˜ μœ„μΉ˜ bishopsκ°€ solution λ©”μ†Œλ“œμ˜ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§‘λ‹ˆλ‹€.

  • bishopsλŠ” λΉ„μˆμ˜ μœ„μΉ˜κ°€ λ¬Έμžμ—΄ ν˜•νƒœλ‘œ λ“€μ–΄μžˆλŠ” λ°°μ—΄μž…λ‹ˆλ‹€.
  • bishops의 κΈΈμ΄λŠ” 1 이상 64 μ΄ν•˜μž…λ‹ˆλ‹€.
  • λΉ„μˆμ΄ 놓인 μœ„μΉ˜λŠ” μ•ŒνŒŒλ²³ λŒ€λ¬Έμžμ™€ 숫자둜 ν‘œκΈ°ν•©λ‹ˆλ‹€.
    • μ•ŒνŒŒλ²³ λŒ€λ¬ΈμžλŠ” κ°€λ‘œ λ°©ν–₯μˆ«μžλŠ” μ„Έλ‘œ λ°©ν–₯ μ’Œν‘œλ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄ μœ„ κ·Έλ¦Όμ—μ„œ λΉ„μˆμ΄ μžˆλŠ” 칸은 'D5'라고 ν‘œν˜„ν•©λ‹ˆλ‹€.
  • ν•œ 칸에 μ—¬λŸ¬ λΉ„μˆμ΄ λ†“μ΄κ±°λ‚˜μž˜λͺ»λœ μœ„μΉ˜κ°€ μ£Όμ–΄μ§€λŠ” κ²½μš°λŠ” μ—†μŠ΅λ‹ˆλ‹€.

return κ°’ μ„€λͺ…

λΉ„μˆμ—κ²Œ ν•œ λ²ˆμ— μž‘νžˆμ§€ μ•Šλ„λ‘ μƒˆλ‘œμš΄ 체슀 말을 놓을 수 μžˆλŠ” 빈칸의 개수λ₯Ό return ν•΄μ£Όμ„Έμš”.


μ˜ˆμ‹œ

 

bishops return
["D5"] 50
["D5", "E8", "G2"] 42

μ˜ˆμ‹œ μ„€λͺ…

μ˜ˆμ‹œ #1λ¬Έμ œμ— λ‚˜μ˜¨ μ˜ˆμ‹œμ™€ κ°™μŠ΅λ‹ˆλ‹€.

μ˜ˆμ‹œ #2

κ·Έλ¦Όκ³Ό 같이 원이 그렀진 칸은 λΉ„μˆμ—κ²Œ ν•œ λ²ˆμ— μž‘νžˆλŠ” 칸듀이며 λ”°λΌμ„œ 체슀 말을 놓을 수 μžˆλŠ” 빈칸 κ°œμˆ˜λŠ” 42κ°œμž…λ‹ˆλ‹€.

풀이

μ„€λͺ…

λ‚˜λŠ” ν•΄λ‹Ή 문제λ₯Ό λ¨Όμ € λΉ„μˆμ΄ 이동 κ°€λŠ₯ν•œ μ’Œν‘œμ˜ 값을 κ³„μ‚°ν•˜λ €κ³  ν–ˆλ‹€. λ¨Όμ € μ²΄μŠ€νŒμ€ 8*8의 크기λ₯Ό κ°€μ§€λ―€λ‘œ λΉ„μˆμ˜ μ’Œν‘œλŠ” 8λ₯Ό μ΄ˆκ³Όν•˜κ±°λ‚˜ -1보닀 μž‘μ„ 수 μ—†λ‹€.

그리고 λΉ„μˆμ€ λŒ€κ°μ„ μœΌλ‘œ μƒν•˜μ’Œμš°λ₯Ό μ΄λ™ν•˜κΈ° λ•Œλ¬Έμ— ν˜„μž¬ λΉ„μˆμ˜ μœ„μΉ˜ κΈ°μ€€

 

  • xμΆ•
    • μ¦κ°€ν•˜λŠ” μ˜μ—­
      • nx = i + 주어진 μ’Œν‘œμ˜ xκ°’
      • ny = i + 주어진 μ’Œν‘œμ˜ yκ°’
    • κ°μ†Œν•˜λŠ” μ˜μ—­
      • mx = 주어진 μ’Œν‘œμ˜ xκ°’ - 1
      • my = 주어진 μ’Œν‘œμ˜ yκ°’ - 1
  • yμΆ•
    • μ¦κ°€ν•˜λŠ” μ˜μ—­
      • ix = nx
      • iy = ny - (ν˜„μž¬ 인덱슀 * 2)
    • κ°μ†Œν•˜λŠ” μ˜μ—­
      • jx = nx - (ν˜„μž¬ 인덱슀 * 2)
      • jy = ny

 

 

μ΄λ ‡κ²Œ 총 4κ°€μ§€λ‘œ λ‚˜λˆ„μ–΄ μ—°μ‚°ν•  수 μžˆλ„λ‘ 아이디어λ₯Ό μ§°λ‹€.

그리고 λ°©λ¬Έν•œ μ’Œν‘œλŠ” ν˜„μž¬μ˜ λΉ„μˆμ΄ 이동할 수 μžˆλŠ” μΉΈμ΄λ―€λ‘œ λ°©λ¬Έ 체크λ₯Ό 해놓은 λ’€ μ²΄μŠ€νŒμ„ λ‹€μ‹œ μ‘°νšŒν•΄μ„œ λ°©λ¬Έν•œ 칸의 개수λ₯Ό μ„Έμ–΄μ„œ 주어진 λΉ„μˆμ΄ 이동가λŠ₯ν•œ 칸의 개수λ₯Ό νŒŒμ•…ν•  수 있게 ν•œλ‹€.

μ½”λ“œ

package λͺ¨λ°”일리더_μ½”λ”©ν…ŒμŠ€νŠΈ_03;

public class question_03 {
	public int solution(String[] bishops) {
		// 여기에 μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ£Όμ„Έμš”.

		// 0. λΉ„μˆ μœ„μΉ˜ 인덱슀 번호둜 λ³€ν™˜
		int[][] idxTmp = new int[bishops.length][2];
		// 1. λΉ„μˆ μ’Œν‘œ λ°©λ¬Έ μ„€μ •
		int[][] xy = new int[8][8];

		// 2. λΉ„μˆμ˜ ν˜„μž¬ μœ„μΉ˜ λ°©λ¬Έ 체크
		for (int i = 0; i < idxTmp.length; i++) {
			idxTmp[i][0] = bishops[i].charAt(0) - 'A';
			idxTmp[i][1] = bishops[i].charAt(1) - '1';
			xy[idxTmp[i][0]][idxTmp[i][1]] += 1;
		}
		// 4. λΉ„μˆ 이동 κ°€λŠ₯ 거리 λ°©κ΅° μ„€μ • 및 개수 μ„ΈκΈ°
		// 4-1. ν˜„μž¬ λΉ„μˆ μœ„μΉ˜ μœ„ μ•„λž˜ 둜 μ΄λ™ν•˜λ©΄μ„œ 벽에 λΆ€λ”ͺνžˆλŠ”μ§€, κ²ΉμΉ˜λŠ” λΉ„μˆ ν˜Ήμ€ λ‹€λ₯Έ 말은 μ—†λŠ”μ§€ 확인
		for (int go = 0; go < bishops.length; go++) {
			int x = idxTmp[go][0], y = idxTmp[go][1];
			int i = 0;
			while (i < 8) {
				// x좕을 κΈ°μ€€μœΌλ‘œ
				int nx = i + idxTmp[go][0], ny = i + idxTmp[go][1];
				int mx = x - 1, my = y - 1;
				// y좕을 κΈ°μ€€μœΌλ‘œ
				int ix = nx, iy = ny - (i * 2);
				int jx = nx - (i * 2), jy = ny;

				// xμΆ• κΈ°μ€€ μ¦κ°€ν•˜λŠ” μ˜μ—­
				if (nx < 8 && ny < 8 && nx > -1 && ny > -1) {
					xy[nx][ny] = 1;
				}
				// xμΆ• κΈ°μ€€ κ°μ†Œν•˜λŠ” μ˜μ—­
				if (mx < 8 && my < 8 && mx > -1 && my > -1) {
					xy[mx][my] = 1;
				}

				// yμΆ• κΈ°μ€€ μ¦κ°€ν•˜λŠ” μ˜μ—­
				if (ix < 8 && iy < 8 && ix > -1 && iy > -1) {
					xy[ix][iy] = 1;
				}
				// yμΆ• κΈ°μ€€ κ°μ†Œν•˜λŠ” μ˜μ—­
				if (jx < 8 && jy < 8 && jx > -1 && jy > -1) {
					xy[jx][jy] = 1;
				}

				x = mx;
				y = my;
				i++;
			}
		}

		int answer = 0;
		for (int i = 0; i < xy.length; i++) {
			for (int k = xy.length - 1; k > -1; k--) {
				System.out.print(xy[i][k] + " ");
				if (xy[i][k] == 0) {
					answer++;
				}
			}
			System.out.println();
		}
		System.out.println("answer = " + answer);
		return answer;
	}

	// μ•„λž˜λŠ” ν…ŒμŠ€νŠΈμΌ€μ΄μŠ€ 좜λ ₯을 해보기 μœ„ν•œ main λ©”μ†Œλ“œμž…λ‹ˆλ‹€.
	public static void main(String[] args) {
		question_03 sol = new question_03();
		String[] bishops1 = { new String("D5") };
		int ret1 = sol.solution(bishops1);

		// [μ‹€ν–‰] λ²„νŠΌμ„ λˆ„λ₯΄λ©΄ 좜λ ₯ 값을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.
		System.out.println("solution λ©”μ†Œλ“œμ˜ λ°˜ν™˜ 값은 " + ret1 + " μž…λ‹ˆλ‹€.");
		System.out.println();
		String[] bishops2 = { new String("D5"), new String("E8"), new String("G2") };
		int ret2 = sol.solution(bishops2);

		// [μ‹€ν–‰] λ²„νŠΌμ„ λˆ„λ₯΄λ©΄ 좜λ ₯ 값을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.
		System.out.println("solution λ©”μ†Œλ“œμ˜ λ°˜ν™˜ 값은 " + ret2 + " μž…λ‹ˆλ‹€.");
	}
}