삭제
통합검색 닫기
support
HOME Support 사이트 오류 제보

Q&A

사이트 오류 제보

Q&A 내용
Q [Code] (1년 전 끌올) 15999. Inversion Counting (교육용) 채점 오류 제보 개선완료
기윤호_24018683 문의일2024-03-19 12:18
Solving Club 23년 동계 대학생 S/W 알고리즘 역량강화 과정 Q&A 게시판에서 처음 제보했는데 1년이 지난 지금도 아직 반영이 안 되어 다시 제보 드립니다. 최초 제보 시각은 2023-03-03 19:08입니다: https://swexpertacademy.com/main/talk/solvingClub/boardCommuView.do?solveclubId=AYWjN5DaiAsDFAQK&commuId=AYamyS_67KsDFAQ9

12818. Inversion Counting은 정답 코드뿐 아니라 잘못된 코드도 정답으로 채점하고 있습니다: https://swexpertacademy.com/main/talk/codeBattle/problemDetail.do?contestProbId=AXulYPbKpDQDFATN&categoryId=AYWab_JKjkwDFAQK (링크 만료)

공개된 다른 문제 중 15999. Inversion Counting (교육용)은 심지어 정답 코드는 오답으로, 잘못된 코드를 정답으로 채점하고 있습니다: https://swexpertacademy.com/main/code/userProblem/userProblemSolver.do?contestProbId=AYXw5QA6RMEDFARc

해당 문제의 정답 코드 중 김성렬 교수님께서 작성하신 것으로 추정 되는 코드는 정답 채점 되기는 했으나 사실은 1가지 이상 오류를 고쳐야 하는 잘못된 코드입니다.
1. (필수) 17번째 줄의 if (MS[lvl+1][i] <= MS[lvl+1][j]) -> if (MS[lvl+1][i].first <= MS[lvl+1][j].first)
2. (선택) 7번째 줄의 int ans; -> long long ans;
3. (선택) 45번째 줄의 int solve() -> long long solve()

수정 결과는 다음과 같습니다:
#include <bits/stdc++.h>
using namespace std;

int A[1000000], B[1000000], C[1000000], D[1000000];
int N, M, K, Q;

long long ans;
pair< int, int > MS[20][1000000];

void Merge(int lvl, int l, int r)
{
int i, j, k, m, le, re;
m = (l+r)/2;
i = l; j = m+1; k = l;
le = m; re = r;
while (i<=le && j<=re) {
if (MS[lvl+1][i].first <= MS[lvl+1][j].first)
MS[lvl][k++] = MS[lvl+1][i++];
else {
MS[lvl][k].first = MS[lvl+1][j].first;
MS[lvl][k++].second = MS[lvl+1][j++].second + le-i+1;
}
}
while (i<=le)
MS[lvl][k++] = MS[lvl+1][i++];
while (j<=re)
MS[lvl][k++] = MS[lvl+1][j++];
}

void MergeSort(int lvl, int l, int r)
{
int i, j, m;
if (l == r) {
MS[lvl][l].second = 0;
return;
}
for (i=l; i<=r; i++)
MS[lvl+1][i] = MS[lvl][i];
m = (l+r)/2;
MergeSort(lvl+1, l, m);
MergeSort(lvl+1, m+1, r);
Merge(lvl, l, r);
}

long long solve()
{
int i, j, k;
cin >> N;
for (i=0; i< N; i++)
cin >> A[i];
for (i=0; i< N; i++)
MS[0][i].first = A[i];
MergeSort(0, 0, N-1);
ans = 0;
for (i=0; i< N; i++)
ans += MS[0][i].second;
return ans;
}

int main(){
long long ans1;
cin.tie(0)->sync_with_stdio(0);
int T; cin >> T;
for (int ts=1;ts<=T;ts++) {
ans = solve();
cout << "#" << ts << ' ' << ans << '\n';
}
}

코드 수정 전후로 15999. Inversion Counting (교육용)의 TEST > RUN을 클릭하고 OUTPUT을 보면 예제 입력 input.txt에 대한 출력 output.txt과 다른 실행결과를 확인할 수 있습니다. 하지만 수정 후 정답 코드가 오히려 오답으로 잘못 채점 되는 문제가 있습니다.

마지막으로 또다른 공개된 문제인 12166. NUMBER OF INVERSION은 해당 코드 수정 전은 오답, 수정 후는 정답으로 정상 채점하니 비교해 보시기 바랍니다: https://swexpertacademy.com/main/code/userProblem/userProblemDetail.do?contestProbId=AXpNFir6f24DFATi

마찬가지로 LEARN > Course > Programming Professional SW 문제해결 심화 - Counting & Probability 강의의 3998. [Professional] Inversion Counting도 정상 채점하니 함께 비교해 보시기 바랍니다: https://swexpertacademy.com/main/learn/course/lectureProblemViewer.do?courseId=AVuPDj5qAAfw5UW6&subjectId=AWWxyRM6AhMDFAW4&lectureSeq=23&contestProbId=AWIdsYzagWYDFAVH

그러나 처음에 언급한 12818. Inversion Counting은 수정 전 코드와 수정 후 코드 모두 정답으로 인정하고 있습니다. 그래서 수정 전 코드를 오답 채점할 수 있도록 테스트케이스 보강이 필요합니다. (링크 만료)
A
답변일 2024-03-25 09:10
안녕하세요. SW Expert Academy 입니다. 
output 파일을 수정하여 반영하였습니다. 
감사합니다.