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

[์•Œ๊ณ ๋ฆฌ์ฆ˜ PS] ๋ฐฑ์ค€ 1904๋ฒˆ 01 ํƒ€์ผ ์ž๋ฐ” ๋ฌธ์ œ ํ’€์ด

by Wonit 2021. 1. 23.

๋ฌธ์ œ

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

๋ฌธ์ œ

ํ•ด๊ฒฐ๋ฒ•

์šฐ์„  ๋ฌธ์ œ๋ฅผ ์ œ๋Œ€๋กœ ํŒŒ์•…ํ•ด๋ณด์ž.


ํƒ€์ผ์ด๊ณ  ๋ญ๊ณ ๋ฅผ ๋– ๋‚˜์„œ ์šฐ๋ฆฌ๋Š” ์ˆ˜์—ด์„ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.


๊ทผ๋ฐ ๊ทธ ์ˆ˜์—ด์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ ์ฃผ์–ด์ง€๋Š” ์ˆ˜๊ฐ€ 2๊ฐ€์ง€ ์ข…๋ฅ˜์ด๋‹ค.

  1. 1
  2. 00

๊ทธ๋ฆฌ๊ณ  ๊ธธ์ด๊ฐ€ n์ธ ์ˆ˜์—ด์„ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.


์˜ˆ๋ฅผ ๋“ค์–ด์„œ ๊ธธ์ด๊ฐ€ n์ธ ์ˆ˜์—ด์„ ์—ฌ๋Ÿฌ๊ฐœ ๋งŒ๋“ค์–ด์„œ ๊ทœ์น™์„ ์ฐพ์•„๋ณด์ž.

tile(1) = 1
tile(2) = 11, 00
tile(3) = 100, 001, 111
tile(4) = 1000, 1001, 0011, 1100, 1111
...

 

์—ฌ๊ธฐ์„œ ์ข€ ์ƒ๊ฐํ•ด๋ณด์ž.

 

๋งŒ์•ฝ 100์˜ ๊ธธ์ด๋ฅผ ๊ฐ–๋Š” ํƒ€์ผ์„ ๋งŒ๋“ ๋‹ค๊ณ  ํ•˜๋ฉด, ์–ด๋–ป๊ฒŒ ํ• ๊นŒ?


ํƒ€์ผ์˜ ์ข…๋ฅ˜๋Š” 2๊ฐ€์ง€, 00๊ณผ 1์ด๋ฏ€๋กœ ๊ฐ๊ฐ์˜ ๊ธธ์ด๊ฐ€ 2์™€ 1์ด๋‹ค.


๊ทธ๋Ÿผ 100์˜ ๊ธธ์ด๋ฅผ ๊ฐ–๋Š” ํƒ€์ผ์„ ๋งŒ๋“ค๋ ค๋ฉด 98๊ฐœ์˜ ํƒ€์ผ์—์„œ 00 ํƒ€์ผ์„ ๋”ํ•ด์„œ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์™€ 99๊ฐœ์˜ ํƒ€์ผ์—์„œ 1 ํƒ€์ผ์„ ๋”ํ•ด์„œ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ํ•ฉ์น˜๋ฉด ๋˜์ง€ ์•Š์„๊นŒ?


๊ทธ๋ ‡๋‹ค.


์ •๋‹ต์ด๋‹ค.


๊ทผ๋ฐ ์กฐ๊ฑด์ด ํ•˜๋‚˜๊ฐ€ ๋” ์ถ”๊ฐ€๋œ๋‹ค.


15746์„ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๋ผ๊ณ  ํ–ˆ๋‹ค.


์ด๋Š” ์•„๋งˆ ์ˆ˜์˜ ๋ฒ”์œ„๊ฐ€ ๋„ˆ๋ฌด ์ปค์ ธ์„œ ํ•ด๋‹น ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•œ ๊ฒƒ์ด๋‹ค.


๋‹จ์ˆœํžˆ ์ถœ๋ ฅ๋ฌธ์— 15746์„ ๋ชจ๋“ˆ๋Ÿฌํ•˜๋ฉด ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ ์ €์žฅํ•˜๋Š” ๋‚ด๋ถ€ ๋ฐฐ์—ด tile ์—์„œ int๋ณด๋‹ค ํฐ ๊ฐ’์ด ๋“ค์–ด๊ฐ€ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๊ฐ€ ๋ฐœ์ƒํ•ด ์˜ค๋‹ต์„ ๋‚ผ ๊ฒƒ์ด๋‹ค.

 

๊ทธ๋Ÿฌ๋ฏ€๋กœ tile์˜ ๊ฐ’์„ ๊ตฌํ•˜๋Š” ๋งค ์—ฐ์‚ฐ๋งˆ๋‹ค ๋ชจ๋“ˆ๋Ÿฌ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์ž.

์ฝ”๋“œ๋กœ ๊ฐ€๊ธฐ ์ „์— ์ž ๊น ์ด๊ฒƒ ํ•˜๋‚˜๋งŒ ์งš๊ณ  ๋„˜์–ด๊ฐ€์ž ์ค‘์š”ํ•˜๋‹ค.

๋‚˜๋„ ์ฒ˜์Œ์—” ๊ทธ๋žฌ๊ณ  ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ์ง์ ‘ ๊ฐ€์ง€์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ด๋ณธ ๋’ค ํ”ผ๋ณด๋‚˜์น˜ ๊ฐ™์€ ์ˆ˜์—ด์ด ๋‚˜์™€์„œ ํ•ด๋‹น ์‹์„ ์ ํ™”์‹์œผ๋กœ ๋„์ถฃํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ’€๊ณคํ•œ๋‹ค.


ํ•˜์ง€๋งŒ ์ด๋Ÿฐ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์€ ๋งค์šฐ ์ข‹์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.


๋™์  ๊ณ„ํš๋ฒ•์œผ๋กœ ํ’€๋ฆด ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์˜ ๋Œ€๋‹ค์ˆ˜๋Š” ์ ํ™”์‹์ด ์กด์žฌํ•œ๋‹ค๊ณ  ํ•˜๋”๋ผ๋„ ์šฐ๋ฆฌ๊ฐ€ ๋ฌธ์ œ์˜ ์ž…์ถœ๋ ฅ์„ ์ง์ ‘ ์จ๋ณด๋ฉฐ ํ•ญ์ƒ ์ ํ™”์‹์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์ •๋ง ํž˜๋“ค๋‹ค.


๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ข€๋” ์ข‹์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ•ด๊ฒฐํ•˜๊ณ  ์ƒ๊ฐํ•ด๋‚ด๊ธฐ ์œ„ํ•ด์„œ๋Š” ํž˜๋“ค๋”๋ผ๋„ ์™œ ์ด๋Ÿฐ ์ ํ™”์‹์ด ๋‚˜์™”๋Š”์ง€, ์ด๋Ÿฐ ์ ํ™”์‹์„ ์–ด๋–ป๊ฒŒ ๋„์ถœํ•ด ๋ƒˆ๋Š”์ง€๋ฅผ ์•Œ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

 

์ •๋‹ต ์ฝ”๋“œ

Dynamic Programming ์€ ํŠน์„ฑ์ƒ 2๊ฐ€์ง€์˜ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. Top Down
  2. Bottom Up

๋‘ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ชจ๋‘ ํ’€์–ด๋ณด๋„๋ก ํ•˜์ž.

Top Down

TopDown ๋ฐฉ๋ฒ•์˜ ํŠน์ง•์ด๋ผ๊ณ  ํ•œ๋‹ค๋ฉด ์ผ๋‹จ ์ ํ™”์‹์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.


ํ•˜์ง€๋งŒ ์ ํ™”์‹์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ํ•ด๋‹น ๋ฌธ์ œ๋Š” ์ค‘๋ณต ๊ณ„์‚ฐ์ด๋ผ๋Š” ์น˜๋ช…์ ์ธ ๋น„ํšจ์œจ ๋ฉ์–ด๋ฆฌ๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.


๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ค‘๋ณต ๊ณ„์‚ฐ์„ ์—†์• ๋Š” Memoization ๊ณผ์ •์„ ์ถ”๊ฐ€ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

import java.io.*;

public class Main {

  private static int[] tile; // memoization ๋ฐฐ์—ด

  public static void main(String[] args) throws IOException{
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

    int n = Integer.parseInt(br.readLine());

    tile = new int[10000001];

    bw.write(String.valueOf(tiling(n)));

    bw.flush();
    bw.close();
  }

  private static int tiling(int n) {
    if(tile[n] > 0) return tile[n]; // ์ด์ „์— ๊ณ„์‚ฐํ–ˆ๋˜ ๊ฐ’์ด๋ผ๋ฉด ์ค‘๋ณต ๊ณ„์‚ฐ์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค.

    if (n == 1) return tile[1] = 1;
    else if (n == 2) return tile[2] = 2;
    else if (n == 3) return tile[3] = 3;
    else {
        tile[n] = tiling(n-1) + tiling(n-2);
        return tile[n] %= 15746;
    }
  }
}

 

Bottom Up

 

Bottom up์€ ์ ํ™”์‹์˜ ๋…ผ๋ฆฌ ์ž์ฒด๋ฅผ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๋ณ€ํ˜•ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

import java.io.*;

public class Main {
  public static void main(String[] args) throws IOException{
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

    int n = Integer.parseInt(br.readLine());

    long[] tile = new long[1000001];

    tile[1] = 1; tile[2] = 2; tile[3] = 3;
    if(n > 3) {
      for(int i = 3; i <= n; i++) {
        tile[i] = tile[i-1] + tile[i-2];
        tile[i] %= 15746;
      }
    }
    bw.write(String.valueOf(tile[n]));

    bw.flush();
    bw.close();
  }
}

Top Down ๋Œ€์‹  Bottom up ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ณต๊ฐ„์ด ์ž‘์•„์ง€๋ฏ€๋กœ ๊ณต๊ฐ„์ ์œผ๋กœ ๋ดค์„ ๋•Œ ์ด๋“์„ ์ทจํ•  ์ˆ˜ ์žˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ๋ณ€์ˆ˜ ์‚ฌ์šฉ์ด ๋งŽ์•„์ง€๊ณ  ๊ทธ์— ๋”ฐ๋ผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋Š” ์œ„ํ—˜๋„๊ฐ€ ์ฆ๊ฐ€๋˜๋ฉฐ (์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œํ’€์ด๋ฅผ ๋– ๋‚˜์„œ) ์ง๊ด€์ ์ด์ง€ ์•Š๊ฒŒ ๋œ๋‹ค.

 

๊ฐ๊ฐ์˜ ์žฅ๋‹จ์ ์€ ๋ถ„๋ช… ์กด์žฌํ•˜๋‹ˆ ๋น„๊ตํ•ด๋ณด๊ณ  ๋” ์ž˜ ์–ด์šธ๋ฆฌ๋Š” ๊ฒƒ์„ ์„ ํƒํ•˜๋ฉด ์ข‹์„๋“ฏ ํ•˜๋‹ค.

 

ํ•˜์ง€๋งŒ ์—ฐ์Šต๋•Œ๋Š” ์™ ๋งŒํ•˜๋ฉด ๋‘ ๋ฐฉ๋ฒ•์„ ๋‹ค ์จ๋ณด๋„๋ก ํ•˜์ž.

 


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

๋Œ“๊ธ€