https://school.programmers.co.kr/learn/courses/30/lessons/120902
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
프로그래머스 입문 문제를 풀어보다가 이런 형식의 문제는 드물어서 가져왔다.
"3 + 5" 처럼 공백을 기준으로 나눠진 문자열이 존재한다.
이 문자열을 잘 파싱해서 계산후 답을 구하면 된다. 여기서의 답은 8
이때 제한사항이 존재한다.
- 연산자는 +, -만 존재.
- 문자열의 시작과 끝에는 공백이 없다.
- 0으로 시작하는 숫자는 주어지지 않는다.
- 잘못된 수식은 주어지지 않는다.
- 5 ≤ my_string의 길이 ≤ 100
- my_string을 계산한 결과값은 1 이상 100,000 이하.
- my_string의 중간 계산 값은 -100,000 이상 100,000 이하.
- 계산에 사용하는 숫자는 1 이상 20,000 이하인 자연수.
- my_string에는 연산자가 적어도 하나 포함되어 있다.
- return type 은 정수형.
- my_string의 숫자와 연산자는 공백 하나로 구분되어 있다.
제한 사항을 확인하면 보통 string 문자열 계산시 int형 범위를 넘어 long long을 사용해야하는데 이 문제는 int로 충분하다.
하지만 유의할게 있다.
계산이 한번으로 끝나지 않고 계속 진행된다. "1 + 3 - 14444 +243 + 34" 와 같은 문자열이 나온다면 어떻게 계산할 수 있을까.
풀이 방법
- #include<sstream> 헤더파일을 사용하면 문자열을 공백 기준으로 자동으로 나눠 파싱할 수 있다.
- 나눈 문자열에서 숫자는 num 큐에, 연산자는 op 큐에 저장했다. 큐는 FIFO 자료구조로, 순서를 유지하며 데이터를 처리하기에 적합하다.
- 첫 번째 숫자를 초기값으로 설정한 후, 큐에서 하나씩 꺼내 연산을 진행했다.
예제
입력: "10 + 20 - 5"
- num 큐: [10, 20, 5]
- op 큐: [+, -]
계산 과정:
- 초기값: 10
- 10 + 20 = 30
- 30 - 5 = 25
출력: 25
결론적으로, 문자열을 공백 기준으로 나누고, 큐에 숫자와 연산자를 저장해 순서대로 계산하면 된다.
아래는 stringstream의 간단한 사용 예제다.
1. 공백 기준으로 문자열 나누기
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
int main() {
string input = "10 + 20 - 5";
stringstream ss(input);
string token;
while (ss >> token) {
cout << "Token: " << token << endl;
}
return 0;
}
/*
Token: 10
Token: +
Token: 20
Token: -
Token: 5
*/
2. 구분자를 기준으로 문자열 나누기
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
int main() {
string input = "apple,banana,cherry";
stringstream ss(input);
string token;
vector<string> fruits;
while (getline(ss, token, ',')) { // 쉼표(,)를 구분자로 사용
fruits.push_back(token);
}
for (const auto& fruit : fruits) {
cout << fruit << endl;
}
return 0;
}
/*
apple
banana
cherry
*/
풀이 코드
#include <string>
#include <sstream>
#include <queue>
using namespace std;
queue<int> num;
queue<int> op;
int solution(string my_string) {
int answer = 0;
string s = "";
stringstream ss(my_string);
while(ss >> s){
if(s == "+"){
op.push(1);
continue;
}
else if(s == "-"){
op.push(-1);
continue;
}
num.push(stoi(s));
}
answer = num.front();
num.pop();
while(!num.empty()){
answer += num.front()*op.front();
num.pop();
op.pop();
}
return answer;
}
'Algorithm > Programmers' 카테고리의 다른 글
[프로그래머스] Lv.1 다트 게임 c++ (0) | 2025.01.07 |
---|---|
[프로그래머스] Lv.1 가장 가까운 같은 글자 c++ (10) | 2025.01.06 |
[프로그래머스] Lv.1 공원 산책 c++ (0) | 2025.01.05 |
[프로그래머스] Lv.1 비밀지도 c++ (0) | 2025.01.05 |
[프로그래머스] Lv.1 카드뭉치 c++ (0) | 2025.01.05 |