Skip to content
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

[3월 18일] 브루트포스 #5

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open

[3월 18일] 브루트포스 #5

wants to merge 1 commit into from

Conversation

wonjinyoo
Copy link
Collaborator

내용 & 질문

1759번 문제는 틀린 코드입니다.. 피드백 해주시면 참고하여 이후 수정하겠습니다!

<기존 제출>

10757, 1759, 2503, 2798, 2858번

<추가 제출>

X

10757, 1759, 2503, 2798, 2858번 제출합니다
Copy link

@flowersayo flowersayo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

필수 2문제, 선택2문제 해서 총 4문제 제출 확인되셨습니다! 브루트포스 문제가 쉽지 않았을텐데,, 4문제나 해결해주시다니 정말 감사합니다 👍 1759가 틀렸던 이유는 코드리뷰 커멘트에 달아놓았습니다! 1759번도 해결하신다면 쿠폰 하나 적립해드리겠습니다 😊 p1은 꼭 수정해주셨으면 하는 부분이고 p2,p3는 참고만 해주셔도 좋아요! 코드 수정하시고 저 리뷰어로 호출해주세요~!

for (int i = l; i < c; i++) temp.push_back(0);

// 정렬해야
sort(ch.begin(), ch.end());
Copy link

@flowersayo flowersayo Mar 24, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

p1.
지금 조합을 구하기 위해서 tmp 벡터에 l개만큼 1을 넣어주시고 next_permutation 을 돌려주셨네요! 그러나 next_permutation 을 활용하기 위해서는 temp 벡터에 반드시 오름차순 정렬을 먼저 수행해주셔야합니다. next_permutation 은 현재 수보다 다음으로 큰 수를 찾는 방식으로 모든 순열을 구하는 함수이기 때문입니다! 반면 현재 tmp 벡터는 1,1,1,1,0,0 로 초기화 되어있으니 (c=6, l=4일때를 예시로 들음) 다음번째로 큰 수가 존재하지 않으므로 모든 경우의 수를 구하지 못하고 조합 하나만 반환할 것입니다! 그래서 아래와 같이 정렬 후 활용해주셔야 모든 경우의 수를 구할 수 있습니다!

// permutation 위해서, temp 벡터에 l개 만큼 1을 넣어준다
	for (int i = 0; i < l; i++) temp.push_back(1);
	for (int i = l; i < c; i++) temp.push_back(0);

	
	sort(ch.begin(), ch.end());
	sort(temp.begin(), temp.end()); // temp 를 오름차순 정렬

	do {
		for (int i = 0; i < c; i++) {
			// 모음 개수
			int v_cnt = 0;

			if (temp[i] == 1) {
				cout << ch[i]<<" ";
			}
		}
		cout << '\n';
	} while (next_permutation(temp.begin(), temp.end()));

그러나 사실 위 결과대로 출력해도 제대로된 결과를 얻지 못합니다. 왜냐하면 모든 경우의 수를 구할 수는 있지만, 사전순으로 단어들을 출력하지는 못하기 때문입니다. temp를 오름차순 정렬한 후 next_permutation으로 조합을 구하면 temp는 반복문을 돌때마다 아래와 같은 변화를 거치게 됩니다.

 0 0 1 1 1 1 
 0 1 0 1 1 1 //  0 0 1 1 1 1 보다 다음번째로 큰수 
 0 1 1 0 1 1 //   0 1 0 1 1 1 보다 다음번째로 큰수 
  ...
 1 1 1 1 0 0

따라서 위 코드의 결과는 아래와같이 사전순과 정 반대되는 순서로 문자열을 출력하게 됩니다!
20220324152027

이럴때에는 내림차순 정렬된 컨테이너에서도 조합을 구할 수 있도록 해주는 prev_permutaion을 이용해볼 수 있습니다! 관련 링크 첨부하니 참고하셔서 문제 해결에 도움이 되었으면 하는 바람입니다 :)

https://twpower.github.io/82-next_permutation-and-prev_permutation

res.push_back(ch[i]);
if (ch[i] == 'a' || ch[i] == 'e' || ch[i] == 'i' || ch[i] == 'o' || ch[i] == 'u') v_cnt++;

if (i == c - 1 && v_cnt < 1) continue;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

p1.
v_cnt < 1 일 경우는 어짜피 조건문에 걸리지 않으니 굳이 적어주지 않아도 될 것 같아요!

int v_cnt = 0;
if (temp[i] == 1) {
res.push_back(ch[i]);
if (ch[i] == 'a' || ch[i] == 'e' || ch[i] == 'i' || ch[i] == 'o' || ch[i] == 'u') v_cnt++;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

p1.
지금 모음이 하나이상있는지 체크하는 부분은 있는데 자음이 두개이상 최소 존재하는지 체크하는 부분이 없네요!

else if (i == c - 1 && v_cnt >= 1) {
for (int j = 0; j < l; j++) cout << res[j];
}
else continue;
Copy link

@flowersayo flowersayo Mar 24, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

p1.
이 부분도 마찬가지에요 어짜피 반복문에 끝에 위치하니 continue가 의미 없겠죠!

// j,k는 각각 i,j의 다음(즉, i+1, j+1)부터라는 게 중요
for (int i = 0; i < n - 2; i++) {
for (int j = i + 1; j < n - 1; j++) {
for (int k = j + 1; k < n; k++) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

p2.
지금도 잘 작성해주셨는데요 ! 세장의 카드를 뽑는 반복문은 보통 이런식으로 많이 작성하는것 같아요!👍

for (int i = 0; i < n; i++) {
        for (int j = i + 1; j < n; j++) {
            for (int k = j + 1; k < n; k++) {

// 여기서 시간 오래 걸림.. 문제 조건 제발 잘 확인!!!
// 0 사용 불가 & 각 자리수 다 다른 숫자임!!
if (x[0] == '0' || x[1] == '0' || x[2] == '0' || x[0] == x[1] || x[1] == x[2] || x[0] == x[2]) continue;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

숫자에 0이 포함되어있을 경우 답으로 카운트될 수 없다는 코너케이스를 잘 캐치해주셨네요👍👍👍

if (x[0] == '0' || x[1] == '0' || x[2] == '0' || x[0] == x[1] || x[1] == x[2] || x[0] == x[2]) continue;


// 숫자 i에 대해 숫자 야구 진행해서 -> 모든 테스트 케이스와 각각의 결과 같은지 비교

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

맞아요! 모든 경우의 수를 다 해보는 것 이게 바로 브루트포스죠 👍

// 모든 테스트 케이스에 대해 결과값 같을 때 해당하는 정수 i를 ans 벡터에 넣어줌
if (test_strk == strk[j] && test_ball == ball[j]) {
if (j == n - 1) ans.push_back(i);
continue;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

p1.
이부분 continue도 불필요한 것 같아요!

if (j == n - 1) ans.push_back(i);
continue;
}
else break;
Copy link

@flowersayo flowersayo Mar 24, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

p1.
반복문을 n회 돌때마다 매번 조건을 체크하는데다가 n회중 마지막 1번만 조건이 참이 될테니 반복문안에서 확인하는 것은 조금 비효율적이어보여요! 이부분은 for문 밖에 작성하면 마지막루프인지 확인하는 if (j == n - 1) 라는 중첩 if문을 작성할 필요가 없어지는데다가 한번의 조건 체크만으로도 가능해지니 훨씬 깔끔할 것 같아요! 그런데 물론 모든 테스트케이스가 일치했는지 저장해주는 bool변수가 추가적으로 필요하겠죠,,!

up = (a.top() + b.top() + up) / 10;
a.pop();
b.pop();
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

p2. 먼저 두개의 스택이 비어있지 않을 동안 값들을 계산하는 처리를 먼저 해주고, 그 이후에 A,B 스택에 남아있는 값들을 처리해주어도 괜찮았을 것 같아요! 아래 코드처럼요!

`while(!a.empty() && !b.empty) {
 //값 더하고 res에 푸시  }
while( !a.empty())  {// a에 원소가 남아있다면
 }
while( !b.empty()){  // b에 원소가 남아있다면
 }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants