• ํŒจ์ŠคํŠธ์บ ํผ์Šค ์ฑŒ๋ฆฐ์ง€ 8์ผ์ฐจ

    2021. 11. 8.

    by. JuneBee

    728x90
    ๋ฐ˜์‘ํ˜•

    ๋‚ ์งœ : 2021 ๋…„ 11 ์›” 8 ์ผ
    ์‹œ์ฒญ ๊ฐ•์˜ : ๋ฐฑํŠธ๋ž˜ํ‚น ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ดํ•ด (1)

    ๋ฒŒ์จ 8์ผ์ฐจ๋ผ๋‹ˆ..์‹ ๊ธฐํ•˜๋‹ค..

    ์˜ค๋Š˜์€ ๋ฐฑํŠธ๋ž˜ํ‚น ์•Œ๊ณ ๋ฆฌ์ฆ˜์ดํ•ด (1)์„ ๋“ค์—ˆ๋‹ค. ํฌ์ŠคํŒ… ์ž‘์„ฑ ํ›„, N ํ€ธ์„ ์ง์ ‘ ๊ตฌํ˜„ํ•ด๋ณด๊ณ  ๋ฐฑํŠธ๋ž˜ํ‚น ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ดํ•ด (2)๋ฅผ ๋“ฃ๋Š”๊ฒŒ ๋‚˜์„ ๊ฒƒ ๊ฐ™๋‹ค.

    ์• ๋‹ˆ์›จ์ด..

     

    ๋ฐฑํŠธ๋ž˜ํ‚น

    ์ œ์•ฝ ์กฐ๊ฑด ๋งŒ์กฑ ๋ฌธ์ œ์—์„œ ํ•ด๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•œ ์ „๋žต
    ํ•ด๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ํ›„๋ณด๊ทผ์„ ํŠธ๋ฆฌ ํ˜•ํƒœ๋กœ ํ‘œํ˜„ (State Space Tree)
    ์ง„์งœ ํŠธ๋ฆฌ๋Š” ์•„๋‹ˆ๊ณ , dfs ๋กœ ํ’€ ์ˆ˜ ์žˆ๋‹ค.

     

    How it works...

    1. ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ํ•˜๋‚˜ ์žก์•„์„œ, ํ•ด๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ํŒ๋‹จ

    2. ํ•ด๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ํ•ด์˜ child ๊ฐ€ ํ•ด๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ํŒ๋‹จ

    3. ํ•ด๊ฐ€ ๋  ์ˆ˜ ์—†๋‹ค๋ฉด, ๋‹ค์‹œ ๊ทธ ์ „ ์กฐ๊ฑด์œผ๋กœ ๋Œ์•„๊ฐ„๋‹ค.

    ์ด๋•Œ, ํ•ด๊ฐ€ ๋  ์ˆ˜ ์—†๋Š” ๋…ธ๋“œ์˜ ์ž์‹๋“ค์€ ํ™•์ธํ•ด๋ณด์ง€ ์•Š์•„๋„ ํ•ด๊ฐ€ ๋  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๊ฐ€์ง€๋“ค์€ ํ™•์ธํ•  ํ•„์š”๊ฐ€ ์—†์–ด์ง€๋Š”๋ฐ ์ด๋ฅผ ๊ฐ€์ง€์น˜๊ธฐ๋ผ๊ณ  ํ•œ๋‹ค.

    4. ์œ„ ๊ณผ์ •์„ ์ตœ์ข… ํ•ด๋ฅผ ์ฐพ์„ ๋•Œ ๊นŒ์ง€ ๋ฐ˜๋ณต

     

    ์ด๋ฏธ์ง€ ์ถœ์ฒ˜ : ResearchGate

     

    ๋Œ€ํ‘œ ๋ฌธ์ œ : N Queen

    ์ด๋ฏธ์ง€ ์ถœ์ฒ˜ : codesdope

    N-Queen ๋ฌธ์ œ๋Š” ๋ฐฑ ํŠธ๋ž˜ํ‚น ์ „๋žต์˜ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์‹œ ๋ฌธ์ œ์ด๋‹ค.

    NxN ์ฒด์ŠคํŒ์— N ๊ฐœ์˜ ํ€ธ์„ ๋†“์•˜์„ ๋•Œ ์„œ๋กœ ๊ณต๊ฒฉํ•˜์ง€ ๋ชปํ•˜๋„๋ก ๋ฐฐ์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๋Š” ๋ฌธ์ œ์ด๋‹ค.

    ์ œ์•ฝ ์กฐ๊ฑด : ํ€ธ์€ ๋Œ€๊ฐ์„ , ์ˆ˜ํ‰, ์ˆ˜์ง์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.

    Approach : 

    ๋ฐฑ ํŠธ๋ž˜ํ‚น์œผ๋กœ ํ•ด๋‹น ์ œ์•ฝ ์กฐ๊ฑด๋“ค์„ ๊ฐ€์ง€์น˜๊ธฐ ํ•˜๋ฉด์„œ ์ ‘๊ทผํ•œ๋‹ค.

    ์ˆ˜ํ‰์œผ๋กœ ์ด๋™ ํ•  ์ˆ˜ ์žˆ์Œ : ํ•œ row์— ํ•œ๊ฐœ์˜ ํ€ธ๋งŒ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•ด์„ํ•  ์ˆ˜ ์žˆ๋‹ค.

    ๋งจ์œ„์— ํ€ธ์„ ๋ฐฐ์น˜ํ•˜๊ณ  ํ•ด๋‹น ํ€ธ์ด ์ด๋™ํ•  ์ˆ˜ ์—†๋Š” ์œ„์น˜์— ๋‹ค์Œ ํ€ธ์„ ๋ฐฐ์น˜ํ•˜๋ฉด ๋œ๋‹ค. ๋งŒ์•ฝ ํ€ธ์„ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด, ๊ทธ ์ „๋‹จ๊ณ„๋กœ ๋Œ์•„๊ฐ€์„œ ์žฌ๋ฐฐ์น˜ํ•œ๋‹ค

     

     

    ์กฐ๊ฑด ์ฒดํฌ

    1. ์ˆ˜์ง ์ฒดํฌ

    ํ€ธ์˜ ์ขŒํ‘œ๊ฐ€ (1,2) ๋ผ๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ์ด ํ€ธ์€ ๋ชจ๋“  (x,2)๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.

    ์ฆ‰, ํ•ด๋‹น column (y์ขŒํ‘œ) ์—๋Š” ๋”์ด์ƒ ํ€ธ์„ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์—†๋‹ค! ํ•œ column์—๋Š” ํ•˜๋‚˜์˜ ํ€ธ๋งŒ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค.

     

    2. ์ˆ˜ํ‰ ์ฒดํฌ

    ํ€ธ์€ ์ˆ˜ํ‰์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ํ•œ row์—๋Š” ํ•˜๋‚˜์˜ ํ€ธ๋งŒ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค.

     

    3. ๋Œ€๊ฐ์„  ์ฒดํฌ

    ์˜†์— ์กฐ์žกํ•˜๊ฒŒ ๊ทธ๋ฆผ์„ ๊ทธ๋ ค๋ดค๋Š”๋ฐ, ํ€ธ์˜ ๋Œ€๊ฐ์„  ์œ„์น˜์— ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ์˜†๊ณผ ๊ฐ™์ด ์ด๋“ฑ๋ณ€ ์‚ผ๊ฐํ˜•์ด ๊ทธ๋ ค์งˆ ์ˆ˜ ์žˆ๋Š” ์œ„์น˜์— ํ€ธ์ด ๋ฐฐ์น˜๋œ๋‹ค.

     

    ์ฆ‰, |๋ฐฐ์น˜๋  ํ€ธ์˜ x ์ขŒํ‘œ - ํ˜„์žฌ ํ€ธ์˜ x ์ขŒํ‘œ| == |๋ฐฐ์น˜๋  ํ€ธ์˜ y ์ขŒํ‘œ - ํ˜„์žฌ ํ€ธ์˜ y ์ขŒํ‘œ| ์ผ๋•Œ ์ด ํ€ธ๋“ค์€ ๋Œ€๊ฐ์„ ์ƒ์— ์žˆ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

     

    ๋”ฐ๋ผ์„œ, ์ด๋ฅผ ์ˆ˜๋„ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ์กฐ๊ฑด์‹์„ ๋„์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.

     

     

     

    if ( abs(queen.col - curr_queen.col) == abs(queen.row - curr_queen.col) ) continue; //๋Œ€๊ฐ์„ ์ƒ
    else {
    //other code
    }

    ์œ„์— ์ œ์‹œ๋œ ์กฐ๊ฑด๋“ค๋กœ ๊ฐ€์ง€์น˜๊ธฐ๋ฅผ ํ•˜๊ณ  dfs ๋ฐฉ์‹์œผ๋กœ ํ’€์–ด๋ณธ๋‹ค๋ฉด n ํ€ธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

     

     

    ๋ฐฑ์ค€ 9663 N-Queen

    ๋ฐฑ์ค€ ๋ฌธ์ œ๋ฅผ ํ’€๊ณ  ์™”๋‹ค..

    2์ฐจ์› ๋ฐฐ์—ด๋กœ ํ’€ ์ˆ˜ ์žˆ์„ ์ค„ ์•Œ์•˜๋Š”๋ฐ ์ƒ๊ฐ์ฒ˜๋Ÿผ ์ž˜ ์•ˆ๋๋‹ค. ๊ตฌ๊ธ€์— ๊ฒ€์ƒ‰ํ•ด๋ณด๋‹ˆ ์•„๋‹ˆ ์ด๋Ÿด์ˆ˜๊ฐ€..๋‹ค๋“ค 1์ฐจ์› ๋ฐฐ์—ด๋กœ ํ•ด๊ฒฐํ•˜๋‹ค๋‹ˆ ์ด๋ž˜์„œ ์–ด๋ฆด๋•Œ ์‹ฑํฌ๋น…์„ ํ–ˆ์–ด์•ผ..

    1 ์ฐจ์› ๋ฐฐ์—ด๋กœ ํ‘œํ˜„

    //1์ฐจ์› ๋ฐฐ์—ด
    int[] board = new int[N];

    1์ฐจ์› ๋ฐฐ์—ด๋กœ ์–ด๋–ป๊ฒŒ ํ‘œํ˜„ํ•˜๋ƒ ํ•˜๋ฉด, ๊ฐ ์ธ๋ฑ์Šค๊ฐ€ row ๋กœ ์น˜๋Š”๊ฑฐ๋‹ค.

    ์•ž์„œ ๋งํ–ˆ๋“ฏ์ด, N queen์˜ ์ œ์•ฝ ์กฐ๊ฑด์—์„œ ํ•œ row์— ํ•˜๋‚˜์˜ ํ€ธ๋งŒ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ ๋งํ•˜์ž๋ฉด ๋ชจ๋“  row์—๋Š” ํ•˜๋‚˜์˜ ํ€ธ์ด ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— 1์ฐจ์› ๋ฐฐ์—ด๋กœ ํ‘œํ˜„ํ•˜๋ฉด index๊ฐ€ ํ€ธ์˜ row๊ณ , ๋‚ด์šฉ๋ฌผ์ด column์˜ ์œ„์น˜๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค.

    index (row) 0 1 2 3 4 5 6
    column y0 y1 y2 y3 y4 y5 y6

    ์œ„ ํ…Œ์ด๋ธ”์„ ๋ณด๋ฉด ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.

    ์˜ˆ๋ฅผ๋“ค์–ด, board[2] = 3์ด๋ผ๋ฉด, x = 2, y = 3 ์ธ (2,3) ์— ํ€ธ์ด ์กด์žฌํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์†Œ๋ฆฌ๋‹ค!

    DFS

    private static void dfs(int row) {
    if(row == N) {//๋๊นŒ์ง€ ๋„์ฐฉ
    answer++;
    return;
    }
    for(int i = 0 ; i<N ;i ++) {
    board[row] = i; //row ๊ฐ€ 1์ด๋ผ๋ฉด, ํ€ธ์„ i ๋ฒˆ์งธ column์— ์œ„์น˜์‹œ์ผœ๋ณด๊ณ  ๋‘˜ ์ˆ˜ ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ํŒ๋‹จ
    if(check(row)) {//ํ•ด๋‹น row์— ๋†“์€ col ์ •๋ณด๊ฐ€ ๊ดœ์ฐฎ์€๊ฐ€..
    dfs(row+1); //๋‹ค์Œ row์— ๋†“์Œ
    }
    //else : ๋‹ค์‹œ col ์„ ์ •ํ›„ ๋ฐ˜๋ณต
    }
    }

    ์œ„ ์ฝ”๋“œ๋Š” dfs์ฝ”๋“œ์ด๋‹ค.

    ๋จผ์ €, for loop๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, column ์œ„์น˜๋ฅผ ์ •ํ•œ๋‹ค

    for(int i = 0 ; i<N ;i ++){
    board[row]=i;
    }

    ์œ„ ์ฝ”๋“œ๊ฐ€ column์„ ์„ค์ •ํ•˜๊ฒŒ ํ•ด์ค€๋‹ค.

    if(check(row)) {//ํ•ด๋‹น row์— ๋†“์€ col ์ •๋ณด๊ฐ€ ๊ดœ์ฐฎ์€๊ฐ€..
    dfs(row+1); //๋‹ค์Œ row์— ๋†“์Œ
    }

    ์œ„ ์ฝ”๋“œ๋Š”, ํ•ด๋‹น row์— ๋ฐฉ๊ธˆ ๋Œ€์ž…ํ•œ column๊ฐ’์ด ๊ดœ์ฐฎ์€์ง€ ์•„๋‹Œ์ง€ ํ™•์ธํ•˜๋Š” ๋ฉ”์„œ๋“œ๋กœ ํ˜ธ์ถœํ•œ ํ›„ ๋งŒ์ผ ๊ดœ์ฐฎ๋‹ค๋ฉด ๋‹ค์Œ row๋กœ ๋„˜์–ด๊ฐ€๋Š” ์ฝ”๋“œ์ด๋‹ค.

    ์ฆ‰, (0,0) ์ด validation check์—์„œ ํŒจ์Šคํ–ˆ๋‹ค๋ฉด, ๋‹ค์Œ (1,y) ์ขŒํ‘œ๋ฅผ ๊ตฌํ•  ๊ฒƒ์ด๋‹ค.

    ์ฐธ๊ณ ๋กœ, check method๋Š” ์•ž์„œ ๋งํ•œ ๋Œ€๊ฐ์„ ๊ณผ column์„ ํ™•์ธํ•˜๋Š” ์ž‘์—…์„ ํ•œ๋‹ค.

    private static boolean check(int row) {
    for(int i = 0 ; i< row ;i ++) {
    if(board[i] == board[row])return false;
    //๋Œ€๊ฐ์„  :row, col
    if(Math.abs(i-row)== Math.abs(board[row]-board[i])) return false;
    }
    return true;
    }

    if(board[i] == board[row]) ๋Š” ํ•ด๋‹น ์—ด ์ „๊นŒ์ง€๋งŒ ํƒ์ƒ‰ํ•˜๋Š”๋ฐ (ํ•ด๋‹น ์—ด๊นŒ์ง€๋งŒ column์„ ์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—), ๊ฐ™์€ ํ–‰์— ์ด๋ฏธ ํ€ธ์ด ์กด์žฌํ•˜๋ฉด ํ€ธ์„ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์—†๋‹ค.

    ๋Œ€๊ฐ์„  ์ฝ”๋“œ๋Š” ์œ„์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ ๊ณผ ๊ฐ™์ด ์ด๋“ฑ๋ณ€ ์‚ผ๊ฐํ˜• ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•˜์—ฌ true์ธ์ง€ false์ธ์ง€ ๋ฆฌํ„ดํ•ด์ฃผ์—ˆ๋‹ค.

    ์œ„ check ์ฝ”๋“œ์—์„œ true๊ฐ€ ๋‚˜์˜ค๋ฉด, ์žฌ๊ท€๋ฅผ ํ†ตํ•ด ๋‹ค์Œ row๋กœ ๊ฐ€๊ฒŒ ๋œ๋‹ค. 

    ์ด๋ ‡๊ฒŒ row๊ฐ€ N ๊นŒ์ง€ ๋„์ฐฉํ•˜๊ฒŒ ๋˜๋ฉด answer ๊ฐ€ ์ฆ๊ฐ€ํ•˜๊ณ  ๋‹ค๋ฅธ ์ขŒํ‘œ๋กœ ์žฌํƒ์ƒ‰ ์‹œ์ž‘ํ•œ๋‹ค.

     

    ์ „์ฒด ์†Œ์Šค ์ฝ”๋“œ

    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    /**
    * @author June Park
    * @date 11/08/2021
    * N-Queen Problem
    * on NxN chessboard, find #sols of n queen
    * */
    public class BOJ_9663_N_Queen {
    static int [] board; //๊ฐ row ๋งˆ๋‹ค ํ€ธ์„ ๋†“์€ ์ธ๋ฑ์Šค ์ €์žฅ
    static int N , answer;
    public static void main(String[] args) throws Exception{
    BufferedReader br= new BufferedReader (new InputStreamReader (System.in));
    N = Integer.parseInt(br.readLine());
    board = new int [N]; //board[row] = col -> row ๋งˆ๋‹ค ํ•˜๋‚˜์˜ ํ€ธ์„ ๋†“์„ ์ˆ˜ ์žˆ์Œ. board[1] = 1๋ฒˆ์งธ row์˜ ํ€ธ์„ ๋ช‡col์— ๋‘์—ˆ๋Š”์ง€ ์ €์žฅํ•œ๋‹ค
    answer = 0;
    dfs(0);
    System.out.println(answer);
    }
    /**
    * */
    private static void dfs(int row) {
    if(row == N) {//๋๊นŒ์ง€ ๋„์ฐฉ
    answer++;
    return;
    }
    for(int i = 0 ; i<N ;i ++) {
    board[row] = i; //row ๊ฐ€ 1์ด๋ผ๋ฉด, ํ€ธ์„ i ๋ฒˆ์งธ column์— ์œ„์น˜์‹œ์ผœ๋ณด๊ณ  ๋‘˜ ์ˆ˜ ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ํŒ๋‹จ
    if(check(row)) {//ํ•ด๋‹น row์— ๋†“์€ col ์ •๋ณด๊ฐ€ ๊ดœ์ฐฎ์€๊ฐ€..
    dfs(row+1); //๋‹ค์Œ row์— ๋†“์Œ
    }
    //else : ๋‹ค์‹œ col ์„ ์ •ํ›„ ๋ฐ˜๋ณต
    }
    }
    /**
    * ํ˜„์žฌ ์œ„์น˜์— queen ์ด ๊ฐˆ ์ˆ˜ ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ํ™•์ธ
    * 1. ํ€ธ์ด ๊ฐ™์€ col์— ์žˆ๋Š” ๊ฒฝ์šฐ : board[row] = col ์—์„œ ์ขŒํ‘œ๋Š” row, col
    * board[row] ์™€ board[i] ๋ฅผ ๋น„๊ตํ•˜๋ฉด ๋™์ผํ•œ ์นผ๋Ÿผ์— ์œ„์น˜ํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Œ
    *
    * 2. ๋Œ€๊ฐ์„ ์— ์กด์žฌ ?
    * abs(queen.col - curr.col) == abs(queen.row - curr.row) ๋ฉด ๋Œ€๊ฐ์„ ์ƒ์— ์žˆ์Œ
    * */
    private static boolean check(int row) {
    // ๊ฐ™์€ column์ธ์ง€ ํŒ๋‹จ : board[i] : dfs ๋ฉ”์„œ๋“œ์—์„œ board[row] = col ๋กœ ์ดˆ๊ธฐํ™” ์‹œ์ผœ์คฌ์Œ.
    // board[n] ์€ column ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ์Œ. board[i]==board[row] ๊ฐ™์€ column
    for(int i = 0 ; i< row ;i ++) {
    if(board[i] == board[row])return false;
    //๋Œ€๊ฐ์„  :row, col
    if(Math.abs(i-row)== Math.abs(board[row]-board[i])) return false;
    }
    return true;
    }
    }

     

     

    Reference:

    https://www.codesdope.com/course/algorithms-backtracking/


    ํŒจ์ŠคํŠธ์บ ํผ์Šค ํ™˜๊ธ‰ ์ฑŒ๋ฆฐ์ง€ ๋ฐ”๋กœ๊ฐ€๊ธฐ๐Ÿ‘‰ https://bit.ly/3FVdhDa

     

    ์ˆ˜๊ฐ•๋ฃŒ 100% ํ™˜๊ธ‰ ์ฑŒ๋ฆฐ์ง€ | ํŒจ์ŠคํŠธ์บ ํผ์Šค

    ๋”ฑ 5์ผ๊ฐ„ ์ง„ํ–‰๋˜๋Š” ํ™˜๊ธ‰์ฑŒ๋ฆฐ์ง€๋กœ ์ˆ˜๊ฐ•๋ฃŒ 100% ํ™˜๊ธ‰๋ฐ›์œผ์„ธ์š”! ๋” ๋Šฆ๊ธฐ์ „์— ์ž๊ธฐ๊ณ„๋ฐœ ๋ง‰์ฐจ ํƒ‘์Šน!

    fastcampus.co.kr

    ๋ณธ ํฌ์ŠคํŒ…์€ ํŒจ์ŠคํŠธ์บ ํผ์Šค ํ™˜๊ธ‰ ์ฑŒ๋ฆฐ์ง€ ์ฐธ์—ฌ๋ฅผ ์œ„ํ•ด ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

    728x90
    ๋ฐ˜์‘ํ˜•

    ๋Œ“๊ธ€