
어제 리버싱 기초 구조와 helper, 역산 개념을 정리한 상태에서 오늘은 실제로 문제를 풀면서 그 개념들이 어떻게 적용되는지 확인하는 단계로 넘어왔다. 단순히 이해하는 것과 직접 문제를 풀어보는 것은 생각보다 차이가 컸고, 오늘은 그 차이를 느끼는 하루였다.
어제까지만 해도 helper를 식으로 정리하고 역산하면 된다고 생각했는데, 실제 문제를 풀다 보니 그보다 더 중요한 포인트가 하나 있었다. 바로 “조건이 어디에 걸리는가”였다. 처음에는 단순히 input 값이 조건을 만족하면 된다고 생각했지만, 문제를 분석해보니 조건은 대부분 helper 연산 중간 단계의 값에 걸려 있었다.
예를 들어 t = t + 2 이후 t = t ^ 0x20 상태에서 조건이 걸리는 경우, 우리가 확인해야 하는 값은 최종 결과가 아니라 이 중간 단계의 t 값이었다. 이걸 놓치면 역산을 아무리 정확하게 해도 결과가 틀리게 된다. 실제로 오늘 문제를 풀면서도 이 부분을 한 번 놓쳐서 다시 계산을 해야 했다.
또 하나 확실하게 느낀 점은, 리버싱은 단순히 “계산해서 답을 구하는 과정”이 아니라 “답이 존재하는지 판단하는 과정”이기도 하다는 것이다. 특정 key 값이 주어졌을 때, 조건 시점의 값이 범위를 벗어나면 그 문제는 애초에 성립하지 않는다. 즉, input을 아무리 바꿔도 조건을 통과할 수 없는 구조가 존재한다는 걸 직접 확인할 수 있었다.
이 과정에서 자연스럽게 계산 순서도 정리됐다. 처음에는 input을 바로 구하려고 했는데, 지금은 순서가 명확해졌다. 먼저 key를 기준으로 조건 시점의 값을 역산하고, 그 값이 조건을 통과하는지 확인한 뒤, 통과하는 경우에만 input을 계산하는 방식이다. 이 순서를 지키는 것만으로도 불필요한 계산을 줄일 수 있었다.
또한 같은 연산처럼 보이더라도 실제로는 결과가 달라질 수 있다는 점도 중요했다. 예를 들어 +1과 -1이 함께 있는 구조와 +2와 -2가 함께 있는 구조는 겉보기에는 비슷하지만, 조건이 중간에 들어가는 순간 완전히 다른 결과를 만든다. 이 부분은 단순히 식으로만 보면 놓치기 쉬운 부분이었는데, 문제를 직접 풀어보면서 체감할 수 있었다.
오늘은 특히 “거의 맞았는데 틀리는” 경험을 여러 번 했다. 계산 자체는 맞았지만 마지막 값에서 실수가 나거나, 조건 시점을 잘못 잡아서 틀리는 경우였다. 이걸 통해 느낀 점은 지금 단계에서는 개념보다 정확도가 더 중요하다는 것이었다. 방향은 맞기 때문에, 이제는 실수를 줄이는 쪽으로 연습해야 할 시점이라는 생각이 들었다.
어제까지는 구조를 이해하는 단계였다면, 오늘은 그 구조를 실제로 적용하면서 흐름을 몸에 익히는 단계였다. 아직 완전히 빠르게 풀 수 있는 수준은 아니지만, 문제를 보면 어떤 순서로 접근해야 하는지는 명확하게 보이기 시작했다.
다음 단계에서는 조건이 여러 개 섞여 있는 문제나, helper 구조가 조금 더 복잡한 문제를 풀면서도 이 흐름을 유지할 수 있는지 확인해볼 생각이다. 결국 중요한 건 새로운 개념을 계속 배우는 것이 아니라, 지금 알고 있는 구조를 얼마나 안정적으로 사용할 수 있느냐라는 걸 느낀 하루였다.