[ํ›„์œ„ํ‘œ๊ธฐ๋ฒ•] ํ›„์œ„ํ‘œ๊ธฐ์‹์œผ๋กœ ๊ณ„์‚ฐ๊ธฐ ๋งŒ๋“ค๊ธฐ (html, js ์ด์šฉ) :: ๊ฐœ๋…์—์„œ ๊ตฌํ˜„๊นŒ์ง€

ํ›„์œ„ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ๊ณ„์‚ฐ๊ธฐ ๋งŒ๋“ค๊ธฐ

๊ณ„์‚ฐ๊ธฐ ๊ด€๋ จ ์™ธ์ฃผ๊ฐ€ ๋“ค์–ด์™€์„œ ํ•ด๋ณด๋˜ ์ค‘, ์˜ˆ์ „์— ๋ฐฐ์› ๋˜ ํ›„์œ„ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•ด์•ผํ–ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๊ธฐ์–ต์ด ์•ˆ๋‚˜์„œ ๊ฒ€์ƒ‰ ์—†์ด ํ˜ผ์ž ๊ตฌํ˜„ํ•˜๋ ค๋‹ค ๋ณด๋‹ˆ ๋„ˆ๋ฌด ์–ด๋ ค์› ๋‹ค... ๊ฒ€์ƒ‰ํ•ด๋ณด๋‹ˆ๊นŒ stack์„ ์ด์šฉํ•ด์„œ ํ›„์œ„ํ‘œ๊ธฐ๋ฒ•์„ ๋งŒ๋“œ๋Š” ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์ด ๋‚˜์™€์žˆ์–ด์„œ ๊นŒ๋จน์ง€ ์•Š๊ธฐ ์œ„ํ•ด ๊ธฐ๋กํ•œ๋‹ค.

ํ›„์œ„ ํ‘œ๊ธฐ๋ฒ•

์ˆ˜์‹ ํŠธ๋ฆฌ

ํ›„์œ„ ํ‘œ๊ธฐ๋ฒ•์ด๋ž€ ๊ณ„์‚ฐ์‹์—์„œ ๊ณ„์‚ฐ์„ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํ‘œ๊ธฐ๋ฒ•์ด๋‹ค. ์˜ˆ์ œ์™€ ํ•จ๊ป˜ ์‚ดํŽด๋ณด์ž.

  • ์ˆ˜์‹ : 9x3+1-3%3

์ˆ˜์‹์ด ์ฃผ์–ด์กŒ์„ ๋•Œ ๋น„์—ฐ์‚ฐ์ž์™€ ์—ฐ์‚ฐ์ž๋กœ ๋‚˜๋ˆˆ ํ›„, ๊ฐ ํ•ญ๋ชฉ์„ ํ•˜๋‚˜์˜ ๋…ธ๋“œ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ํŠธ๋ฆฌ ํ˜•ํƒœ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ ํŠธ๋ฆฌ๋Š” ์ˆ˜์‹์„ ํŠธ๋ฆฌ๋ผ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋กœ ๋งŒ๋“  ๊ฒƒ์ด๋‹ˆ ์ˆ˜์‹ํŠธ๋ฆฌ, ์ฆ‰ Expression Tree๋ผ๊ณ  ๋ถˆ๋ฆฐ๋‹ค.

 

ํŠธ๋ฆฌ ์ˆœํšŒ์™€ ํ‘œ๊ธฐ๋ฒ•

ํŠธ๋ฆฌ๋ฅผ ์ˆœํšŒํ•˜๋Š” ๋ฐฉ์‹์—๋Š” prefix(์ „์œ„), infix(์ค‘์œ„), postfix(ํ›„์œ„)๊ฐ€ ์žˆ๋Š”๋ฐ,

[ํŠธ๋ฆฌ ๋งํฌ] ์ฐธ์กฐ

์œ„์—์„œ ๋‚˜์˜จ ์ผ๋ฐ˜์ ์œผ๋กœ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์ˆ˜์‹์€ ์ค‘์œ„์ˆœํšŒ๋กœ ์ˆ˜์‹ํŠธ๋ฆฌ๋ฅผ ์ˆœํšŒํ•˜์—ฌ ๋‚˜์˜จ ์ค‘์œ„ํ‘œ๊ธฐ๋ฒ•์ด๋‹ค.

์ด๋ฅผ ์ปดํ“จํ„ฐ์—์„œ ๊ณ„์‚ฐํ•˜๊ธฐ ์ข‹์€ ๋ฐฉ์‹์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ๋ ค๋ฉด ํ›„์œ„ ์ˆœํšŒ๋ฅผ ํ†ตํ•ด ํ›„์œ„ํ‘œ๊ธฐ๋ฒ•์„ ๋งŒ๋“ค์–ด์•ผํ•œ๋‹ค.

ํ›„์œ„์ˆœํšŒ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰๋˜๋ฉฐ, ๊ฒฐ๊ณผ๋กœ ๋‚˜์˜ค๋Š” ์ˆ˜์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ์ˆ˜์‹ : 93x1+33%-

 

ํ›„์œ„ ํ‘œ๊ธฐ์‹ ๋งŒ๋“ค๊ธฐ

ํ›„์œ„ํ‘œ๊ธฐ์‹์„ ๋งŒ๋“ค๊ณ  ๊ณ„์‚ฐํ•˜๋Š” ๋ฒ•์„ ๋ฐฐ์› ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๊ผญ ํŠธ๋ฆฌ๋กœ ๋งŒ๋“ค์–ด์„œ ํ›„์œ„ํ‘œ๊ธฐ์‹์„ ์ž‘์„ฑํ•ด์•ผํ• ๊นŒ?

๋ณธ์ธ๋„ ์ด๋ ‡๊ฒŒ ํ›„์œ„ํ‘œ๊ธฐ์‹์„ ๋งŒ๋“ค๋ ค๋‹ค๊ฐ€ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™์•„ ๊ฒ€์ƒ‰์„ ํ•ด๋ณด์•˜๋‹ค.

๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ ๋˜ stack์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทœ์น™์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ๋น„์—ฐ์‚ฐ์ž(์ˆซ์ž)๊ฐ€ ๋‚˜์˜ค๋ฉด stack์— ์ง‘์–ด๋„ฃ๋Š”๋‹ค(push).
  2. ์—ฐ์‚ฐ์ž๊ฐ€ ๋‚˜์˜ค๋ฉด
    1. operator stack์— ์—ฐ์‚ฐ์ž๊ฐ€ ์—†์œผ๋ฉด ์ง‘์–ด๋„ฃ๋Š”๋‹ค(push).
    2. operator stack์— ์žˆ๋Š” ์—ฐ์‚ฐ์ž๊ฐ€ ํ•ด๋‹น ์—ฐ์‚ฐ์ž๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’๊ฑฐ๋‚˜ ๊ฐ™๋‹ค๋ฉด operator stack์— ์žˆ๋Š” ์—ฐ์‚ฐ์ž๋ฅผ ๋นผ์„œ(pop) stack์— ์ง‘์–ด๋„ฃ๊ณ (push), ํ˜„์žฌ ์—ฐ์‚ฐ์ž๋ฅผ operator stack์— ๋„ฃ๋Š”๋‹ค(push).
    3. operator stack์— ์žˆ๋Š” ์—ฐ์‚ฐ์ž๊ฐ€ ํ•ด๋‹น ์—ฐ์‚ฐ์ž๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ๋‹ค๋ฉด operator stack์— ๋„ฃ๋Š”๋‹ค(push).

์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ์—ฐ์‚ฐ์ž์˜ ์šฐ์„ ์ˆœ์œ„๋Š” +, - < x, % < (, )์ด๋‹ค.

์˜ˆ์‹œ ์ˆ˜์‹์„ ๊ฐ€์ง€๊ณ  ํ›„์œ„ํ‘œ๊ธฐ์‹์„ ๋งŒ๋“ค์–ด๋ณด์ž.

  • ์ˆ˜์‹ : 9x3+1-3%3

์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋” ๋†’์€ ์—ฐ์‚ฐ์ž๊ฐ€ ์Šคํƒ์— ์žˆ์œผ๋ฉด ๋นผ๊ณ , ํ•ด๋‹น ์—ฐ์‚ฐ์ž๋ฅผ ์Šคํƒ์— ์ง‘์–ด๋„ฃ๋Š”๋‹ค.

๊ฒฐ๊ณผ์— ์žˆ๋Š” ๊ฐ’๋“ค์„ ์ฐจ๋ก€๋กœ ๋นผ๋‚ด๋ฉด ํ›„์œ„ํ‘œ๊ธฐ์‹์ด๋‹ค.

 

ํ›„์œ„ ํ‘œ๊ธฐ์‹ ๊ณ„์‚ฐ

๊ทธ๋ ‡๋‹ค๋ฉด ์ฃผ์–ด์ง„ ํ›„์œ„ํ‘œ๊ธฐ๋ฒ• ์ˆ˜์‹์— ๋Œ€ํ•ด์„œ๋Š” ์–ด๋–ป๊ฒŒ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์„๊นŒ? ๊ทœ์น™์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ๋น„์—ฐ์‚ฐ์ž(์ˆซ์ž)๊ฐ€ ๋‚˜์˜ค๋ฉด number stack์— ์ง‘์–ด๋„ฃ๋Š”๋‹ค(push).
  2. [stack ๋งํฌ] ์ฐธ์กฐ
  3. ์—ฐ์‚ฐ์ž๊ฐ€ ๋‚˜์˜ค๋ฉด
    1. number stack์—์„œ 2๊ฐœ์˜ ์ˆซ์ž๋ฅผ ๊บผ๋‚ธ๋‹ค(pop).
    2. 2๊ฐœ์˜ ์ˆซ์ž๋ฅผ ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•ด ๊ณ„์‚ฐํ•œ๋‹ค.
    3. ๊ฒฐ๊ณผ๋กœ ๋‚˜์˜จ ์ˆซ์ž๋ฅผ ๋‹ค์‹œ number stack์— ์ง‘์–ด๋„ฃ๋Š”๋‹ค(push).

์˜ˆ์‹œ๋กœ ์ฃผ์–ด์ง„ ์ˆ˜์‹์„ ํ†ตํ•ด ์ž์„ธํ•œ ๊ณผ์ •์„ ์‚ดํŽด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์—ฐ์‚ฐ์ž๊ฐ€ ๋‚˜์˜ค๋ฉด, ์ˆซ์ž ์Šคํƒ์—์„œ 2๊ฐœ์˜ ์ˆซ์ž๋ฅผ ๊บผ๋‚ด์„œ ๊ณ„์‚ฐํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ ์ˆซ์ž ์Šคํƒ์— ๋„ฃ๋Š”๋‹ค.

์ด๋Ÿฌํ•œ ๊ณ„์‚ฐ ๋ฐฉ์‹์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

 

๊ฒฐ๊ณผ๋Š” 27์ด๋‹ค.

์šฐ๋ฆฌ์—๊ฒŒ ์ต์ˆ™ํ•œ ์ค‘์œ„ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ๋œ ์ˆ˜์‹์„ ์ง์ ‘ ํ’€์–ด๋ณด๋ฉด

  • ์ˆ˜์‹ : (9x3)+1-(3%3) = 27+1-1 = 27

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

 

๊ณ„์‚ฐ๊ธฐ ๋งŒ๋“ค๊ธฐ

์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>๊ณ„์‚ฐ๊ธฐ ๋งŒ๋“ค๊ธฐ</title>
<link rel="stylesheet" href="hw04.css" />
<script type="text/javascript" src="hw04.js"></script>

</head>

<body>
<h3>๊ณ„์‚ฐ๊ธฐ ๋งŒ๋“ค๊ธฐ</h3>
<hr>

<table>
    <tr>
        <td colspan="4"><input type="text" id="lcd" value="0" size="50"></td>
    </tr>
    <tr>
        <td><input type="button" value="BACK" onclick="backward()"></td>
        <td><input type="button" value="CE" onclick="clearLcd()"></td>
        <td><input type="button" value="C" onclick="clearLcd();"></td>
        <td><input type="button" value="=" onclick="calculate()"></td>
    </tr>
    <tr>
        <td><input type="button" onclick="addInput(7)" value=7></td>
        <td><input type="button" onclick="addInput(8)" value=8></td>
        <td><input type="button" onclick="addInput(9)" value=9></td>
        <td><input type="button" onclick="addInput('+')" value='+'></td>
    </tr>
    <tr>
        <td><input type="button" onclick="addInput(4)" value=4></td>
        <td><input type="button" onclick="addInput(5)" value=5></td>
        <td><input type="button" onclick="addInput(6)" value=6></td>
        <td><input type="button" onclick="addInput('-')" value='-'></td>
    </tr>
    <tr>
        <td><input type="button" onclick="addInput(1)" value=1></td>
        <td><input type="button" onclick="addInput(2)" value=2></td>
        <td><input type="button" onclick="addInput(3)" value=3></td>
        <td><input type="button" onclick="addInput('x')" value='x'></td>
    </tr>
    <tr>
        <td><input type="button" value='NONE'></td>
        <td><input type="button" onclick="addInput(0)" value=0></td>
        <td><input type="button" value='NONE'></td>
        <td><input type="button" onclick="addInput('%')" value='%'></td>
    </tr>
<table>
</body>
</html>

html ๊ตฌ์„ฑ์€ ์œ„์™€ ๊ฐ™๋‹ค.

  • ๊ณ„์‚ฐ ๊ฒฐ๊ณผ์™€ ๊ณผ์ •์€ id๊ฐ€ lcd์ธ text input์— ๋‚˜ํƒ€๋‚œ๋‹ค.
  • ์—ฐ์‚ฐ์ž๋‚˜ ๋น„์—ฐ์‚ฐ์ž ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด addInput ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋„๋ก ํ•˜์˜€๋‹ค. addInput ํ•จ์ˆ˜๋Š” lcd์— ๋ˆ„๋ฅธ ๋ฒ„ํŠผ์„ ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
  • C๋‚˜ CE๋ฅผ ๋ˆ„๋ฅด๋ฉด lcd๊ฐ€ 0์œผ๋กœ ์ดˆ๊ธฐํ™” ๋œ๋‹ค.
  • Back ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด lcd์— ์ถœ๋ ฅ๋œ ์ˆ˜์‹์—์„œ ๋งˆ์ง€๋ง‰ ๊ธ€์ž๊ฐ€ ์ง€์›Œ์ง„๋‹ค.
  • = ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด lcd์— ์ถœ๋ ฅ๋œ ์ˆ˜์‹์˜ ๊ฒฐ๊ณผ๊ฐ€ ๊ณ„์‚ฐ๋˜์–ด lcd์— ์ถœ๋ ฅ๋œ๋‹ค.

 

function addInput(b) {// ์ˆซ์ž๋‚˜ ๊ธฐํ˜ธ๊ฐ€ ๋ˆŒ๋ ค์ง€๋ฉด ๊ทธ๋Œ€๋กœ ํ™”๋ฉด์— ์ถœ๋ ฅํ•ด์ฃผ๋Š” ํ•จ์ˆ˜
    var lcd = document.getElementById('lcd');
    lcd.value = lcd.value=="0"?"":lcd.value; // ๊ฐ’์ด 0์ด๋ฉด ์—†์• ๊ณ  ์ˆซ์ž ๋ฐ ๊ธฐํ˜ธ ์ถ”๊ฐ€
    lcd.value += typeof(b)==Number?b.toString():b; // ์ˆซ์ž๋ฉด string์œผ๋กœ ๋ณ€ํ™˜
}

function backward() { //back ๋ฒ„ํŠผ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜
    var lcd = document.getElementById('lcd');
    lcd.value = lcd.value.substring(0, lcd.value.length-1);
    lcd.value = lcd.value==""?"0":lcd.value; // ๊ฐ’์ด ์—†์œผ๋ฉด 0 ๋…ธ์ถœ
}
function calculate() { // "="๊ฐ€ ๋ˆŒ๋Ÿฌ์ง„ ๊ฒฝ์šฐ. ๊ณ„์‚ฐํ•˜๊ณ  ๊ฒฐ๊ณผ ์ถœ๋ ฅ
    var lcd = document.getElementById('lcd');
    var arr = [];
    var value = 0;
    var stack = [];
    for(var char of lcd.value){ 
        // ๋ฐฐ์—ด์— ์ˆซ์ž / ๋ฌธ์ž ๊ตฌ๋ถ„ํ•ด์„œ ๋„ฃ๊ธฐ
        // ํ›„์œ„ ์—ฐ์‚ฐ ์ˆœ์„œ๋กœ ๋„ฃ๊ธฐ
        if(!isNaN(char)){ // ์ˆซ์ž์ด๋ฉด
            value = 10*value+Number(char);
        }else{ // ๋ฌธ์ž์ด๋ฉด
            arr.push(value);
            const tmp = stack.pop();
            if(tmp==undefined){ // stack์ด ๋น„์–ด์žˆ์œผ๋ฉด
                stack.push(char);
            }else{
                if(operPriority(tmp,char)){
                    // stack์˜ ์—ฐ์‚ฐ์ž๊ฐ€ ๋” ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด stack์—์„œ ๋นผ๊ณ  ๋„ฃ๊ธฐ
                    arr.push(tmp); stack.push(char);
                } else{ // ๋‚ฎ์œผ๋ฉด stack์— ์Œ“๊ธฐ
                    stack.push(tmp); stack.push(char);
                }
            }
            value=0;
        }
    }
    arr.push(value);
    let pop_element = stack.pop(); // stack์— ์žˆ๋Š” ์—ฐ์‚ฐ์ž ๋‹ค ๋นผ๊ธฐ
    while(pop_element!=undefined){
        arr.push(pop_element);
        pop_element = stack.pop();
    }

    // ๊ณ„์‚ฐ
    var value=[];
    for(var char of arr){
        if(!isNaN(char)){ // ์ˆซ์ž์ด๋ฉด
            value.push(char);
        } else{ // ๋ฌธ์ž์ด๋ฉด
            const v1 = value.pop();
            const v2 = value.pop();
            switch(char){
                case "+":
                    value.push(v2+v1);
                    break;
                case "-":
                    value.push(v2-v1);
                    break;
                case "x":
                    value.push(v2*v1);
                    break;
                case "%":
                    if(v2==0)
                        alert("0์œผ๋กœ ๋‚˜๋ˆŒ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
                    else
                        value.push(v2/v1);
                    break;
            }
        }
        const tmp = value.pop();
        value.push(tmp);
    }
    lcd.value=value.pop();
}

function operPriority(oper1, oper2){
    // oper2์˜ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊ฐ™๊ฑฐ๋‚˜ ํฌ๋ฉด true ๋ฐ˜ํ™˜
    switch(oper1){
        case "+":
        case "-":
            if(oper2=="x" || oper2 =="%")
                return false;
            return true;
        case "x":
        case "%":
            return true;
    }
}

function clearLcd() {  // "CE", "C"๊ฐ€ ๋ˆŒ๋Ÿฌ์ง„ ๊ฒฝ์šฐ, lcd ํด๋ฆฌ์–ด 
    var lcd = document.getElementById("lcd");
    lcd.value = "0";
}

js ๊ตฌ์„ฑ์€ ์œ„์™€ ๊ฐ™๋‹ค.

  • ์—ฐ์‚ฐ์ž์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ณ„์‚ฐํ•ด์ฃผ๋Š” operPriority ํ•จ์ˆ˜๋ฅผ ํ›„์œ„ํ‘œ๊ธฐ์‹์„ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉํ•˜์˜€๋‹ค.
  • ์ˆ˜์‹์„ ๊ณ„์‚ฐํ•˜๋Š” calculate ํ•จ์ˆ˜๋Š”
    • ํ›„์œ„ํ‘œ๊ธฐ์‹์„ ๋งŒ๋“ค๊ณ 
    • ํ‘œ๊ธฐ์‹์„ ๊ณ„์‚ฐํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
๋ฐ˜์‘ํ˜•