본문 바로가기

겪은 오류와 해결책

[알고리즘] LeetCode에서 전역 변수 (static) 쓸 때 초기화 꼭 해줘야 해요!

1. 겪었던 문제

LeetCode 문제를 풀며, 로직이 맞는 것 같은데도, 제출 시 계속 답이 틀리게 나와서, Debuging을 해보았습니다.
제가 풀었던 문제는 이것입니다.

문제를 안 푸셔도 알 수 있게 간단히 말씀드리면,
target에 있는 값을 key = target[i], value = i 로 해서 map에 집어넣으려고 했습니다. target의 값은 다음과 같았습니다.

target = [5,10,8,11,3,15,9,20,18,13]

근데 System.out.println()으로 찍어보니 다음과 같이 나왔습니다!

{1=3, 2=5, 3=4, 4=1, 5=0, 6=0, 8=2, 9=6, 10=1, 11=3, 13=9, 15=5, 18=8, 20=7}

target에 없는 1이나 2 같은 값이 들어있던 것입니다. map에 값을 집어넣는 로직은 맨 처음 한 번 뿐이라 너무 당황했습니다.
그래서 값을 넣을때마다 출력을 다시 해보니

After inserting 5: {1=3, 2=5, 3=4, 4=1, 5=0, 6=0, 8=2}
After inserting 10: {1=3, 2=5, 3=4, 4=1, 5=0, 6=0, 8=2, 10=1}
After inserting 8: {1=3, 2=5, 3=4, 4=1, 5=0, 6=0, 8=2, 10=1}
After inserting 11: {1=3, 2=5, 3=4, 4=1, 5=0, 6=0, 8=2, 10=1, 11=3}
After inserting 3: {1=3, 2=5, 3=4, 4=1, 5=0, 6=0, 8=2, 10=1, 11=3}
After inserting 15: {1=3, 2=5, 3=4, 4=1, 5=0, 6=0, 8=2, 10=1, 11=3, 15=5}
After inserting 9: {1=3, 2=5, 3=4, 4=1, 5=0, 6=0, 8=2, 9=6, 10=1, 11=3, 15=5}
After inserting 20: {1=3, 2=5, 3=4, 4=1, 20=7, 5=0, 6=0, 8=2, 9=6, 10=1, 11=3, 15=5}
After inserting 18: {1=3, 2=5, 3=4, 4=1, 5=0, 6=0, 8=2, 9=6, 10=1, 11=3, 15=5, 18=8, 20=7}
After inserting 13: {1=3, 2=5, 3=4, 4=1, 5=0, 6=0, 8=2, 9=6, 10=1, 11=3, 13=9, 15=5, 18=8, 20=7}
{1=3, 2=5, 3=4, 4=1, 5=0, 6=0, 8=2, 9=6, 10=1, 11=3, 13=9, 15=5, 18=8, 20=7}

이미 최초의 5를 넣을 때부터, 다른 값들이 들어가 있었습니다.

2. 문제 해결

문제의 원인은 LeetCode에서 전역(static) 변수를 쓰면, 하나의 TC가 끝났을 때, 전역 변수가 초기화 되지 않는다.는 점 이었습니다. 그래서 이전 TC의 값들이 그대로 남아있었던 것입니다!
따라서 LeetCode로 문제를 풀 때는 전역 변수 사용을 지양 하거나, 꼭 값 반환 전에 모든 static 변수를 초기화하는 과정이 필요할 것 같습니다.