작성
·
451
·
수정됨
1
안녕하세요 선생님 강의를 보고 살짝 헷갈리는 부분이 있어 질문드립니다.
Q1. 사진은 선생님이 설명해주실때 그려주신건데, 왼쪽 num[1] oper[1] num[2] 이 부분이 괄호를 쳐서 연산해주었다고 생각해도 되는건가요?
즉 제가 이문제를 접근할때 완전탐색으로 재귀호출시에 1. 괄호를 묶거나 2. 괄호를 묶지 않거나 이렇게 두가지로 생각을 해서 호출을 하려 했습니다.
사진의 오른쪽은 그냥 현재 인덱스와 그 다음 인덱스를 연산하는것이기 때문에 왼쪽부터 오른쪽으로 연산하는것 이기에 괄호연산을 하지 않았다고 판단했고, 왼쪽은 오른쪽에서 부터 왼쪽으로 연산을 했기 때문에 괄호 연산을 한것이라고 판단하였습니다.
근데 이번 인덱스를 먼저 계산하는 것이기 때문에 그 반대가 맞는것 같기도 하네요..
Q2. 그리고 또 질문은 만약 괄호를 추가하냐 추가하지 않느냐 이렇게 두가지로 가정한다면 재귀호출후 원복하는 부분이 필요할것 같은데 그 부분이 왜 따로 없는지도 궁금합니다.
-> 이 부분 제가 생각해 보았는데, visited 등과 같은 전역변수 배열은 한번 체크하면 재귀 탈출후에도 체크가 남아있어서 따로 지우는 로직이 필요한 것이고, 이번 문제의 경우는 재귀함수에서 하나의 함수를 탈출하면 재귀의 특성때문에 자동적으로 선택하기 이전으로 돌아가기 때문에 따로 뭔가를 지우는 로직이 필요없는것인가요?
혹시 제가 생각한것이 맞는 생각인건가요? 아니면 아예 접근을 그런식으로 하면 안되는건가요?
답변 2
0
안녕하세요 명운님 ㅎㅎ
Q1. 사진은 선생님이 설명해주실때 그려주신건데, 왼쪽 num[1] oper[1] num[2] 이 부분이 괄호를 쳐서 연산해주었다고 생각해도 되는건가요?
즉 제가 이문제를 접근할때 완전탐색으로 재귀호출시에 1. 괄호를 묶거나 2. 괄호를 묶지 않거나 이렇게 두가지로 생각을 해서 호출을 하려 했습니다.
>> 네 맞습니다. 2가지 경우가 맞습니다. 네. 왼쪽이 괄호친것입니다.
Q2. 그리고 또 질문은 만약 괄호를 추가하냐 추가하지 않느냐 이렇게 두가지로 가정한다면 재귀호출후 원복하는 부분이 필요할것 같은데 그 부분이 왜 따로 없는지도 궁금합니다.
-> 이 부분 제가 생각해 보았는데, visited 등과 같은 전역변수 배열은 한번 체크하면 재귀 탈출후에도 체크가 남아있어서 따로 지우는 로직이 필요한 것이고, 이번 문제의 경우는 재귀함수에서 하나의 함수를 탈출하면 재귀의 특성때문에 자동적으로 선택하기 이전으로 돌아가기 때문에 따로 뭔가를 지우는 로직이 필요없는것인가요?
>> 네 맞습니다. visited를 사용하지 않지만 이 코드 자체는 매개변수로 변환되는 값이 들어가서 함수 내부에서 처리되기 때문에 뭔가를 지우는 로직은 필요치 않습니다.
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));
}
앞의 코드처럼 계산된 결과값이 매개변수로 들어가서 처리되고 있습니다. 즉, 해당 idx에서 전역적으로 무언가를 변화시키는 코드는 없기 때문에 해당 값을 0으로 만들거나 하는 코드가 필요하지 않습니다.
또 질문 있으시면 언제든지 질문 부탁드립니다.
좋은 수강평과 별점 5점은 제가 큰 힘이 됩니다. :)
감사합니다.
강사 큰돌 올림.
0
안녕하세요, 인프런 AI 인턴이에요.
Q1. 해당 문제에서 괄호를 추가할 수 있는 경우는 무조건 왼쪽에서부터 연산하는 경우입니다. 따라서 왼쪽에서는 괄호를 계산해야 합니다.
Q2. 괄호를 추가하거나 추가하지 않는 두 가지 경우를 가정할 때, 해당 경우마다 visited 같은 전역 배열 변수를 따로 초기화하는 로직을 추가해주어야 합니다. 따라서 재귀 호출 후 원복하는 로직은 이미 visited 등의 배열 초기화 로직으로 포함되어 있습니다.
이상입니다. 더 궁금하신 점이 있으시면 댓글로 남겨주세요. 감사합니다.
매번 친절한 설명 감사합니다.!