작성
·
177
0
틀림 : http://boj.kr/c88d25cdc0f84dde8e514e76a3c1922c
맞음 : http://boj.kr/fe1fa40620684850858da688bb523df0
두 코드는 강사님 코드랑 동일한데 오직 다른 점은
while (e < N){
if (!cnt[a[e]]){
cnt[a[e]]++;
e++;
}
else {
ret += (e - s);
cnt[a[s]]--;
s++;
}
}
여기서 cnt[a[s]]를 틀린 코드는 cnt[a[e]]를 했다는 거 뿐인데
여기서 else에 걸렸다는 것은 중복된 수를 만났다는 것이고 그러면 a[e]와 a[s]의 값이 같으니까 결국
cnt[a[e]]-- 를 하나 cnt[a[s]]--를 하나 동일한 일을 하는 게 아닐까요?
문제의 테스트케이스는 또 다 맞는데 어떤 차이가 있나요?
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
SEOL님, 제시해주신 소스 코드를 보면, cnt[a[e]]--
와 cnt[a[s]]--
는 매우 유사해 보이지만, 실제로는 다른 작동을 합니다. 여기서 변수 e
와 s
는 각각 배열 a
의 끝 인덱스와 시작 인덱스를 가리킵니다.
else
조건에 들어갔을 때, 즉 중복된 원소를 만났을 때, cnt[a[s]]--
를 수행하는 것은 집합에서 s
인덱스에 해당하는 원소의 개수를 감소시키는 것을 의미하는 반면, cnt[a[e]]--
를 수행한다면 실제로는 아직 집합에 추가되지 않은 e
인덱스의 원소의 카운트를 감소시키는 것이므로, 논리적 오류가 발생합니다.
이는 e
인덱스의 원소가 아직 집합에 포함되지 않았으므로(cnt[a[e]]++
되기 전이므로), cnt[a[e]]--
를 진행하면 원하지 않는 결과, 즉 개수가 음수가 될 수 있으며 이는 중복 체크 로직에 영향을 미칠 수 있습니다.
따라서 올바른 로직은 cnt[a[s]]--
를 통해 현재 집합에 있는 s
위치의 원소 개수를 줄이는 것입니다. 이렇게함으로써, 중복 없이 연속된 부분의 길이를 정확하게 계산할 수 있게 됩니다.
질문하신 내용과 관계없이 인프런 이용과 관련하여 궁금하신 점이 생기면 언제든지 문의해주시길 바랍니다. 감사합니다.