작성
·
268
1
안녕하세요 큰돌님. 현재 강의를 듣고 있는 수강생입니다. 현재 1-L문제를 Vector형식에서 이중 for문을 이용해서 푸는데 고유한 값을 만들 수 있는 두개의 값이 있을 경우 이후 두개의 값을 0으로 처리하여 첫 번째 for문에서 0이 있을 경우 두 번째 for문으로 들어가지 않게 처리를 했는데요. 그 처리를 하니 백준에서 틀렸다고 나옵니다. 하지 않았을 경우에는 맞다고 표시가 되고요. 그래서 이유가 뭔지 궁금합니다.
답변 2
0
안녕하세요 ㅎㅎ
하지 않았을 경우에는 맞다고 표시가 되고요.
>> 이부분 공유가능하신가요?
저도 어느정도는 고쳐봤는데 아직입니다 ㅠ
#include <bits/stdc++.h>
using namespace std;
int N, M, a, c;
vector<int> v;
int main()
{
cin >> N >> M;
for(int i = 0; i < N; i++)
{
cin >> a;
v.push_back(a);
}
for(int j = 0; j < N; j++)
{
if(M - v[j] < 0) continue;
if(v[j] == M - v[j]) continue;
if(v[j] == 0) continue;
for(int k = j + 1; k < N; k++)
{
if(v[j]+v[k]==M)
{
v[j]=0;
v[k]=0;
c++;
break;
}
}
}
cout << c << "\n";
return 0;
}
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다.
dkstmdwns67님, 말씀하신 1-L 주몽 문제와 관련해 유사한 상황에 대한 질문과 답변이 있었습니다. 해당 질문에서는 주어진 문제에서 특정 처리를 할 때와 하지 않았을 때의 차이점을 논의하고 있습니다. 강의의 지식공유자께서는 질문자가 제공한 코드의 특정 부분(예: if(a[i] && m - i > 0 && a[m - i])
에서의 i == m - i
검사 누락)에서 문제가 발생할 수 있다고 언급하며 해결 방법을 제공하고 있습니다. 이러한 경우, 이미 투표되거나 처리된 원소를 다시 확인하지 않도록 주의해야 합니다.
이와 유사한 상황이실 경우, 아래 URL에서 제공되는 답변의 해결책이 도움이 될 것 같습니다.
해당 답변에서 지식공유자께서 제공한 예시 코드는 다음과 같습니다:
#include <bits/stdc++.h>
using namespace std;
int n, m, ret, tmp, a[100001];
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> n >> m;
// 예외 상황 처리
if(m >= 200000){
cout << 0;
exit(0);
}
for(int i=0; i < n; i++){
cin >> tmp;
a[tmp] = 1;
}
for(int i = 1; i <= 100000; i++){
if(i == m - i) continue; // 같은 원소를 두 번 사용하는 경우 제외
if(a[i] && m - i > 0 && a[m - i]){
ret++;
a[i] = 0; // 이미 사용된 원소 처리
}
}
cout << ret;
return 0;
}
이 코드는 i == m - i 인 상황을 제외하는 로직을 포함하고 있으며, 이는 같은 원소를 두 번 사용하는 경우를 배제하기 위함입니다. 만약 문제가 계속되면 위의 URL을 방문하여 보다 상세한 지식공유자의 답변을 확인하시거나, 추가 질문을 통해 해결을 도모하실 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
http://boj.kr/ae68e8274e574f06af1334b37723865e
해당 코드 링크입니다. 기존 코드에서 v[j]=0, v[k]=0을 주석처리를 했습니다.