GitHub ID : soohyun-dev
윤수현의 개발 공간
GitHub ID : soohyun-dev
전체 방문자
오늘
어제
  • 분류 전체보기 (918)
    • 성장기록 (49)
      • 성장기록 (3)
      • 우아한테크코스 (16)
      • 프로젝트 (15)
      • TIL (14)
      • 테오의 스프린트 (1)
    • 프로그래밍언어 (88)
      • C언어 (14)
      • HTML\CSS (12)
      • JavaScript (7)
      • React (23)
      • Python (11)
      • JAVA (14)
      • TypeScript (6)
    • 알고리즘 공부 (736)
      • 코드업 - 파이썬 (108)
      • 백준 - 파이썬 (468)
      • 백준 - 자바스크립트 (125)
      • 프로그래머스 - 파이썬 (1)
      • 프로그래머스 - 자바스크립트 (34)
    • 책 리뷰 (9)
      • 프로그래밍 (3)
      • 독서 (6)
    • 전자기기 (1)
    • 일상, 일기 (18)
    • 기술 세미나 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 백준풀이
  • 코딩
  • javascript
  • 코딩테스트
  • 파이썬
  • 영어독해
  • 독해
  • 프로그래머스자바스크립트
  • 프로그래머스
  • 백준파이썬
  • PYTHON
  • 프론트엔드
  • 코테
  • 프로그래머스풀이
  • 코드업파이썬
  • 코드업
  • 자바스크립트
  • 프로그래밍언어
  • 백준
  • 영어

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
GitHub ID : soohyun-dev

윤수현의 개발 공간

백준/ Silver 3 문제 , 백준 Node.js 자바스크립트 1935 , 후위 표기식2 [자료구조, 스택]
알고리즘 공부/백준 - 자바스크립트

백준/ Silver 3 문제 , 백준 Node.js 자바스크립트 1935 , 후위 표기식2 [자료구조, 스택]

2022. 10. 14. 10:04

백준/ Silver 3 문제 , 백준 Node.js 자바스크립트 1935 , 후위 표기식2 [자료구조]

 

 

Check Point !   ( 해당사항 ✓체크 )

1. 막힘 없이 수월하게 풀린 문제인가?

2. 1시간이내로 풀렸던 문제인가?

3. 1시간 이상 or 며칠을 두고 풀어봤더니 풀린 문제인가?

4. 시간을 써도 도무지 풀 수 없는 문제인가?

5. 솔루션을 찾아봤는가?

-------------------------------------------------------------------------------------------
난이도 체감
1. 최상
2. 상
3. 중
4. 하


<이해도>
1. 완벽히 이해
2. 다소 헷갈리는 부분들이 있음
3. 이해 못함


<덧붙일 말>
자료구조 스택을 활용하는 문제.

 

 

문제 출처

https://www.acmicpc.net/problem/1935

 

1935번: 후위 표기식2

첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다. (여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이

www.acmicpc.net

 

 

 

 

 

풀이

 

후위 표기식이라는 식을 푸는 문제이다.

 

우리가 흔히 사용하는 1+(2*3)=7 은 중위 표현식이고

 

이것을 후위 표현식으로 나타내면

 

123*+ 이렇게 나타낼 수 있겠다. 

 

이런 식을 풀면 된다.

 

 

https://todaycode.tistory.com/73

 

중위 표기법과 후위 표기법

1. 개념  1-1. 중위 표기법이란?  1-2. 후위 표기법이란? 2. 중위 표기식을 후위 표기식으로 바꾸는 법  2-1. 괄호가 없는 경우  2-2. 괄호가 있는 경우 3. 계산  3-1. 후위 표기식을 사칙연산하는 법 1.

todaycode.tistory.com

 

후위 표기식에 대한 내용을 모른다면 위 블로그를 참조하자.

 

 

 


 

 

이 문제에서 핵심은

 

1. 알파벳에 해당하는 숫자를 식별하기.

 

2. 연산 순서 

 

이 부분이라 생각한다.

 

 

처음에 주어지는 Nums 배열에 담긴 숫자들은 각각 앞에서부터 A-Z 순서로 부여된다.

 

숫자가 [ 1, 2, 3 ] 이렇게 주어졌을때 후위표기식이 A+A+A 라면 1+2+3 이 아니고 1+1+1 이라는 점이다.

 

그렇다면 해당하는 알파벳에 맞는 숫자를 잘 저장해둬서 필요할때마다 뽑아 쓰는 편이 좋아보인다.

 

이럴때 바로 dict 를 사용하자.

 

어차피 숫자 앞에서부터 A 순서대로 이므로

 

초기 값을 아스키코드 65 로 설정한다. (아스키코드 65 번 = 'A' )

 

 

 

이런식으로 idx 에 65를 설정하고 알파벳으로 변환하여 주어지는 숫자의 길이만큼 for 문을 돌려서 

 

A부터 차례대로 숫자를 할당한다.

 

예를 들어 숫자가 [2, 4, 6, 8] 이 주어졌다면

 

 

dict 에는 { "A" = 2, "B" : 4, "C" : 6, "D" : 8} 이렇게 담기면 된다.

 

 

 

 

이후 후위 표기식을 앞에서부터 차례대로 확인한다.

 

이때 알파벳일 경우 dict 에 담긴 해당 숫자를 cal 이라는 배열에 담아주고,

 

부호가 일 경우 cal 에 담긴 끝에서부터 2개의 숫자를 부호를 사용해서 연산해주면 된다.

 

 

 

ABC*+DE/-

 

테스트케이스 1번을 확인해보면

 

 

이런식으로 후위표기식을 하나씩 확인해 나아가면서 cal 배열에 담거나 연산해 나아간다.

 

주의 할점은 연산을 할때는 연산을 한 값들은 다 빼주고 결과만 넣어줘야한다. 

 

 

이런식으로 계산을 하면 마지막에 cal 에는 최종 결과값 하나만 남아있을 것이다.

 

그 값을 이제 소수점 두자리 수 까지 맞춰서 출력하면 된다.

 

 

 

 


 

 

스택을 이용한 문제들은 접근하는 방법이 비슷하니 여러 문제들을 풀면 감이 금방 올것이다.

 

 

https://school.programmers.co.kr/learn/courses/30/lessons/64061

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

위 카카오 기출인 인형뽑기 문제도 스택을 이용하면 쉽게 풀 수 있다.

 

 

https://www.acmicpc.net/problem/9012

 

9012번: 괄호

괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고

www.acmicpc.net

 

이 문제도 연습하기 좋다.

 

 

 

 

 

 

 

정답

const input = require("fs").readFileSync("/dev/stdin").toString().split("\n");

let [T, Arr, ...Nums] = input;
Nums = Nums.map((v) => Number(v));

function solution(T, Arr, Nums) {
  Arr = Arr.split("");
  let [cal, idx, result] = [[], 65, 0];
  let dict = {};
  for (let i = 0; i < Nums.length; i++) {
    dict[String.fromCharCode(idx)] = Nums[i];
    idx += 1;
  }
  Arr.map((v) => {
    if (/^[A-Z]*$/.test(v)) cal.push(dict[v]);
    else {
      let [a, b] = [cal.length - 2, cal.length - 1];
      if (v === "+") result = cal[a] + cal[b];
      else if (v === "-") result = cal[a] - cal[b];
      else if (v === "*") result = cal[a] * cal[b];
      else if (v === "/") result = cal[a] / cal[b];
      cal.pop();
      cal.pop();
      cal.push(result);
    }
  });
  return cal[0].toFixed(2);
}

console.log(solution(T, Arr, Nums));

 

 

반응형

'알고리즘 공부 > 백준 - 자바스크립트' 카테고리의 다른 글

백준/ Silver 2 문제 , 백준 Node.js 자바스크립트 5397 , 키로거 [자료구조, 스택]  (1) 2022.10.18
백준/ Silver 4 문제 , 백준 Node.js 자바스크립트 3986 , 좋은 단어 [자료구조, 스택]  (0) 2022.10.14
백준/ Gold 5 문제 , 백준 Node.js 자바스크립트 14503 , 로봇 청소기 [구현, 시뮬레이션]  (1) 2022.10.13
백준/ Gold 5 문제 , 백준 Node.js 자바스크립트 2293 , 동전 1 [DP]  (0) 2022.10.13
백준/ Silver 3 문제 , 백준 Node.js 자바스크립트 11478 , 서로 다른 부분 문자열의 개수  (0) 2022.10.12
    '알고리즘 공부/백준 - 자바스크립트' 카테고리의 다른 글
    • 백준/ Silver 2 문제 , 백준 Node.js 자바스크립트 5397 , 키로거 [자료구조, 스택]
    • 백준/ Silver 4 문제 , 백준 Node.js 자바스크립트 3986 , 좋은 단어 [자료구조, 스택]
    • 백준/ Gold 5 문제 , 백준 Node.js 자바스크립트 14503 , 로봇 청소기 [구현, 시뮬레이션]
    • 백준/ Gold 5 문제 , 백준 Node.js 자바스크립트 2293 , 동전 1 [DP]
    GitHub ID : soohyun-dev
    GitHub ID : soohyun-dev
    환영합니다!😊 이곳은 저의 개발에 관한 내용들을 정리하는 공간입니다. 알고리즘 풀이에도 관심이 많아요. 좋은 하루 되세요~! github : soohyun_dev

    티스토리툴바