ํ”ผ๋“œ๋ฐฑ&ํšŒ๊ณ /Weekly Feedback

2023๋…„ 4์›” 4์ฃผ์ฐจ ์ฃผ๊ฐ„ํšŒ๊ณ 

์ฑ”๐Ÿป 2024. 1. 24. 20:07

Time tracker

๊ตฌ๋ถ„๋ชฉํ‘œ์‹œ๊ฐ„์‚ฌ์šฉ์‹œ๊ฐ„๋‹ฌ์„ฑ๋ฅ %์›์ธ๋ถ„์„๋‹ค์Œ ์ฃผ์— ์ ์šฉํ•  ๊ฒƒ
๐Ÿง˜โ€โ™€๏ธ์˜์ -7-
โœ๏ธ์ง€์ 8271.587%- ์ˆ˜๋‹ค๋กœ ๋‚ญ๋น„ํ•œ ์‹œ๊ฐ„๋งŒ ์ผ์ฃผ์ผ ํ•ฉ์ณ์„œ 4.5์‹œ๊ฐ„
+) ๊ธฐํƒ€์‹œ๊ฐ„๋„ ๋งŽ์•˜๋‹ค.(์‹ค๊ธ‰ ๊ด€๋ จ์œผ๋กœ๋„ 4์‹œ๊ฐ„ ์“ฐ๊ณ ,,)
- ์‹์‚ฌ 30๋ถ„์ปท : ํƒ€์ด๋จธ ๋งž์ถฐ์„œ ๋ฐฅ 20๋ถ„ ์ปทํ•˜๊ณ  ๋‚จ์€ 10๋ถ„์€ ์–‘์น˜ํ•˜๊ณ  ์ •๋ฆฌํ•˜๊ณ  ๋‚ด๋ ค๊ฐ€๊ธฐ
- ์ฐจ์ฃผ๋ถ€ํ„ฐ๋Š” ์ˆ˜๋‹ค๋–ค์‹œ๊ฐ„ ๋‚ญ๋น„์‹œ๊ฐ„์œผ๋กœ ์ฒดํฌ
์‚ฌํšŒ์ 16.5650%2์‹œ๊ฐ„์€ 4๊ธฐ๋ถ„๋“ค ๋„์›€๋“œ๋ฆฐ ๊ฒƒ!
4.5์‹œ๊ฐ„์€ ์ˆ˜๋‹ค๋กœ ๋‚ญ๋น„๐Ÿฅฒ
๐Ÿƒโ€โ™€๏ธ์‹ ์ฒด์ -0.5-ํ•œ ๋ฒˆ์ด๋ผ๋„ ํ–ˆ๋„ค ์ž˜ ํ–ˆ์–ด ํ•˜ํ•ณ
๐ŸŒ”์ž 4949100%
๐Ÿงน๊ธฐํƒ€2840143%์ด๋ฒˆ ์ฃผ๋Š” ์œ ๋… ๊ธฐํƒ€์‹œ๊ฐ„์ด ๋งŽ์•˜๋„ค..์ •์ƒ์ ์ธ ๋‚ ์ด๋ฉด ๊ธฐํƒ€์‹œ๊ฐ„ 3.5์—ฌ์•ผ ํ•จ

์‹œ๊ฐ„๊ธฐ๋ก

Weekly Feedback

  • table
    ์ด๋ฒˆ ์ฃผ ๋ชฉํ‘œ์ด๋ฒˆ ์ฃผ ๊ฒฐ๊ณผ
    1. Java ๋ณต์Šต
    ๋ชฉํ‘œ : 6, 7, 8, 10, 11์žฅ ๋ฐฑ์ง€ ๋ณต์Šต(๋งค์ผ ํ•œ ์ฑ•ํ„ฐ์”ฉ)
    ์‹œ๊ฐ„ : ์˜ค์ „ 7์‹œ 20๋ถ„~7์‹œ 40๋ถ„


    2. CSS
    - 1์ผ 1w3schools(how to ๋ถ„์„ - ์ฃผ์„๋‹ฌ๊ณ  ํ•ต์‹ฌ ์ •๋ฆฌํ•˜๊ธฐ)
    1. Java ๋ณต์Šต : ๋‹ฌ์„ฑ๋ฅ  100%


    2. CSS : ๋‹ฌ์„ฑ๋ฅ  100%


๊ธˆ์ฃผ์— ํ•™์Šตํ•œ ๊ฒƒ๋“ค

Spring

์Šคํ”„๋ง์˜ ์ •์„ Ch1~Ch2.21

๐Ÿ˜ŽCh1. 01 Spring ์‹œ์ž‘ํ•˜๊ธฐ

Ch2. 02 Spring MVC

์Šคํ”„๋ง ๋ฐฐ์šด์ง€ ์ผ์ฃผ์ผ์€ ๋œ ๊ฒƒ ๊ฐ™์€๋ฐ ์ˆ˜์—… 3์ผ๋ฐ–์— ์•ˆ ํ–ˆ๊ตฌ๋‚˜ ํ•˜๋ฃจ๊ฐ€ ์ผ์ฃผ์ผ๊ฐ™๋‹ค ์š”์ฆ˜

  • ํŒจํ‚ค์ง•

    ๋‚ด๊ฐ€ ๋งŒ๋“  ํ”„๋กœ๊ทธ๋žจ์„ ๋ฐฐํฌํ•ด์•ผ ์„œ๋น„์Šค๊ฐ€ ๊ฐ€๋Šฅํ•œ๋ฐ, ์ด๋•Œ ํŒŒ์ผ์„ ํ•˜๋‚˜๋กœ ๋‹ค ๋ฌถ์–ด์„œ ์ค˜์•ผ ํ•œ๋‹ค.

    • war : web archive
    • jar : java archive
  • Base64 : ์ด๋Ÿฐ ๊ฑด ์›น ๊ธฐ๋ณธ์ž„. ์ž˜ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • ๋นŒ๋“œ๋„๊ตฌ : ํŒจํ‚ค์ง•, ์˜์กด์„ฑ ๊ด€๋ฆฌ(๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)
    1. Maven : ์„ค์ • ํŒŒ์ผ ์ƒ์† ๊ฐ€๋Šฅ

      pom.xml : ๋ฉ”์ด๋ธ ์„ค์ • ํŒŒ์ผ

      pom.xml ์ˆ˜์ • ์‹œ ๋ฉ”์ด๋ธ ์—…๋ฐ์ดํŠธ ํ•ด์•ผ ํ•œ๋‹ค.

      ๋‚ด ํ”„๋กœ์ ํŠธ์— ์–ด๋–ค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋ฉด ์ €์žฅ์†Œ์— ๊ฐ€์„œ ํƒœ๊ทธ๋ฅผ pom.xml์— ๋„ฃ๋Š”๋‹ค. ๊ทธ๋Ÿผ ์ธํ„ฐ๋„ท์—์„œ ์ง€๊ฐ€ ์•Œ์•„์„œ ๊ฐ€์ง€๊ณ  ์˜ด. ๋‚˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒ„์ „๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด๋จ. ์ด๋Ÿฐ ๊ฑธ ์˜์กด์„ฑ. ๋””ํŽœ๋˜์‹œ ๊ด€๋ฆฌ๋ผ๊ณ  ํ•œ๋‹ค.

    1. Gradle : ์„ค์ • ํŒŒ์ผ ์ƒ์† ๋ถˆ๊ฐ€๋Šฅ
  • ์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ
    • target : src์˜ ๊ฒฐ๊ณผ๋ฌผ
    • ์†Œ์Šค๋Š” java์™€ resources๊ฐ€ ์žˆ๋‹ค.
    • web.xml : ํ†ฐ์บฃ ์„ค์ • ํŒŒ์ผ
    • ์Šคํ”„๋ง ์„ค์ • ํŒŒ์ผ

JS

์นด๋“œ๊ฒŒ์ž„ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

  • cardGame.html ์ „์ฒด ์ฝ”๋“œ
    <!DOCTYPE html>
    
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <style>
            img {
                width: 120px;
                height: 180px;
                cursor: pointer;
    
                transition: transform 1s ease;
            }
    
            img:hover {
                transform: translateY(-30px);
                outline: black solid 1px;
            }
    
            #pairDiv, span {
                background-color: greenyellow;
                width: 30%;
                margin-top: 10px;
                font-size: 20px;
            }
    
            .matched {
                opacity: 0.3;
            }
        </style>
    
    </head>
    
    <body>
        <div>
            <button id="btnShow">show</button>
            <button id="btnHide">hide</button>
            <button id="btnShuffle">shuffle</button>
            <button id="hint">ํžŒํŠธ</button>
        </div>
        <div id="pairDiv">
            ๋‚จ์€ pair์˜ ๊ฐœ์ˆ˜ : <span id="pairsLeft"></span>
        </div>
        <br><br>
        <div id="board">
            <!-- ์นด๋“œ๋ฅผ ๋ณด์—ฌ์ค„ ๊ณณ -->
        </div>
        
        <script>
            const NUMBER_OF_CARDS = 52; // ์นด๋“œ์˜ ์ด ๊ฐœ์ˆ˜
            const NUMBER_OF_HINTS = 2;  // ํžŒํŠธ๋กœ ๋ณด์—ฌ์ค„ ์นด๋“œ์˜ ๊ฐœ์ˆ˜
            const NUMBER_OF_RANKS = 13; 
    
            const btnShow = document.getElementById('btnShow');
            const btnHide = document.getElementById('btnHide');
            const btnShuffle = document.getElementById('btnShuffle');
    
    
            const btnHint = document.getElementById('hint');
            const pairsLeft = document.getElementById('pairsLeft');
    
            let cardArr = new Array(NUMBER_OF_CARDS);
    
            window.onload = function () { // main ๋ฉ”์„œ๋“œ
                initGame(); // ๊ฒŒ์ž„ ์ดˆ๊ธฐํ™”
                startGame(); // ๊ฒŒ์ž„ ์‹œ์ž‘
            }
    
            // show ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์นด๋“œ๋ฅผ ์ „๋ถ€ ๋ณด์—ฌ์ค€๋‹ค.
            btnShow.onclick = function() { flipAllCards(cardArr, false); };
            // hide ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์นด๋“œ๋ฅผ ์ „๋ถ€ ์ˆจ๊ธด๋‹ค.
            btnHide.onclick = function() { flipAllCards(cardArr, true); };
    
            btnShuffle.onclick = function() {
                initGame(cardArr);
                startGame(cardArr);
            };
    
            btnHint.onclick = showHint;
    
            const A = 1;
            const J = 11
            const Q = 12;
            const K = 13;
    
            const DIAMOND = 1;
            const CLOVER = 2;
            const HEART = 3;
            const SPADE = 4;
            
            function Card(number, suit) {
                //TODO suit๋ž‘ number ์ง€์—ญ๋ณ€์ˆ˜ํ™”ํ•˜๊ธฐ
                this.number = number;
                this.suit = suit;
                this.isFront = true; // ํ˜„์žฌ ์นด๋“œ๊ฐ€ ์•ž๋ฉด์ธ์ง€๋ฅผ ํ™•์ธํ•˜๋Š” ๋ณ€์ˆ˜
                this.isPaired = false; // pair ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋Š” ๋ณ€์ˆ˜
            }
    
            Card.prototype.toString = function() {
                let suit = "";
                let number = "";
    
                switch (this.suit) {
                    case 1: suit = "โ—†"; break;
                    case 2: suit = "โ™ง"; break;
                    case 3: suit = "โ™ก"; break;
                    case 4: suit = "โ™ "; break;
                    default:
                }
    
                switch (this.number) {
                    case 1:  number = "A"; break;
                    case 11: number = "J"; break;
                    case 12: number = "Q"; break;
                    case 13: number = "K"; break;
                    default: number = this.number + "";
                }
    
                return suit + number;
            }
    
            // ์นด๋“œ์˜ ์•„์ด๋””(number + "" + suit)๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
            Card.prototype.getId = function() {
                return this.number + "" + this.suit;
            }
    
            // ๊ฒŒ์ž„ ์ดˆ๊ธฐํ™”
            function initGame() {
                // 1. card๋ฅผ ๋‹ด์„ ๋ฐฐ์—ด์„ ๋งŒ๋“ ๋‹ค.
                
                // 2. ๋ฐฐ์—ด์„ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
                initCard(cardArr);
                
                // 3. ๋ฐฐ์—ด์„ ์„ž๋Š”๋‹ค.
                shuffleCard(cardArr);
    
                // 4. ์นด๋“œ๋ฅผ div#board์— ๋ณด์—ฌ์ค€๋‹ค.
                showCard(cardArr);
    
                // 5. ๊ฐ ์นด๋“œ์— ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ๋“ฑ๋กํ•œ๋‹ค.
                let imgArr = document.getElementsByTagName("img");
    
                for (let i = 0; i < imgArr.length; i++) {
                    imgArr[i].onclick = cardClick;
                }
    
                // 6. ๋‚จ์€ pair์˜ ๊ฐœ์ˆ˜ ์ดˆ๊ธฐ๊ฐ’ ๋ณด์—ฌ์ฃผ๊ธฐ
                pairsLeft.innerHTML = NUMBER_OF_CARDS / 2;
            }
    
            function startGame() {
                // ์นด๋“œ ์ „๋ถ€๋ฅผ ๋’ท๋ฉด ๋ณด์—ฌ์ค€๋‹ค.
                flipAllCards(cardArr, true);
            }
    
            // ์นด๋“œ ๋ฐฐ์—ด์„ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
            function initCard(cardArr) {
                let suitChk = 1;
                let numberChk = 1;
    
                for (let i = 0; i < NUMBER_OF_CARDS; i++) {
                    cardArr[i] = new Card(numberChk++, suitChk++);
    
                    if (suitChk > 4) suitChk = 1; // ๋‹ค์ด์•„๋ชฌ๋“œ(โ—†) = 4 ๊ทธ๋ฆผ ์นด๋“œ๊นŒ์ง€ ๋งŒ๋“ค์—ˆ์„ ๊ฒฝ์šฐ ๋‹ค์‹œ ์ŠคํŽ˜์ด๋“œ(โ™ ) = 1 ์นด๋“œ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด 1๋กœ ๋ณ€๊ฒฝ
                    if (numberChk > 13) numberChk = 1; // K(13)๊นŒ์ง€ ์นด๋“œ๋ฅผ ๋งŒ๋“ค์—ˆ์„ ๊ฒฝ์šฐ ๋‹ค์‹œ A(1)๋ฅผ ๋„ฃ์–ด์ฃผ๊ธฐ ์œ„ํ•ด 1๋กœ ๋ณ€๊ฒฝ
                }
    
                // ๊ธฐ๋ณธ ์ •๋ ฌ
                cardArr.sort(cardDefaultSortComparator);
            }
    
            // ๋‘ ์นด๋“œ์˜ ์ง์ด ์ผ์น˜ํ•˜๋Š”์ง€ ์ฒดํฌํ•œ๋‹ค.
            function checkPair(twoCards) {
                return twoCards[0].number == twoCards[1].number && Math.abs(twoCards[0].suit - twoCards[1].suit);
            }
    
            // ๋‚จ์€ pair์˜ ๊ฐœ์ˆ˜ update
            function updatePairsLeft() {
                // ๋‚จ์€ pair์˜ ๊ฐœ์ˆ˜ ๊ตฌํ•˜๋Š” ๋ฒ• = getBackCardIndexArr ํ•ด์„œ ๊ฐ€์ ธ์˜จ ๋ฐฐ์—ด์˜ length / 2ํ•˜๋ฉด ๋จ
    
                const leftCardIndexArr = getLeftCardIndexArr();
                pairsLeft.innerHTML = leftCardIndexArr.length / 2;
    
                // ๋‚จ์€ ์นด๋“œ์˜ ๊ฐœ์ˆ˜๊ฐ€ 1๊ฐœ ์ดํ•˜๋ฉด ๋‹ค์‹œํ•˜๊ฒ ๋ƒ๊ณ  ๋ฌผ์–ด๋ณด๊ณ  Y๋ฉด shuffle N์ด๋ฉด๊ธฐ๋๋‚ด๊ธฐ
                if (leftCardIndexArr.length < 1) {
                    // ๊ฑ ๋ฌผ์–ด๋ณด์ง€ ๋ง๊ณ  1๊ฐœ ์ดํ•˜๋ฉด ์นด๋“œ ๋‹ค ์ง€์šฐ๊ณ  ๋‹ค์‹œํ•˜๊ธฐ ๋ฒ„ํŠผ์ด๋ž‘ ์‹œ๋„ ํšŸ์ˆ˜ ๋ณด์—ฌ์ฃผ๊ธฐ
                    if (confirm("์„ฑ๊ณต. ๊ฒŒ์ž„์„ ์ข…๋ฃŒํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? | ๊ฒŒ์ž„ ์ข…๋ฃŒ = ํ™•์ธ | ์žฌ์‹œ๋„ = ์ทจ์†Œ")) {
                        alert("๊ฒŒ์ž„ ์ข…๋ฃŒ");
                    } else {
                        btnShuffle.onclick();
                    }
                }
            }
    
            // ๋งค์น˜ ์—ฌ๋ถ€๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค.
            function updateIsPaired(cards, isPaired) {
                let card;
                for (let i = 0; i < cards.length; i++) {
                    card = cards[i];
    
                    document.getElementById(card.getId()).classList.add("matched");
                    card.isPaired = isPaired;
                }
            }
    
            // ์นด๋“œ ํด๋ฆญ ์‹œ ๋ฐœ์ƒ๋˜๋Š” ์ด๋ฒคํŠธ
            function cardClick() {
                // ์นด๋“œ๋ฅผ ์ฐพ๋Š”๋‹ค.
                const card = findCard(this);
    
                // 1. ์นด๋“œ๊ฐ€ ์•ž๋ฉด์ธ์ง€ ํ™•์ธํ•œ๋‹ค.
                if (isFront(card)) 
                    // 1-1. ์•ž๋ฉด์ด๋ฉด return
                    return;
    
                // 1-2. ๋’ท๋ฉด์ด๋ฉด ๋’ค์ง‘๋Š”๋‹ค.
                flip(card);
    
                // 2. ๋’ค์ง‘์€ ์นด๋“œ๊ฐ€ 2์žฅ์ธ๊ฐ€?
                const chkTwoCards = checkFrontCardCountTwo();
                if (chkTwoCards) {
                    // 2-1. ๋‘ ์นด๋“œ์˜ ์ง์ด ์ผ์น˜ํ•˜๋Š”์ง€ ์ฒดํฌํ•œ๋‹ค.
                    if (checkPair(chkTwoCards)) {
                        // 2-2. ์ผ์น˜ํ•˜๋ฉด ๊ณ„์† ์ง„ํ–‰ํ•œ๋‹ค.
                        // pair์ธ ์นด๋“œ๋“ค์˜ isMatched = true๋กœ ๋ณ€๊ฒฝ
                        updateIsPaired(chkTwoCards, true);
                        // ๋‚จ์€ pair์˜ ๊ฐœ์ˆ˜ ๋ณ€๊ฒฝํ•ด์ฃผ๊ธฐ
                        updatePairsLeft();
    
                    } else {
                        // 2-3. ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด ํด๋ฆญํ–ˆ๋˜ ์นด๋“œ๋“ค์„ ๋‹ค์‹œ ๋’ค์ง‘๋Š”๋‹ค.
                        setTimeout(function() {
                            flipAllCards(chkTwoCards, true);
                        }, 600);
                    }
                } 
            }
    
            // ๊ธฐ๋ณธ ์ •๋ ฌ - 1์ˆœ์œ„ suit 2์ˆœ์œ„ ์ˆซ์ž
            function cardDefaultSortComparator(c, c2) {
                if (c.suit == c2.suit) {
                    return c.number - c2.number;
                } else {
                    return c.suit - c2.suit;
                }
            }
            
            // ์นด๋“œ๋ฅผ ์„ž๋Š”๋‹ค. 
            function shuffleCard(cardArr) {
                cardArr = cardArr.sort(() => Math.random() - 0.5);
            }
    
            // ์นด๋“œ๋ฅผ div#board์— ๋ณด์—ฌ์ค€๋‹ค.
            function showCard(cardArr) {
                // ์ด๋ฏธ์ง€ ํŒŒ์ผ๋ช… ๊ตฌํ•ด์˜ค๋Š” ๊ณต์‹ = (number - 1) + (suit - 1) * 13
    
                let c;
                let result = "";
                // 1. ์นด๋“œ์˜ ๊ฐœ์ˆ˜๋งŒํผ ๋ฐ˜๋ณต๋ฌธ ๋Œ๋ฆฐ๋‹ค.
                for (let i = 0; i < NUMBER_OF_CARDS; i++) {
                    // 2. ์นด๋“œ ๊ฐ์ฒด๋ฅผ ํ•˜๋‚˜ ๊ฐ€์ ธ์™€์„œ <img src="${(c.number - 1) + (c.suit - 1) *13}.png">
                    c = cardArr[i]; 
                    // 3. ์œ„์˜ ๊ฒฐ๊ณผ๋ฅผ result ๋ฌธ์ž์—ด์— ์ง‘์–ด๋„ฃ์€ ๋’ค
                    // ์ฒ˜์Œ์— ์นด๋“œ 10์ดˆ๊ฐ„ ๋ณด์—ฌ์ฃผ๊ณ  gameStart()์—์„œ hideํ•˜์ž
                    result += `<img src="${(c.number - 1) + (c.suit - 1) * NUMBER_OF_RANKS}.png" id=${c.getId()} data-number="${c.number}" data-suit=${c.suit} data-isFront=true>`;
                    // 12๊ฐœ๊ฐ€ ํ•œ์ค„ = ๋งŒ์•ฝ i๊ฐ€ 12๋ผ๋ฉด brํƒœ๊ทธ ๋„ฃ์–ด์ฃผ๊ธฐ
                    if ((i + 1) % 13 == 0) {
                        result+= `<br>`;
                    }
                }
                // 4. div#board์— innerHTML๋กœ ๋„ฃ์–ด์ค€๋‹ค.
                document.getElementById('board').innerHTML = result;
    
            }
    
            // card๊ฐ€ ์•ž๋ฉด์ด๋ฉด true ์•„๋‹ˆ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜
            // card๋Š” Card ๊ฐ์ฒด๊ฐ€ ๋“ค์–ด์™€์•ผ ํ•œ๋‹ค.
            function isFront(card) {
                return card.isFront;
            }
    
            // ์นด๋“œ๋ฅผ ๋’ค์ง‘๋Š”๋‹ค.
            function flip(card, isFront) {
                // 1. ์นด๋“œ๊ฐ€ ์•ž๋ฉด์ธ์ง€ ํ™•์ธํ•œ๋‹ค. +) hide์‹œ์— pair๋œ ์นด๋“œ๋“ค์€ ์—ฌ์ ผํžˆ ๋ณด์—ฌ์ ธ์•ผ ํ•œ๋‹ค.
                if (isFront && !card.isPaired) {
                    // 1-1. ์•ž๋ฉด(๊ทธ๋ฆผ)์ด๋ฉด ๋’ท๋ฉด(๋†๋‹ด๊ณฐ)์„ ๋ณด์—ฌ์ค€๋‹ค.
                    showBack(card);
                } else {
                    // 1-2. ๋’ท๋ฉด(๋†๋‹ด๊ณฐ)์ด๋ฉด ์•ž๋ฉด(๊ทธ๋ฆผ์„ ๋ณด์—ฌ์ค€๋‹ค.)
                    showFront(card);
                }
            }
            
            // ์นด๋“œ์˜ ์•ž๋ฉด์„ ๋ณด์—ฌ์ค€๋‹ค.
            function showFront(card) {
                let cardImg = document.getElementById(card.getId());
        
                cardImg.src = `${(card.number - 1) + (card.suit - 1) *13}.png`;
                card.isFront = true;
            }
            
            // ์นด๋“œ์˜ ๋’ท๋ฉด(๋†๋‹ด๊ณฐ)์„ ๋ณด์—ฌ์ค€๋‹ค.
            function showBack(card) {
                let cardImg = document.getElementById(card.getId());
                
                cardImg.src = 'bear.png';
                card.isFront = false;
            }
    
            // ์นด๋“œ๋ฅผ ๋ชจ๋‘ ๋’ค์ง‘๋Š”๋‹ค.
            function flipAllCards(cardArr, isFront) {
                // ์นด๋“œ์˜ ์ด ๊ฐœ์ˆ˜๋งŒํผ ๋ฐ˜๋ณต๋ฌธ ๋Œ๋ฉด์„œ flip(card)๋ฅผ ํ˜ธ์ถœ
                for (const card of cardArr) {
                    flip(card, isFront);
                }
            }
    
            // ๋’ค์ง‘ํ˜€์žˆ๋Š” ์นด๋“œ์˜ ๊ฐœ์ˆ˜๊ฐ€ 2์žฅ์ธ์ง€ ์ฒดํฌํ•œ๋‹ค. 
            function checkFrontCardCountTwo() {
                // ๋’ค์ง‘ํ˜€์žˆ๋Š” ์นด๋“œ์˜ ์กฐ๊ฑด : isFront = true && isMatched = false
                let returnCards = [];
    
                for (let i = 0; i < NUMBER_OF_CARDS; i++) {
                    let card = cardArr[i];
                    if (card.isFront && !card.isPaired) {
                        returnCards.push(card);
                    }
                }
    
                if (returnCards.length == 2) { // ๋’ค์ง‘ํ˜€์žˆ๋Š” ์นด๋“œ์˜ ๊ฐœ์ˆ˜๊ฐ€ 2๊ฐœ๋ฉด 2์žฅ์˜ ์นด๋“œ๋ฅผ ๋‹ด์€ ๋ฐฐ์—ด๋ฐ˜ํ™˜
                    return returnCards;
                } else { // ์•„๋‹ˆ๋ผ๋ฉด false๋ฐ˜ํ™˜
                    return false;
                }
            }
    
            // carImg ์—˜๋ฆฌ๋จผํŠธ์—์„œ cardArr์ค‘์— ์ผ์น˜ํ•˜๋Š” ์นด๋“œ๋ฅผ ์ฐพ๋Š”๋‹ค.
            function findCard(cardImg) {
                const number = parseInt(cardImg.getAttribute('data-number'));
                const suit = parseInt(cardImg.getAttribute('data-suit'));
    
                for (let i = 0; i < NUMBER_OF_CARDS; i++) {
                    let card = cardArr[i];
                    if (card.number == number && card.suit == suit)
                        return card;
                }
            }
    
            // ๋’ท๋ฉด์ธ ์นด๋“œ๋“ค์˜ index๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. (์ด๋ฏธ ์•ž๋ฉด์ธ ์นด๋“œ๋“ค์€ ์ œ์™ธ)
            function getLeftCardIndexArr() {
                let notFrontCardIndexArr = [];
                for (let i = 0; i < NUMBER_OF_CARDS; i++) {
                    if (!cardArr[i].isPaired)
                        notFrontCardIndexArr.push(i);
                }
    
                return notFrontCardIndexArr;
            }
    
            function getRandom(max, count) {
                // ์ด๊ฑธ Set์œผ๋กœ ๋ฐ”๊พธ๊ณ  frontIndexArr์˜ length๊ฐ€ 2๊ฐ€ ๋  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต๋ฌธ ๋Œ๊ธฐ
                let randomNumArr = new Set();
    
                while (randomNumArr.size < count) {
                    randomNumArr.add(parseInt(Math.random() * max));
                }
                return randomNumArr;
            }
    
            function showHintRandom(cards) {
                // notFrontCardIndexArr์—์„œ ๋žœ๋คํ•œ ์นด๋“œ์˜ index๋ฅผ ๊ฐ€์ ธ์™€์„œ ํ•ด๋‹นํ•˜๋Š” index์˜ ์นด๋“œ์˜ ์•ž๋ฉด์„ ๋ณด์—ฌ์ค€๋‹ค.
                const frontIndexArr = []; // ํžŒํŠธ๋กœ ๋ณด์—ฌ์ค€ card์˜ index๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ณ€์ˆ˜
                const randomNumArr = getRandom(cards.length, NUMBER_OF_HINTS);
    
                for (const random of randomNumArr) {
                    flip(cardArr[cards[random]], false); // ๋žœ๋คํ•œ ์นด๋“œ์˜ ์•ž๋ฉด์„ ๋ณด์—ฌ์ค€๋‹ค.
                    //  [์กฐ๊ฑด2] ๋ณด์—ฌ์ง€๋Š” 2๊ฐœ์˜ ์นด๋“œ๊ฐ€ ๊ฐ™์€ ์นด๋“œ๋ฉด ์•ˆ ๋œ๋‹ค.
                    cards.splice(random, 1);
    
                    frontIndexArr.push(cards[random]);
                }
                
                return frontIndexArr;
            }
    
            // ๋žœ๋คํ•œ 2๊ฐœ์˜ ์นด๋“œ์˜ ์•ž๋ฉด์„ 2์ดˆ๋™์•ˆ ๋ณด์—ฌ์ค€๋‹ค.
            function showHint() {
                //  [์กฐ๊ฑด1] ์ด๋ฏธ ์ง์ด ๋งž์ถฐ์ง„ ์นด๋“œ๋Š” ์ œ์™ธํ•ด์•ผ ํ•œ๋‹ค. - ๋’ท๋ฉด์ธ ์นด๋“œ๋“ค์˜ index๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. (์ด๋ฏธ ์•ž๋ฉด์ธ ์นด๋“œ๋“ค์€ ์ œ์™ธ)
                let backCardIndexArr = getLeftCardIndexArr();
                // ๋’ท๋ฉด์ธ ์นด๋“œ๋“ค ์ค‘์—์„œ ๋žœ๋ค์œผ๋กœ ์•ž๋ฉด์„ ๋ณด์—ฌ์ค€๋‹ค.
                let frontIndexArr = showHintRandom(backCardIndexArr);
    
                // 1์ดˆ ํ›„์— ๋ณด์—ฌ์ฃผ์—ˆ๋˜ 2๊ฐœ์˜ ์นด๋“œ์˜ ๋’ท๋ฉด์„ ๋‹ค์‹œ ๋ณด์—ฌ์ค€๋‹ค.
                btnHint.disabled = true; // ๊ธฐ๋‹ค๋ฆฌ๋Š” 1์ดˆ๋™์•ˆ ๋˜ ํžŒํŠธ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ ์ˆ˜ ์—†๋„๋ก disabled ์ฒ˜๋ฆฌ
                setTimeout(function() {
                    for (let i = 0; i < NUMBER_OF_HINTS; i++) {
                        flip(cardArr[frontIndexArr[i]], true);
                    }
                    btnHint.disabled = false;
                }, 1000);
            }
    
            // from๊ณผ to ๋ฒ”์œ„์˜ ์ •์ˆ˜(int)๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. from๊ณผ to ๋ชจ๋‘ ๋ฒ”์œ„์— ํฌํ•จ๋œ๋‹ค.
            function getRand(from, to) {
                return parseInt(((Math.random() * Math.abs(to-from) + 1))) + Math.min(from, to);
            }
    
        </script>
    </body>
    
    </html>
  1. ๊ธฐ์กด : 1 pair๋งŒ ๋งž์ถ”๋ฉด ๊ฒŒ์ž„ ์ข…๋ฃŒ

    ๋ณ€๊ฒฝ : ๋ชจ๋“  pair ๋งŸ์ถฐ์•ผ ๊ฒŒ์ž„ ์ข…๋ฃŒ

    ๊ธฐ์กด์—๋Š” ํ•œ ์Œ์˜ ์นด๋“œ๋งŒ ๋งž์ถ”๋ฉด ๊ฒŒ์ž„์ด ์ข…๋ฃŒ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, hide์™€ show ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ๋•Œ ๋ชจ๋“  ์นด๋“œ๋ฅผ ์ˆจ๊ธฐ๊ณ  ๋’ค์ง‘๊ธฐ๋งŒ ํ•˜๋ฉด ๋์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด์ œ ๋ชจ๋“  ์นด๋“œ ์Œ์„ ๋งž์ถ”์–ด์•ผ ๊ฒŒ์ž„์ด ์ข…๋ฃŒ๋˜๋„๋ก ์ˆ˜์ •ํ•ด์„œ, ์ด๋ฏธ ๋งž์ถฐ์ง„ ์นด๋“œ ์Œ์ด ์กด์žฌํ•  ๋•Œ show์™€ hide ๊ธฐ๋Šฅ์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

    ๊ทธ๋ž˜์„œ Card ์ƒ์„ฑ์ž ํ•จ์ˆ˜์— isFront๋ฟ๋งŒ ์•„๋‹ˆ๋ผ isPaired๋ผ๋Š” ๊ตฌ๋ถ„๊ฐ’์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค. ์นด๋“œ๋ฅผ ๋’ค์ง‘์„ ๋•Œ ์ด๋ฏธ ๋งค์น˜๋œ ์นด๋“œ๋Š” ๋’ท๋ฉด์„ ๋ณด์—ฌ์ฃผ์ง€ ์•Š๋„๋ก ์ฒ˜๋ฆฌํ–ˆ๋‹ค.

    function Card(number, suit) {
        //TODO suit๋ž‘ number ์ง€์—ญ๋ณ€์ˆ˜ํ™”ํ•˜๊ธฐ
        this.number = number;
        this.suit = suit;
        this.isFront = true; // ํ˜„์žฌ ์นด๋“œ๊ฐ€ ์•ž๋ฉด์ธ์ง€๋ฅผ ํ™•์ธํ•˜๋Š” ๋ณ€์ˆ˜
        this.isPaired = false; // pair ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋Š” ๋ณ€์ˆ˜
    }
    
    // ์นด๋“œ๋ฅผ ๋’ค์ง‘๋Š”๋‹ค.
    function flip(card, isFront) {
        // 1. ์นด๋“œ๊ฐ€ ์•ž๋ฉด์ธ์ง€ ํ™•์ธํ•œ๋‹ค. +) hide์‹œ์— pair๋œ ์นด๋“œ๋“ค์€ ์—ฌ์ ผํžˆ ๋ณด์—ฌ์ ธ์•ผ ํ•œ๋‹ค.
        if (isFront && !card.isPaired) {
            // 1-1. ์•ž๋ฉด(๊ทธ๋ฆผ)์ด๋ฉด ๋’ท๋ฉด(๋†๋‹ด๊ณฐ)์„ ๋ณด์—ฌ์ค€๋‹ค.
            showBack(card);
        } else {
            // 1-2. ๋’ท๋ฉด(๋†๋‹ด๊ณฐ)์ด๋ฉด ์•ž๋ฉด(๊ทธ๋ฆผ์„ ๋ณด์—ฌ์ค€๋‹ค.)
            showFront(card);
        }
    }
  1. ํžŒํŠธ ๊ธฐ๋Šฅ : ๋žœ๋คํ•œ 2๊ฐœ์˜ ์นด๋“œ์˜ ์•ž๋ฉด์„ 2์ดˆ๋™์•ˆ ๋ณด์—ฌ์ค€๋‹ค.
    // ๋žœ๋คํ•œ 2๊ฐœ์˜ ์นด๋“œ์˜ ์•ž๋ฉด์„ 2์ดˆ๋™์•ˆ ๋ณด์—ฌ์ค€๋‹ค.
    function showHint() {
        //  [์กฐ๊ฑด1] ์ด๋ฏธ ์ง์ด ๋งž์ถฐ์ง„ ์นด๋“œ๋Š” ์ œ์™ธํ•ด์•ผ ํ•œ๋‹ค. - ๋’ท๋ฉด์ธ ์นด๋“œ๋“ค์˜ index๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. (์ด๋ฏธ ์•ž๋ฉด์ธ ์นด๋“œ๋“ค์€ ์ œ์™ธ)
        let backCardIndexArr = getLeftCardIndexArr();
        // ๋’ท๋ฉด์ธ ์นด๋“œ๋“ค ์ค‘์—์„œ ๋žœ๋ค์œผ๋กœ ์•ž๋ฉด์„ ๋ณด์—ฌ์ค€๋‹ค.
        let frontIndexArr = showHintRandom(backCardIndexArr);
    
        // 1์ดˆ ํ›„์— ๋ณด์—ฌ์ฃผ์—ˆ๋˜ 2๊ฐœ์˜ ์นด๋“œ์˜ ๋’ท๋ฉด์„ ๋‹ค์‹œ ๋ณด์—ฌ์ค€๋‹ค.
        btnHint.disabled = true; // ๊ธฐ๋‹ค๋ฆฌ๋Š” 1์ดˆ๋™์•ˆ ๋˜ ํžŒํŠธ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ ์ˆ˜ ์—†๋„๋ก disabled ์ฒ˜๋ฆฌ
        setTimeout(function() {
            for (let i = 0; i < NUMBER_OF_HINTS; i++) {
                flip(cardArr[frontIndexArr[i]], true);
            }
            btnHint.disabled = false;
        }, 1000);
    }
  1. ๋‚จ์€ pair์˜ ๊ฐœ์ˆ˜ ๋ณด์—ฌ์ฃผ๊ธฐ

JS ์š”์•ฝ์ •๋ฆฌ +) ํด๋กœ์ €

JavaScript ํ•ต์‹ฌ์š”์•ฝ

ํด๋กœ์ € : ์–ด๋–ค ํ•จ์ˆ˜ A์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜ a๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋‚ด๋ถ€ํ•จ์ˆ˜ B๋ฅผ ์™ธ๋ถ€๋กœ ์ „๋‹ฌํ•  ๊ฒฝ์šฐ A์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ข…๋ฃŒ๋œ ์ดํ›„์—๋„ ๋ณ€์ˆ˜ a๊ฐ€ ์‚ฌ๋ผ์ง€์ง€ ์•Š๋Š” ํ˜„์ƒ

์•ฝ๊ฐ„ ๋ชจํ˜ธํ–ˆ๋˜ ํด๋กœ์ €์˜ ๊ฐœ๋…์„ ์ฝ”์–ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ณด๊ณ  ์™„๋ฒฝํ•˜๊ฒŒ ์ดํ•ดํ–ˆ๋‹ค ใ…Žใ…Ž!

CSS

์ผ : Make a Website

์›” : Hover Tabs

ํ™” : Slideshow Gallery

์ˆ˜ : Outline Buttons Alert Buttons

๋ชฉ, ๊ธˆ : Login Form

ํ†  : CSS/JS Modal

Java

์ž๋ฐ”์˜ ์ •์„ 6, 7, 8, 10, 11์žฅ ๋ฐฑ์ง€๋ณต์Šต, ์›๋ณด์นด๋กœ ์•”๊ธฐ

์ด๋ฒˆ ์ฃผ์˜ ์ƒ๊ฐ

  • ์ด๋ฒˆ ์ฃผ ์™„์ „ ํ—ค์ดํ•ด์กŒ๋‹ค.. ์ •์‹ ์ฐจ๋ ค~!!~!~!
  • ์–ธ๋„ ํ”„๋กœ์ ํŠธ ๋๋‚˜๊ณ  ์ฝ”ํ‹€๋ฆฐ ๋ฐฐ์šฐ๊ณ  ์‹ถ๋‹ค ๊ทธ๋’ค๋กœ๋Š” Scala, Rust๊นŒ์ง€..

์ฐจ์ฃผ ๋ชฉํ‘œ

๊ตฌ๋ถ„์ฐจ์ฃผ ๋ชฉํ‘œ
โœ๏ธ์ง€์ 1. ์Šคํ”„๋ง์˜ ์ •์„
ch2-22~ch3-21(์ด 35๊ฐ•) ํ‰์ผ ํ•˜๋ฃจ 7๊ฐ•์”ฉ ๋ชฉํ‘œ, ์ฃผ๋ง์—๋Š” ๋ณต์Šต


2. Java ๋ณต์Šต
๋ชฉํ‘œ : ์ž๋ฐ”์˜ ์ •์„ 12, 13, 14, 15, 6์žฅ ๋ฐฑ์ง€๋ณต์Šต, ์›๋ณด์นด๋กœ ์•”๊ธฐ
์‹œ๊ฐ„ : 1) ์•„์นจ ์ด๋™ ์‹œ๊ฐ„(7:20~7:50) - ๋ฐฑ์ง€ ๋ณต์Šต
2) ๊ฑธ์„ ๋• ๋ณต๊ธฐ์‹œํ‚ค๊ธฐ
3) ์ €๋… ์ด๋™ ์‹œ๊ฐ„ - ์•„์นจ์— ๋ชป ์ ์—ˆ๊ฑฐ๋‚˜ ํ‹€๋ ธ๋˜ ๊ฑฐ ์›๋ณด์นด๋กœ ์•”๊ธฐ


3. CSS
- 1์ผ 1w3schools(how to ๋ถ„์„ - ์ฃผ์„๋‹ฌ๊ณ  ํ•ต์‹ฌ ์ •๋ฆฌํ•˜๊ธฐ)
์ผ
Filter/Search List
์›” :
Top Navigation
ํ™” :
Modal Images
์ˆ˜ :
Split Buttons
๋ชฉ :
Sign Up Form
๊ธˆ :
Skill Bar
ํ†  :
Delete Modal
๐Ÿง˜โ€โ™€๏ธ์˜์ ๋งค์ผ ๋…ผ์–ด ํ•œ ๋งˆ๋”” ์ฝ๊ธฐ(์˜ค์ „ 8์‹œ~8์‹œ 10๋ถ„)
๐Ÿƒโ€โ™€๏ธ์‹ ์ฒด์ ์ž๊ธฐ ์ „ ํผ๋กค๋Ÿฌ ์ŠคํŠธ๋ ˆ์นญ 10๋ถ„(์˜คํ›„ 10์‹œ 50๋ถ„~11์‹œ)

๋‹ค์Œ์ฃผ๋„ํŒŒ์ดํŒ…!๐Ÿ˜„

  • ๋‹ด์ฃผ๊ฑฐ
    ๊ตฌ๋ถ„๋ชฉํ‘œ์‹œ๊ฐ„์‚ฌ์šฉ์‹œ๊ฐ„๋‹ฌ์„ฑ๋ฅ %์›์ธ๋ถ„์„๋‹ค์Œ ์ฃผ์— ์ ์šฉํ•  ๊ฒƒ
    ๐Ÿง˜โ€โ™€๏ธ์˜์ (์ผ)ํ”ผ๋“œ๋ฐฑ + 3.5
    โœ๏ธ์ง€์ (์ผ) + 77
    ์‚ฌํšŒ์ 1
    ๐Ÿƒโ€โ™€๏ธ์‹ ์ฒด์ 1
    ๐ŸŒ”์ž 49
    ๐Ÿšฟ๊ธฐํƒ€28


Uploaded by N2T