덧셈을 곱셈보다 먼저 계산

vimania의 이미지

입력받은 연산자와 피연산자는 배열에 들어있습니다.

연산자는 +, * 밖에 없습니다.

예) 1+2*3+4+5*6*7 이런식으로 입력이 들어왔을때

덧셈을 먼저 하고 곱셈을 나중에 하게 하려면 어떤 방법으로 프로그래밍 해야 할까요?

체스맨의 이미지

그럼, 곱셈을 먼저하고 덧셈을 나중에 하도록 하실 수는 있는 건가요?

Orion Project : http://orionids.org

vimania의 이미지

둘다 구현하는 방법을 알고 싶습니다.

손으로 계산하는것 만큼 간단하지 않네요.

imyejin의 이미지

아니면 yacc 류의 파서 생성 프로그램이나 파서 관련 라이브러리들을 뒤져 보면 표준적인 예제로 아마 나와 있을 겁니다.

임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin

[예진아씨 피카사 웹앨범] 임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin

blueiur의 이미지

네이버 검색해도 수많이 나올겁니다.
계산기 C++ <- 이정도로만 해도 수없이 나오네요.
하나 받아서 분석해 보세요~
후위 표기식 등을 이해하시면 구현이 가능해 집니다.

위의 알고리즘 없이 파이썬으로 풀면 ..
reduce(lambda x, y: x*y, map(lambda x: eval(x), '1+2*3+4+5*6*7'.split('*')))
이렇게 가능하겠네요.

ruinfire의 이미지

*를 기호로 쓴게 아니라 split 기준으로 쓰시다니 ㅋㅋㅋ

:)
------------------------------------------------------
팔 어딘가가 간지러운데 찾아 긁을 수 없는? 그런 기분??

------------------------------------------------------
팔 어딘가가 간지러운데 찾아 긁을 수 없는? 그런 기분??

noblepylon의 이미지

The C++ Programming Language책 6단원에 보면 간단한 command-line 계산기 예제가 있습니다. 역시 권위있는 책은 다르더군요=_=;
---
“내게 능력주시는 자 안에서 내가 모든 것을 할 수 있느니라.”(빌립보서 4:13)

---
“내게 능력주시는 자 안에서 내가 모든 것을 할 수 있느니라.”(빌립보서 4:13)

akibird의 이미지

간단하게 2차원 배열을 쓰면 어떨까요..

1 + 2는 [0][x]
3 + 4 + 5 [1][x]
...

*을 만날때마다 행을 하난씩 증가하는겁니다.
각각의 낱개 배열을 먼저 더하고 최종적으로 곱하기를 수행하면되겠지요..

곱셈은 반대로하면되겠네요~
곱셈을 만날때마다 열을 늘리고 덧셈을 만나면 행을 늘리는 식으로^^

cppig1995의 이미지

간단하게...
배열에 이것들을 모두 넣습니다.

1 + 2 * 3 + 4 + 5 * 6 * 7

+를 찾아서, 근처 요소를 더한 값으로 치환하고 근처 요소를 없앱니다.

3 * 3 + 4 + 5 * 6 * 7

계속 반복합니다.

3 * 7 + 5 * 6 * 7

3 * 12 * 6 * 7

+가 남지 않으면 *를 찾아서 똑같은 일을 합니다.
... 중위 표기법 parsing에는 이만한 방법이 없던데요?
이 방법에서는 괄호를 찾으면 재귀 호출합니다.



한말글 프로그래밍 언어 "열정" http://me-lang.wo.tc

Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.

SoulreaveR의 이미지

*를 먼저 처리, 그다음 +....

SoulreaveR의 이미지

난독증이라... 죄송합니다;

나그네나그네의 이미지

바이너리 트리를 이용합니다.

parent에는 연산자가,(여기서는 *이나 +가 되겠습니다)
left와 right에는 그 연산자 기준으로 왼쪽 식과 오른쪽 식이 들어갑니다.

이를 잘 이용하면 한 번의 루프 만에 우선순위가 알려져 있는 연산자가 들어간 모든식을 계산할 수 있습니다.
----------------
agidari.wordpress.com

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.