๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ์žฅ์›์ต ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
๐Ÿ’ป Computer Science/- Data Structure, Algorithm

[์•Œ๊ณ ๋ฆฌ์ฆ˜ PS] ๋ฐฑ์ค€ 9184๋ฒˆ ์‹ ๋‚˜๋Š” ํ•จ์ˆ˜ ์‹คํ–‰ ์ž๋ฐ” ๋ฌธ์ œํ’€์ด

by Wonit 2021. 2. 24.

๋ฌธ์ œ

ํ•ด๋‹น ํฌ์ŠคํŒ…์€ ๋ฐฑ์ค€์˜ 9184๋ฒˆ ์‹ ๋‚˜๋Š” ํ•จ์ˆ˜ ์‹คํ–‰ ์˜ ์ ‘๊ทผ๊ณผ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•œ ๊ธ€ ์ž…๋‹ˆ๋‹ค.
์ •๋‹ต ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜์‹œ๋ ค๋ฉด solve url ์—์„œ ํ™•์ธ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

9184๋ฒˆ: ์‹ ๋‚˜๋Š” ํ•จ์ˆ˜ ์‹คํ–‰

์ž…๋ ฅ์€ ์„ธ ์ •์ˆ˜ a, b, c๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฉฐ, ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ฃผ์–ด์ง„๋‹ค. ์ž…๋ ฅ์˜ ๋งˆ์ง€๋ง‰์€ -1 -1 -1๋กœ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ์„ธ ์ •์ˆ˜๊ฐ€ ๋ชจ๋‘ -1์ธ ๊ฒฝ์šฐ๋Š” ์ž…๋ ฅ์˜ ๋งˆ์ง€๋ง‰์„ ์ œ์™ธํ•˜๋ฉด ์—†๋‹ค.

www.acmicpc.net

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ ‘๊ทผํ•ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ๋จผ์ € ์ƒ๊ฐํ•ด๋ณด์ž.

๋ฌธ์ œ ์ ‘๊ทผ

์ด ๋ฌธ์ œ๋Š” ์กฐ๊ธˆ ์žฌ๋ฐŒ๋Š” ๋ฌธ์ œ์˜€๋‹ค.

 

๋ณดํ†ต ์šฐ๋ฆฌ๋Š” ๋ฌธ์ œ์— ์ฃผ์–ด์ง„ ์กฐ๊ฑด์„ ๋ณด๊ณ  ๋ถ„์„ํ•˜์—ฌ ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜์ง€๋งŒ, ์ด ๋ฌธ์ œ๋Š” ์•„์˜ˆ ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์ฃผ๊ณ  ์‹คํ–‰ ์‹œ์ผœ์„œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ค˜๋ผ๋Š” ๋ฌธ์ œ๋กœ, ์•ฝ๊ฐ„์˜ ์ƒ๊ฐ๋งŒ ํ•˜๋ฉด ๋˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

 

์ด๋ฒˆ ๋ฌธ์ œ์˜ ํ•ต์‹ฌ์€ ์–ด๋–ป๊ฒŒ ์žฌ๊ท€ ํ•จ์ˆ˜์˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ ์‹œํ‚ฌ ๊ฒƒ์ด๋ƒ ์— ๊ด€ํ•œ ๋ฌธ์ œ์ด๋‹ค.

 

์ง€๋‚œ ์žฌ๊ท€ ํ˜ธ์ถœ์˜ ์ด๋ก ์—์„œ ์žฌ๊ท€ ํ•จ์ˆ˜์˜ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•œ ๋ฐฉ๋ฒ•์ธ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์•˜๋Š”๋ฐ, ์ด ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•ด๊ฒฐ๋ฒ•

์ด ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ๊ทธ๋ƒฅ ์‹คํ–‰ ์‹œํ‚จ๋‹ค๋ฉด ์•„๋งˆ ์ตœ์•…์˜ ๊ฒฝ์šฐ (20, 20, 20) ์—์„œ 4^(20 + 20 + 20) ์˜ ์žฌ๊ท€ ํ•จ์ˆ˜์˜ call์ด ๋ฐœ์ƒํ•  ๊ฒƒ์ด๋‹ค.

 

๊ทธ๋Ÿผ ๋Œ€์ถฉ 1,099,511,627,776 * 3 ์˜ ํ˜ธ์ถœ์ด ์ด๋ฃจ์–ด์ ธ์•ผ ํ•œ๋‹ค.

 

์ด ๋ฐฉ๋ฒ•์„ ์šฐ๋ฆฌ๋Š” Memoization์„ ํ†ตํ•ด์„œ ์•„์ฃผ ํš๊ธฐ์ ์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

 

๊ฒฐ๋ก ์€ ์ด ๋ฌธ์ œ์˜ ํฐ ํ•ต์‹ฌ์€ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์‚ฌ์šฉํ•  ์ค„ ์•„๋ƒ ๋ชจ๋ฅด๋ƒ์ด๋‹ค.

 

์ •๋‹ต ์ฝ”๋“œ

public class Main {
    static int[][][] arr = new int[51][51][51];
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        while(true) {
            int a = input.nextInt();
            int b = input.nextInt();
            int c = input.nextInt();

            if(a == -1 && c == -1 && b == -1) break;

            if(a <= 0 || b <= 0 || c <= 0) {
                System.out.printf("w(%d, %d, %d) = %d \n", a, b, c, 1);
            }else {
                System.out.printf("w(%d, %d, %d) = %d \n", a, b, c, w(a, b, c));
            }
        }
    }

    private static int w(int a, int b, int c) {
        if(a <= 0 || b <= 0 || c <= 0) {
            return 1;
        }
        if(a > 20 || b > 20 || c > 20) {
            arr[a][b][c] = w(20, 20, 20);
            return arr[a][b][c];
        }

        if(arr[a][b][c] != 0) return arr[a][b][c];
        else {
            if(a < b && b < c) {
                arr[a][b][c] = w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c);
            }
            else {
                arr[a][b][c] = w(a-1, b, c) +
                        w(a-1, b-1, c) +
                        w(a-1, b, c-1) -
                        w(a-1, b-1, c-1);
            }
            return arr[a][b][c];
        }

    }
}

 

์ •๋‹ต ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜์‹œ๋ ค๋ฉด solve url ์—์„œ ํ™•์ธ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋Œ“๊ธ€