algorithm

swea 4874. Forth (ν›„μœ„ ν‘œκΈ°λ²• κ³„μ‚°ν•˜κΈ°)

μˆ˜ν˜€μ΄0812 2023. 8. 19. 14:29
728x90
λ°˜μ‘ν˜•

문제 πŸ˜‚

ForthλΌλŠ” 컴퓨터 μ–Έμ–΄λŠ” μŠ€νƒ 연산을 기반으둜 ν•˜κ³  μžˆμ–΄ ν›„μœ„ ν‘œκΈ°λ²•μ„ μ‚¬μš©ν•œλ‹€. 예λ₯Ό λ“€μ–΄ 3+4λŠ” λ‹€μŒκ³Ό 같이 ν‘œκΈ°ν•œλ‹€.
 

3 4 + .
 

Forthμ—μ„œλŠ” λ™μž‘μ€ λ‹€μŒκ³Ό κ°™λ‹€.
 

μˆ«μžλŠ” μŠ€νƒμ— λ„£λŠ”λ‹€.

μ—°μ‚°μžλ₯Ό λ§Œλ‚˜λ©΄ μŠ€νƒμ˜ 숫자 두 개λ₯Ό κΊΌλ‚΄ λ”ν•˜κ³  κ²°κ³Όλ₯Ό λ‹€μ‹œ μŠ€νƒμ— λ„£λŠ”λ‹€.

‘.’은 μŠ€νƒμ—μ„œ 숫자λ₯Ό κΊΌλ‚΄ 좜λ ₯ν•œλ‹€.

 

Forth μ½”λ“œμ˜ μ—°μ‚° κ²°κ³Όλ₯Ό 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“œμ‹œμ˜€. λ§Œμ•½ ν˜•μ‹μ΄ 잘λͺ»λ˜μ–΄ 연산이 λΆˆκ°€λŠ₯ν•œ 경우 ‘error’λ₯Ό 좜λ ₯ν•œλ‹€.
 

λ‹€μŒμ€ Forth μ—°μ‚°μ˜ μ˜ˆμ΄λ‹€.
 

μ½”λ“œ 좜λ ₯
4 2 / . 2
4 3 - . 1

 

 

[μž…λ ₯]
 

첫 쀄에 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ 개수 Tκ°€ 주어진닀.  1T50
 

λ‹€μŒ 쀄뢀터 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ λ³„λ‘œ μ •μˆ˜μ™€ μ—°μ‚°μžκ°€ 256자 μ΄λ‚΄μ˜ μ—°μ‚°μ½”λ“œκ°€ 주어진닀. ν”Όμ—°μ‚°μžμ™€ μ—°μ‚°μžλŠ” μ—¬λ°±μœΌλ‘œ κ΅¬λΆ„λ˜μ–΄ 있으며, μ½”λ“œλŠ” ‘.’둜 λλ‚œλ‹€.

λ‚˜λˆ—μ…ˆμ˜ 경우 항상 λ‚˜λˆ„μ–΄ 떨어진닀.

 

[좜λ ₯]
 

#κ³Ό 1λ²ˆλΆ€ν„°μΈ ν…ŒμŠ€νŠΈμΌ€μ΄μŠ€ 번호, λΉˆμΉΈμ— 이어 계산결과λ₯Ό μ •μˆ˜λ‘œ 좜λ ₯ν•˜κ±°λ‚˜ λ˜λŠ” ‘error’λ₯Ό 좜λ ₯ν•œλ‹€.

 

λ‚΄ ν’€πŸ¦·

# 4874. Forth

# μž…λ ₯λ°›κΈ°
T = int(input())
for tc in range(1, T + 1):
    # μ—¬κΈ°μ„œ 문자둜 λ°›μ•„μ„œ λ‚˜μ€‘μ— 숫자둜 λ”°λ‘œ λ°”κΏ”μ€˜μ•Ό 함
    susik = input().split()
    # λ§ˆμ§€λ§‰μ— 점이 μžˆμ–΄μ„œ 미리 μ§€μ›Œμ€Œ
    susik.pop()
    # 연산을 담아쀄 리슀트 λ§Œλ“€κΈ°
    num = []
    # κ²°κ³Όκ°’ 1둜 μ΄ˆκΈ°ν™”, 0이면 μ—λŸ¬λ‘œ 좜λ ₯, 1이면 리슀트의 λ§ˆμ§€λ§‰ κ°’ 좜λ ₯
    result = 1

    # μˆ˜μ‹μ„ λ„λŠ” λ™μ•ˆ
    for i in range(len(susik)):
        # μˆ˜μ‹μ΄ ν”Όμ—°μ‚°μžλ©΄
        if susik[i] not in ['+','-','*','/']:
            # μˆ˜μ‹μ— κ·Έ 숫자λ₯Ό μ •μˆ˜λ‘œ λ°”κΏ”μ„œ λ„£μ–΄μ€€λ‹€
            num.append(int(susik[i]))

        # μˆ˜μ‹μ΄ μ—°μ‚°μžλ©΄
        else:
            # μˆ«μžκ°€ λ‘κ°œ 이상 λ‚¨μ•„μžˆμ–΄μ•Ό μ—°μ‚°μžλ₯Ό μ²˜λ¦¬ν•΄ μ£ΌλŠ”λ° μ•„λ‹ˆλ©΄
            # λ§žλŠ” μˆ˜μ‹μ΄ μ•„λ‹ˆλ‹ˆκΉŒ ν‹€λ ΈμœΌλ―€λ‘œ 결과값을 0으둜 λ°”κΏ”μ€€λ‹€
            if len(num) < 2:
                result = 0
                break

            else: # 리슀트의 길이가 2 이상이면 λ§žλŠ” μˆ˜μ‹μ΄λ―€λ‘œ 진행
                n1 = num.pop() # 두가지 숫자λ₯Ό λ½‘λŠ”κ±°λŠ” λͺ¨λ“  κ³Όμ •μ—μ„œ μ§„ν–‰λ˜λ―€λ‘œ 미리 λ½‘μ•„μ€Œ
                n2 = num.pop()
                new = 0

                if susik[i] == '*':
                    new = n2 * n1
                    num.append(new) # μ—°μ‚° ν›„ λ‹€μ‹œ λ¦¬μŠ€νŠΈμ— λ„£μ–΄μ€€λ‹€
                    # num.append(n2*n1) # => μ΄λŸ°μ‹μœΌλ‘œ λ°”λ‘œ μ²˜λ¦¬ν•˜λŠ”κ²Œ 더 쒋은 λ“―
                elif susik[i] == '+':
                    new = n2 + n1
                    num.append(new)
                elif susik[i] == '-':
                    new = n2 - n1
                    num.append(new)
                elif susik[i] == '/':
                    new = n2 // n1 
                    ####### 이떼 λͺ« μ—°μ‚°μžλ‘œ μ•ˆν•΄μ£Όλ©΄ λ‚˜μ€‘μ— .0이 λ‚˜μ˜€λŠ” μΌ€μ΄μŠ€κ°€ λ°œμƒν•œλ‹€!!####
                    num.append(new)

    # 리슀트의 길이가 1이 μ•„λ‹ˆλ©΄ μ—°μ‚°μžμ™€ μˆ«μžκ°€ λ‚¨μ•„μžˆκ±°λ‚˜
    # μ•„λ‹ˆλ©΄ μ•„μ˜ˆ μ—†μ–΄μ§€λŠ” ν‹€λ¦° μˆ˜μ‹μ΄λ‹€
    if len(num) != 1:
            result = 0

    if result:
        print(f'#{tc} {num[-1]}')
    else:
        print(f'#{tc} error')

#####

이 문제 ν’€λ©΄μ„œ 2가지λ₯Ό 잘λͺ»ν–ˆλŠ”데....

 

- 숫자λ₯Ό μ •μˆ˜λ‘œ μ•ˆ λ°›μ•˜μœΌλ©΄μ„œ λ‚˜μ€‘μ— int둜 값을 넣지 μ•Šμ€ 것..

- λ‚˜λˆ„κΈ° μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜λ©΄ λ”± μ •μˆ˜λ‘œ λ‚˜λˆ  λ–¨μ–΄μ§€λŠ” 것이 μ•„λ‹Œ κ²½μš°λ„ λ°œμƒν•˜λ―€λ‘œ // λͺ« μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€..

참고함면 쒋을 κ°œλ…λ“€ ✍️

μ€‘μœ„ ν‘œκΈ°λ²•(infix notation)

: μ—°μ‚°μžλ₯Ό ν”Όμ—°μ‚°μžμ˜ κ°€μš΄λ° ν‘œκΈ°ν•˜λŠ” 방법

  ex) A + B (μš°λ¦¬κ°€ ν‰μ†Œμ— μ‚¬μš©ν•˜λŠ” 방법)

 

ν›„μœ„ ν‘œκΈ°λ²•(postfix notation)

: μ—°μ‚°μžλ₯Ό ν”Όμ—°μ‚°μž 뒀에 ν‘œκΈ°ν•˜λŠ” 방법

 ex) AB + (컴퓨터가 μ‚¬μš©ν•˜λŠ” 방법)

 

ν›„μœ„ ν‘œκΈ°λ²•μ˜ μˆ˜μ‹μ„ μŠ€νƒμ„ μ΄μš©ν•΄μ„œ κ³„μ‚°ν•˜κΈ°

  1.  ν”Όμ—°μ‚°μžλ₯Ό λ§Œλ‚˜λ©΄ μŠ€νƒ push
  2. μ—°μ‚°μžλ₯Ό λ§Œλ‚˜λ©΄ ν•„μš”ν•œ 만큼의 ν”Όμ—°μ‚°μžλ₯Ό μŠ€νƒμ—μ„œ pop ν•˜μ—¬ μ—°μ‚°ν•˜κ³ , μ—°μ‚°κ²°κ³Όλ₯Ό λ‹€μ‹œ μŠ€νƒμ— push
  3. μˆ˜μ‹μ΄ λλ‚˜λ©΄, λ§ˆμ§€λ§‰μœΌλ‘œ μŠ€νƒμ„ popν•˜μ—¬ 좜λ ₯!!!

 

728x90
λ°˜μ‘ν˜•