-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[9월 23일] 백트래킹 #5
base: main
Are you sure you want to change the base?
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
15663 코드리뷰 완료
너무 완벽해서 .. 정말 더 드릴 커멘트가 없었네요...!
이번 백트래킹 과제도 정말 고생 많으셨습니다 🤗❤✨
// 수열의 마지막 값이 중복되면 중복 수열이므로 | ||
int last = 0; // seq 항의 마지막 값 | ||
|
||
for (int i = 0; i < n; i++) { | ||
|
||
if (!check[i]&& number[i] != last) { //check 안되어 있고, 마지막 항과 같은 수가 아니라면 | ||
seq[cnt] = number[i]; // 첫번째 인덱스에 number 값 입력 | ||
last = seq[cnt]; | ||
check[i] = true; | ||
backtracking(cnt + 1); // 다음 인덱스 호출 | ||
check[i] = false; // 원상태 복귀 | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
맞아요! 이전 수열의 마지막 항과 새로 추가할 값이 같으면 중복된 수열이 된다는 점을 활용하면 되는 문제였어요.
기본 재귀 순열에서 이전에 선택된 값을 저장하는 last 변수를 사용하여
cnt 번째 같은 숫자가 중복되서 사용되지 않도록 구현해주셨네요!🥰
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
p2. 10971 코드리뷰 완료
하늘님 안녕하세요 😊 우선 리뷰가 늦어진 점 정말 죄송합니다 😭
함수화도 잘해주시고, 코드 너무 잘 짜주셔서 특별히 드릴 코멘트는 없었습니다! 주석도 잘 써주셔서 너무 좋았어요 🥰
코드량을 더 줄일 수 있는 방향으로 코멘트 남겼으니 확인해주셔도 좋을 것 같습니다 💘
수정사항이나 질문 있으면 언제든 리뷰어로 호출해주세요
이번 과제도 수고하셨습니다 🥰
//연산 | ||
check[0] = true; | ||
route[0] = 0; // 원순열이므로 첫번째 값을 고정시킨다. | ||
backtracking(1); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
싸이클의 성질을 파악해서 시작점 0에서만 돌아도 괜찮다는 사실을 아주 잘 캐치해주셨네요!! 최고입니다~~! 👍👍👍
for (int i = 1; i < n; i++) { // 비용 계산 | ||
if (w[route[i - 1]][route[i]] == 0) { // 갈 수 있는 길이 없다면 그 route 버림 | ||
break; | ||
} | ||
sum += w[route[i - 1]][route[i]]; | ||
|
||
if (i == n - 1 && w[route[n - 1]][route[0]] != 0) { // 마지막 도시에서 원래 도시로 돌아갈 때 갈 수 있는 길이 있다면 그 비용까지 더함 | ||
sum += w[route[n - 1]][route[0]]; | ||
result.push_back(sum); | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
p2. 이동 경로를 배열에 저장해서, 한 번에 비용을 구해주셨네요~! 해당 방식도 너무 좋지만, 코드가 약간 길어진다는 단점이 있을 거 같아요! 😥
재귀함수의 매개변수를 활용해서 비용을 관리해주면 코드를 훨씬 줄일 수 있을 거 같습니다~! 즉, 탐색을 하는 과정에서 바로바로 이동 가능한 경우에 대해, 비용을 매개변수에 더해서 다음 탐색을 불러주는 거죠! 💘
void findMin() { //최소 비용 계산 | ||
int min = result[0]; | ||
|
||
for (int i = 1; i < result.size(); i++) { | ||
if (min > result[i]) { | ||
min = result[i]; | ||
} | ||
} | ||
cout << min; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
p2. 가능한 이동 비용들을 배열에 모두 저장해둔 후에, 최소값을 찾아주셨네요! 😊 해당 방식도 좋지만, 배열 + 최소값 찾기(O(N)) 까지 해서 시간과 메모리가 들고 있어요.
변수를 활용해서 바로바로 최소값을 비교하면 시간과 메모리를 아끼는 로직을 짤 수 있을 것 같아요! 🥰
내용 & 질문
<기존 제출>
<추가 제출>