인프런 커뮤니티 질문&답변

김현우님의 프로필 이미지
김현우

작성한 질문수

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

3-F

3-F질문있습니다

해결된 질문

작성

·

127

0

http://boj.kr/38e288735ce042b08b79f4830cc93119

 

결국 괄호 묶기는 3숫자 중에 연산 앞으로 2개 묶나 뒤로 2개묶나를 비교해서 더 큰연산을 가져오는 방식이라 생각해서 이렇게 진행했는데 틀렷다고 나옵니다.

 

어떤 부분에서 논리가 틀렸는지 궁금합니다

답변 2

0

큰돌님의 프로필 이미지
큰돌
지식공유자

안녕하세요 현우님 ㅎㅎ

로직에 문제가 있는 것 같습니다.

#include<bits/stdc++.h>

using namespace std;

char c;
int n,t;

vector<char> oper;
vector<int> v;

int cal(char op,int a,int b){
	if(op=='*')return a*b;
	if(op=='+')return a+b;
	if(op=='-')return a-b;
	
	return -1;
}

int main(){
	cin>>n;
	
	for(int i=0;i<n;i++){
		if(!(i%2)){
			cin>>t;
			v.push_back(t);
		}else
		{
			cin>>c;
			oper.push_back(c);
		}
	}
	
	while(v.size()>2){
		int cal1=cal(oper[0],v[0],v[1]);
		cal1=cal(oper[1],cal1,v[2]);
		
		int cal2=cal(oper[1],v[1],v[2]);
		cal2=cal(oper[0],cal2,v[0]);
		
	
		v.erase(v.begin(),v.begin()+2);
		oper.erase(oper.begin(),oper.begin()+2);
		
		v[0]=max(cal1,cal2);
		cout << v[0] << " : " << v[1] << '\n';
	}
	
	cout<<cal(oper[0],v[0],v[1]);
	return 0;
} 

디버깅 코드를 추가한 건데요.

5
8*3+5

예를 들어 이렇게 집어넣었을 때

64 : 3가 나옵니다.

이부분 확인 부탁드립니다.

또한, 이 문제는 모든 경우의 수를 기반으로 생각해야 합니다.

    go(here + 1, oper(oper_str[here], _num, num[here + 1]));

    if(here + 2 <= num.size() - 1){
        int temp = oper(oper_str[here + 1], num[here + 1], num[here + 2]); 
        go(here + 2, oper(oper_str[here], _num, temp));  
    } 

이렇게 경우의 수 2개를 기반으로 판단하고 있는데요.

현우님 코드는.

		v[0]=max(cal1,cal2);

지금 이 시점에서 max값만 남기고 다 버려! 라는 로직인 것 같은데요. 이러면 모든 경우의수가 아닙니다. 지금 이 시점에서 max여도 결과적으로 쌓은 값이 max가 아닐 수 있습니다.


또 질문 있으시면 언제든지 질문 부탁드립니다.

좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.


 

 

0

안녕하세요, 인프런 AI 인턴입니다.

제공된 정보에는 프로그래밍 문제 해결과 직접 관련된 내용이 없어, 구체적인 답변을 드리기 어렵습니다.

그러나 일반적으로, 괄호 묶기 문제에서 발생할 수 있는 오류 중 하나는 모든 경우의 수를 고려하지 않아서 생길 수 있습니다. 주어진 문제에서 언급한 “3숫자 중에 연산 앞으로 2개 묶거나 뒤로 2개를 묶는 방식” 만으로는 모든 상황에 대해 최적의 해를 구할 수 없을 수 있습니다. 문제의 조건에 따라, 연산의 종류(더하기, 빼기, 곱하기 등)나 연산의 우선 순위에 따라 결과가 달라질 수 있기 때문에, 모든 가능한 괄호 묶기 방법을 고려해야 할 수도 있습니다.

또한, 문제의 정확한 조건이나 제시된 데이터, 예상 결과 등 구체적인 정보 없이는 문제의 특정 부분에서 논리가 어떻게 틀렸는지 직접적으로 지적하기 어렵습니다.

BOJ(백준 온라인 저지) 같은 온라인 코딩 테스트 플랫폼에서는 주어진 문제에 대한 예제 입력과 예제 출력을 제공하며, 이를 통해 본인의 로직을 검증해볼 수 있습니다. 또한 해당 문제에 대한 토론 게시판이나 문제 풀이 게시판 등에서 유사한 질문을 찾아보거나, 직접 질문을 올려 다른 참가자들의 의견을 듣는 것도 도움이 될 수 있습니다.

코드에 대한 구체적인 피드백이 필요하다면, 문제의 조건과 함께 자신의 소스 코드를 공유하고 어느 부분이 이해가 되지 않는지 구체적으로 질문하는 것이 좋습니다. 이렇게 하면 다른 개발자들이 문제를 정확하게 이해하고, 보다 구체적이고 실질적인 도움을 줄 수 있을 것입니다.

김현우님의 프로필 이미지
김현우

작성한 질문수

질문하기