๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXRF8s6ezEDFAUo 

 

SW Expert Academy

SW ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์—ญ๋Ÿ‰ ๊ฐ•ํ™”์— ๋„์›€์ด ๋˜๋Š” ๋‹ค์–‘ํ•œ ํ•™์Šต ์ปจํ…์ธ ๋ฅผ ํ™•์ธํ•˜์„ธ์š”!

swexpertacademy.com


1. ๋ฌธ์ œ ์š”์•ฝ

NxNํฌ๊ธฐ์˜ map์—์„œ ํ•€๋ณผ์ด ์ด๋™ํ•˜๋Š”๋ฐ,

๋นˆ์นธ(0)์„ ๋งŒ๋‚  ๊ฒฝ์šฐ, ๋ฐฉํ–ฅ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•œ๋‹ค.

์›œํ™€(6~10)์„ ๋งŒ๋‚  ๊ฒฝ์šฐ, ๊ฐ™์€ ์›œํ™€์˜ ๋‹ค๋ฅธ ์ขŒํ‘œ๋กœ ํ˜„์žฌ ์œ„์น˜๊ฐ€ ๋ฐ”๋€๋‹ค.

๋ธ”๋ก(1~5)์„ ๋งŒ๋‚  ๊ฒฝ์šฐ, ์ง€๊ธˆ ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ”์„ ๋•Œ ๋ธ”๋ก์˜ ์ˆ˜ํ‰๋ฉด์ผ ๊ฒฝ์šฐ - ๋ฐฉํ–ฅ์ด ๋ฐ˜๋Œ€๊ฐ€ ๋˜๊ณ ,

                                     ์ง€๊ธˆ ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ”์„ ๋•Œ ๋ธ”๋ก์˜ ๊ฒฝ์‚ฌ๋ฉด์ผ ๊ฒฝ์šฐ - ๋ฐฉํ–ฅ์ด ์ง๊ฐ ๋ฐฉํ–ฅ์œผ๋กœ ๋ฐ”๋€๋‹ค.(๋ฐ˜์‚ฌ๋˜๋Š” ๋ฐฉํ–ฅ)

์‹œ์ž‘์ง€์  ๋˜๋Š” ๋ธ”๋ž™ํ™€(-1)์„ ๋งŒ๋‚  ๊ฒฝ์šฐ, ์ด๋™์„ ๋ฉˆ์ถ”๊ณ  ์ ์ˆ˜์˜ ์ตœ๋Œ€๊ฐ’์„ ๊ฐฑ์‹ ํ•œ๋‹ค.

์ฃผ์–ด์ง„ map์—์„œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

* ์‹œ์ž‘์ง€์ ์€ ๋นˆ ์นธ์ผ ๋•Œ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

2. ํ’€์ด

์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋ฌธ์ œ์ด๋‹ค.

์ž…๋ ฅ๋ฐ›์„ ๋•Œ, map์˜ ๊ฐ’์ด 6 ์ด์ƒ์ผ ๊ฒฝ์šฐ ์›œํ™€ ๋ฐฐ์—ด์— ์ขŒํ‘œ๋ฅผ ์ €์žฅํ•˜์˜€๋‹ค.

์›œํ™€ ๋ฐฐ์—ด์€ warm = new Pos[11][2] ๋กœ ์„ค์ •ํ–ˆ๋Š”๋ฐ, 

map์˜ ์ˆซ์ž๋ฅผ ์›œํ™€์˜ ์ธ๋ฑ์Šค๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด 11,

๊ฐ™์€ ์ธ๋ฑ์Šค๋กœ ์›œํ™€์ด 2๊ฐœ๊ฐ€ ์กด์žฌํ•˜๋ฏ€๋กœ 2 ๋กœ ์„ค์ •ํ•˜๊ณ  ์‹œ์ž‘ํ–ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  y, x ์ขŒํ‘œ๋ฅผ ์ €์žฅํ•  ๊ฒƒ์ด๋ฏ€๋กœ Pos ํด๋ž˜์Šค๋กœ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜์˜€๋‹ค.

 

map์—์„œ ๋ชจ๋“  ๋นˆ์นธ(0)์„ ์‹œ์ž‘์ง€์ ์œผ๋กœ ์„ค์ •ํ•ด๋ณด๊ณ  ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ ์ˆ˜์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ฐฑ์‹ ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

1. ๋ฒฝ์— ๋ถ€๋”ชํž ๋•Œ (๊ฐ€์žฅ ๋งจ ์œ„์— ์™€์•ผํ•จ -> ์ขŒํ‘œ ๋ฒ”์œ„ ๋•Œ๋ฌธ)

2. ์‹œ์ž‘์ , ๋ธ”๋ž™ํ™€์ผ ๋•Œ

3. ์›œํ™€์ผ ๋•Œ

4. ๋นˆ์นธ์ผ ๋•Œ

5. ๋ธ”๋ก์— ๋ถ€๋”ชํž ๋•Œ 

์กฐ๊ฑด์„ ๋‚˜๋ˆ ์„œ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

 

๋‚ด๊ฐ€ ๋†“์นœ ๋ถ€๋ถ„์€

1. ์ž๊พธ ๋ฌดํ•œ๋ฃจํ”„๊ฐ€ ๋Œ์•˜๋‹ค. ์›์ธ์€ 2๊ฐ€์ง€์˜€๋‹ค.

  - ๋นˆ์นธ์ผ ๋•Œ๋ฅผ ์ƒ๊ฐํ•ด์ฃผ์ง€ ์•Š์•˜๋‹ค. map ๊ฐ’์ด 0์ผ ๋•Œ์—๋Š” ์•„๋ฌด ์ผ๋„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์œผ๋‹ˆ ๊ณ„์† ๋ฌดํ•œ๋ฃจํ”„๊ฐ€ ๋Œ์•˜๋‹ค.

  - ๋ธ”๋ก์— ๋ถ€๋”ชํž ๋•Œ ๋ฐฉํ–ฅ ๋ฐ”๊ฟ”์ฃผ๋Š” ๋ถ€๋ถ„์—์„œ ๋ฐฉํ–ฅ์„ ํ•˜๋‚˜ ์ž˜๋ชป ๋ฐ”๊ฟ”์ฃผ๊ณ  ์žˆ์—ˆ๋‹ค. => ์ด๊ฒŒ ์ œ์ผ ๊นŒ๋‹ค๋กœ์› ๋‹ค.. ์ œ์ผ ์˜ค๋ž˜๊ฑธ๋ ธ์Œ

 

(+)

ํ’€์ด1

๋ธ”๋ก์— ๋ถ€๋”ชํž ๋•Œ, ๋ธ”๋ก๋งˆ๋‹ค if๋ฌธ์œผ๋กœ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์คฌ์—ˆ๋‹ค.

if (map[ny][nx] >= 1 && map[ny][nx] <= 5) {
                int idx = map[ny][nx];
                if (idx == 1) {
                    //์ˆ˜ํ‰๋ฉด
                    if (d == 0) d = 1;
                    else if (d == 3) d = 2;
                    // ๊ฒฝ์‚ฌ๋ฉด
                    else if (d == 1) d = 3;
                    else if (d == 2) d = 0;
                }
                
                else if (idx == 2) {
                	//์ˆ˜ํ‰๋ฉด
                    if (d == 1) d = 0;
                    else if (d == 3) d = 2;
                    // ๊ฒฝ์‚ฌ๋ฉด
                    else if (d == 0) d = 3;
                    else if (d == 2) d = 1;
                }
                
                else if (idx == 3) {
                    //์ˆ˜ํ‰๋ฉด
                    if (d == 1) d = 0;
                    else if (d == 2) d = 3;
                    // ๊ฒฝ์‚ฌ๋ฉด
                    else if (d == 0) d = 2;
                    else if (d == 3) d = 1;
                }
                
                else if (idx == 4) {
                    //์ˆ˜ํ‰๋ฉด
                    if (d == 0) d = 1;
                    else if (d == 2) d = 3;
                    // ๊ฒฝ์‚ฌ๋ฉด
                    else if (d == 1) d = 2;
                    else if (d == 3) d = 0;
                }
                
                else if (idx == 5) {
					//์ˆ˜ํ‰๋ฉด
                    if (d == 0) d = 1;
                    else if (d == 1) d = 0;
                    else if (d == 2) d = 3;
                    else if (d == 3) d = 2;
				}
                score++;
				continue;
            }

ํ’€์ด2

๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ๋„ ํ’€์–ด๋ดค๋Š”๋ฐ, ํƒˆ์ฃผ๋ฒ” ๊ฒ€๊ฑฐ ํ’€ ๋•Œ ํŒŒ์ดํ”„ ์—ฐ๊ฒฐ ๋ฐฉํ–ฅ ์ƒ๊ฐํ•ด์ค„ ๋•Œ์ฒ˜๋Ÿผ ํ’€์–ด๋ดค๋‹ค.

ํ•€๋ณผ์ด ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ฐ€๊ณ ์žˆ์—ˆ์œผ๋ฉด, ๋ธ”๋ก์˜ ์™ผ์ชฝ์— ๋ถ€๋”ชํžŒ๋‹ค. ์ฆ‰, ํ˜„์žฌ ํ•€๋ณผ ๋ฐฉํ–ฅ์˜ ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์ด ๋ธ”๋ก์— ๋ถ€๋”ชํžˆ๋Š” ๋ฐฉํ–ฅ์ด๋‹ค. 

์ด ์ ์„ ์ด์šฉํ•ด์„œ ๋ธ”๋ก์˜ ๋ฐฉํ–ฅ๋งˆ๋‹ค ์ˆ˜ํ‰๋ฉด์ด๋ฉด 1, ๊ฒฝ์‚ฌ๋ฉด์ด๋ฉด 0 ์„ ์ €์žฅํ•ด์ฃผ์—ˆ๋‹ค.

์ˆ˜ํ‰๋ฉด์„ ๋งŒ๋‚˜๋ฉด ํ•€๋ณผ์˜ ๋ฐฉํ–ฅ์„ ๋ฐ˜๋Œ€๋กœ ๋ฐ”๊ฟ”์ฃผ๊ณ ,

๊ฒฝ์‚ฌ๋ฉด์„ ๋งŒ๋‚˜๋ฉด ๋ธ”๋ก์˜ ๊ฒฝ์‚ฌ๋ฉด์ธ ๋˜ ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์ด ํ•€๋ณผ์˜ ๋ฐฉํ–ฅ์ด ๋œ๋‹ค.

// ๋ธ”๋ก์— ๋ถ€๋”ชํž ๋•Œ
            if (map[ny][nx] >= 1 && map[ny][nx] <= 5) {
                int idx = map[ny][nx];
                
                //๋ถ€๋”ชํžˆ๋Š” ๋ธ”๋ก์˜ ๋ฐฉํ–ฅ
                int bd = 0;
                switch(d) { //ํ˜„์žฌ๋ฐฉํ–ฅ์˜ ๋ฐ˜๋Œ€๋ฐฉํ–ฅ == ๋ถ€๋”ชํžˆ๋Š” ๋ธ”๋ก์˜ ๋ฐฉํ–ฅ
	                case 0: bd=1; break;
	                case 1: bd=0; break;
	                case 2: bd=3; break;
	                case 3: bd=2; break;
                }
                
                if ( block[idx][bd]==1 ) { //์ˆ˜ํ‰์ด๋ฉด ๋ฐ˜๋Œ€๋ฐฉํ–ฅ
                	d = bd;
                } else if ( block[idx][bd]==0 ) { //์ˆ˜์ง์ด๋ฉด ์ง๊ฐ๋ฐฉํ–ฅ
                	for (int i=0; i<4; i++) {
                		if ( bd!=i && block[idx][i]==0 ) {
                			d=i;
                    		break;
                		}
                	}
                }
                score++;
				continue;
            }

 

 

3. ์ฝ”๋“œ

๋ธ”๋ก์— ๋ถ€๋”ชํž ๋•Œ - if๋ฌธ

๋”๋ณด๊ธฐ
package a22_10_20;

import java.io.*;
import java.util.*;

public class SW_5650_ํ•€๋ณผ๊ฒŒ์ž„ {

    static int[][] map;
    static int N, ans;
    static Pos[][] warm;

    static int[] dy = { -1, 1, 0, 0 };
    static int[] dx = { 0, 0, -1, 1 };

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = null;
        int T = Integer.parseInt(br.readLine());
        for (int tc = 1; tc <= T; tc++) {
            N = Integer.parseInt(br.readLine());
            map = new int[N][N];
            warm = new Pos[11][2];
            
            for (int i = 0; i < N; i++) {
                st = new StringTokenizer(br.readLine());
                for (int j = 0; j < N; j++) {
                	int num = Integer.parseInt(st.nextToken());
                    map[i][j] = num;
                    if (num >= 6) {
                    	if (warm[ num ][0] == null) {
                    		warm[num][0] = new Pos(i, j);
                    	} else {
                    		warm[num][1] = new Pos(i, j);
                    	}
                    }
                }
            } // ์ž…๋ ฅ ๋

            ans = 0;
            solution();
            System.out.println("#" + tc + " " + ans);
        }
    }

    static void solution() {

        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if (map[i][j] != 0) continue;
                for (int d = 0; d < 4; d++) {
                	move(i, j, d);
                }
            }
        }
    }

    static void move(int sy, int sx, int d) {
        int score = 0;
        int ny = sy;
        int nx = sx;
        while (true) {
            ny += dy[d];
            nx += dx[d];

            // ๋ฒฝ์— ๋ถ€๋”ชํž ๋•Œ
            if (ny < 0 || nx < 0 || ny >= N || nx >= N) {
            	if (d == 0) d = 1;
                else if (d == 1) d = 0;
                else if (d == 2) d = 3;
                else if (d == 3) d = 2;
                score++;
                continue;
            }
            // ์‹œ์ž‘์ ์ด๊ฑฐ๋‚˜, ๋ธ”๋ž™ํ™€์ผ ๋•Œ
            if ((ny == sy && nx == sx) || map[ny][nx] == -1) {
                ans = Math.max(score, ans);
                break;
            }
            // ์›œํ™€์ผ ๋•Œ
            if (map[ny][nx] >= 6) {
                int idx = map[ny][nx];
                if (warm[idx][0].y == ny && warm[idx][0].x == nx) {
                    ny = warm[idx][1].y;
                    nx = warm[idx][1].x;
                } else if (warm[idx][1].y == ny && warm[idx][1].x == nx){
                    ny = warm[idx][0].y;
                    nx = warm[idx][0].x;
                }
                continue;
            }
            //๋นˆ์นธ์ด๋ฉด ์ญ‰ ๊ฐ„๋‹ค
            if (map[ny][nx] == 0) continue;
            // ๋ธ”๋ก์— ๋ถ€๋”ชํž ๋•Œ
            if (map[ny][nx] >= 1 && map[ny][nx] <= 5) {
                int idx = map[ny][nx];
                if (idx == 1) {
                    //์ˆ˜ํ‰๋ฉด
                    if (d == 0) d = 1;
                    else if (d == 3) d = 2;
                    // ๊ฒฝ์‚ฌ๋ฉด
                    else if (d == 1) d = 3;
                    else if (d == 2) d = 0;
                }
                
                else if (idx == 2) {
                	//์ˆ˜ํ‰๋ฉด
                    if (d == 1) d = 0;
                    else if (d == 3) d = 2;
                    // ๊ฒฝ์‚ฌ๋ฉด
                    else if (d == 0) d = 3;
                    else if (d == 2) d = 1;
                }
                
                else if (idx == 3) {
                    //์ˆ˜ํ‰๋ฉด
                    if (d == 1) d = 0;
                    else if (d == 2) d = 3;
                    // ๊ฒฝ์‚ฌ๋ฉด
                    else if (d == 0) d = 2;
                    else if (d == 3) d = 1;
                }
                
                else if (idx == 4) {
                    //์ˆ˜ํ‰๋ฉด
                    if (d == 0) d = 1;
                    else if (d == 2) d = 3;
                    // ๊ฒฝ์‚ฌ๋ฉด
                    else if (d == 1) d = 2;
                    else if (d == 3) d = 0;
                }
                
                else if (idx == 5) {
					//์ˆ˜ํ‰๋ฉด
                    if (d == 0) d = 1;
                    else if (d == 1) d = 0;
                    else if (d == 2) d = 3;
                    else if (d == 3) d = 2;
				}
                score++;
				continue;
            }
        }
    }

    static class Pos {
        int y, x;

        Pos(int y, int x) {
            this.y = y;
            this.x = x;
        }
    }
}

๋ธ”๋ก์— ๋ถ€๋”ชํž ๋•Œ - ๋ธ”๋ก 2์ฐจ์› ๋ฐฐ์—ด

๋”๋ณด๊ธฐ
package a22_10_22;

import java.io.*;
import java.util.*;

public class SW_5650_ํ•€๋ณผ๊ฒŒ์ž„ {

    static int[][] map;
    static int N, ans;
    static Pos[][] warm;

    static int[] dy = { -1, 1, 0, 0 };
    static int[] dx = { 0, 0, -1, 1 };
    static int[][] block = {
    	  // ์ƒ ํ•˜ ์ขŒ ์šฐ - ์ˆ˜ํ‰:1, ์ง๊ฐ:0
    		{0,0,0,0}, //0 dummy
    		{0,1,1,0}, //1
    		{1,0,1,0}, //2
    		{1,0,0,1}, //3
    		{0,1,0,1}, //4
    		{1,1,1,1}  //5
    	};

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = null;
        int T = Integer.parseInt(br.readLine());
        for (int tc = 1; tc <= T; tc++) {
            N = Integer.parseInt(br.readLine());
            map = new int[N][N];
            warm = new Pos[11][2];
            
            for (int i = 0; i < N; i++) {
                st = new StringTokenizer(br.readLine());
                for (int j = 0; j < N; j++) {
                	int num = Integer.parseInt(st.nextToken());
                    map[i][j] = num;
                    if (num >= 6) {
                    	if (warm[ num ][0] == null) {
                    		warm[num][0] = new Pos(i, j);
                    	} else {
                    		warm[num][1] = new Pos(i, j);
                    	}
                    }
                }
            } // ์ž…๋ ฅ ๋

            ans = 0;
            solution();
            System.out.println("#" + tc + " " + ans);
        }
    }

    static void solution() {

        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if (map[i][j] != 0) continue;
                for (int d = 0; d < 4; d++) {
                	move(i, j, d);
                }
            }
        }
    }

    static void move(int sy, int sx, int d) {
        int score = 0;
        int ny = sy;
        int nx = sx;
        while (true) {
            ny += dy[d];
            nx += dx[d];

            // ๋ฒฝ์— ๋ถ€๋”ชํž ๋•Œ
            if (ny < 0 || nx < 0 || ny >= N || nx >= N) {
            	if (d == 0) d = 1;
                else if (d == 1) d = 0;
                else if (d == 2) d = 3;
                else if (d == 3) d = 2;
                score++;
                continue;
            }
            // ์‹œ์ž‘์ ์ด๊ฑฐ๋‚˜, ๋ธ”๋ž™ํ™€์ผ ๋•Œ
            if ((ny == sy && nx == sx) || map[ny][nx] == -1) {
                ans = Math.max(score, ans);
                break;
            }
            // ์›œํ™€์ผ ๋•Œ
            if (map[ny][nx] >= 6) {
                int idx = map[ny][nx];
                if (warm[idx][0].y == ny && warm[idx][0].x == nx) {
                    ny = warm[idx][1].y;
                    nx = warm[idx][1].x;
                } else if (warm[idx][1].y == ny && warm[idx][1].x == nx){
                    ny = warm[idx][0].y;
                    nx = warm[idx][0].x;
                }
                continue;
            }
            
            //๋นˆ์นธ์ด๋ฉด ์ญ‰ ๊ฐ„๋‹ค
            if (map[ny][nx] == 0) continue;
            
            // ๋ธ”๋ก์— ๋ถ€๋”ชํž ๋•Œ
            if (map[ny][nx] >= 1 && map[ny][nx] <= 5) {
                int idx = map[ny][nx];
                
                //๋ถ€๋”ชํžˆ๋Š” ๋ธ”๋ก์˜ ๋ฐฉํ–ฅ
                int bd = 0;
                switch(d) { //ํ˜„์žฌ๋ฐฉํ–ฅ์˜ ๋ฐ˜๋Œ€๋ฐฉํ–ฅ == ๋ถ€๋”ชํžˆ๋Š” ๋ธ”๋ก์˜ ๋ฐฉํ–ฅ
	                case 0: bd=1; break;
	                case 1: bd=0; break;
	                case 2: bd=3; break;
	                case 3: bd=2; break;
                }
                
                if ( block[idx][bd]==1 ) { //์ˆ˜ํ‰์ด๋ฉด ๋ฐ˜๋Œ€๋ฐฉํ–ฅ
                	d = bd;
                } else if ( block[idx][bd]==0 ) { //์ˆ˜์ง์ด๋ฉด ์ง๊ฐ๋ฐฉํ–ฅ
                	for (int i=0; i<4; i++) {
                		if ( bd!=i && block[idx][i]==0 ) {
                			d=i;
                    		break;
                		}
                	}
                }
                score++;
				continue;
            }
        }
    }

    static class Pos {
        int y, x;

        Pos(int y, int x) {
            this.y = y;
            this.x = x;
        }
    }
}