작성
·
391
·
수정됨
0
<< 코드는 하단에 링크로 첨부하였습니다. >>
안녕하십니까 큰돌 선생님
백준 3273 두 수의 합 문제를 30분 여유 시간 안으로 생각하고 먼저 풀어보려고 했는데 틀렸다고 나와서 질문 드리려 합니다.
문제에서 보여준 예제 경우는 정답이 맞게 나왔지만 3% 쯤에서 틀렸다고 나옵니다. 그런데 왜 틀렸는지 모르겠습니다.
수열을 정렬하고, 오른쪽 j인덱스를 줄여나가면서 왼쪽 i의 0번째 부터 탐색하면서 x와 값이 같으면 cnt++ 하는 로직을 떠올리고 구현했습니다.
선생님이 작성하신 코드의 로직과 어떤 차이가 있는 것인지 파악을 못해서 틀린 것 같습니다. 제 코드를 봐주시고 피드백 주시면 감사하겠습니다.
Q1. 위에서 설명한 저의 로직이 어떤 부분에서 부족한가요?
Q2. 선생님의 코드와 비교해서 분석한다면 어떤 부분이 다른건가요?
읽어주셔서 감사합니다..
http://boj.kr/ee88cf1f8b544d1cb9dfb0617b018d9a
PS. 선생님 덕분에 타기업 코테도 풀어볼 수 있었습니다. 쨔쓰!
비록 면접도 전에 탈락했지만 자신감 얻고 쭉쭉가겠습니다. 이왕 이렇게 된 거 코테 마스터 하겠습니다... (대충 질문 폭격해서 괴롭힐 수 있다는 떡밥)
답변 1
1
안녕하세요 진살라님 ㅎㅎ
int i = 0; int j = n-1;
for(i = 0; i < j; i++) {
if(a[i] + a[j] == x) cnt++;
//cout << j << " ";
j--;
}
이 코드요. 만약 요소가 같은 값을 가진게 나오면 처리가 가능할까요?
예를 들어 이런 반례요.
9
2 2 2 2 2 2 2 2 2
4
진살라진님의 코드 : 4
올바른 답 : 8
이러한 반례 때문에 틀린코드가 되는 것 같습니다.
Q1. 위에서 설명한 저의 로직이 어떤 부분에서 부족한가요?
>> 부족하다기 보다는 반례를 처리를 못하는 코드인 거 같아요. 그부분만 고려를 해주시면 됩니다. 문제에서 "중복된 수"는 나오지 않는다면 진살라진님의 코드는 맞는 코드가 되거든요.
예를 들어 다음과 같은 예제는 잘 나오게 됩니다.
4
1 2 3 4
5
Q2. 선생님의 코드와 비교해서 분석한다면 어떤 부분이 다른건가요?
>> 반례를 처리함과 안함의 차이인 거 같아요. 발상은 잘하셨고 아마 문제의 예제1의 경우 중복된 게 없기 때문에 그런 생각을 하신 거 같은데 항상 문제 예제 뿐만 아니라 범위를 보면서 중복되는게 나오지 않을까? 또는 중복된게 안나오지 않을까?를 생각하시는게 중요해요. 주어진 예제말고 반례가 뭐가 있을까? 하면서 방어적으로 말이죠.
PS. 선생님 덕분에 타기업 코테도 풀어볼 수 있었습니다. 쨔쓰!
>> ㅎㅎ 합격하셨다는 말씀이신거죠? ㅎㅎ 축하드립니다. (수강평에 합격했다는 말도.. 좀 ㅎㅎ 아시죠? 하하)
이왕 이렇게 된 거 코테 마스터 하겠습니다... (대충 질문 폭격해서 괴롭힐 수 있다는 떡밥)
>> ㅋㅋ 네 궁금한 거 있으시면 또 질문해주세요.
감사합니다.