본문 바로가기

CodingTest

[코드트리 후기] 구현/조건문(겹치는 경우) 알고리즘 분석하기

 

코딩테스트를 준비하다 보면 거창한 알고리즘(DP, BFS 등)이 아니더라도, 은근히 발목을 잡는 기초 유형들이 있습니다. 조건문을 조금만 잘못 짜면 예외 케이스에서 오답이 나게 됩니다. 오히려 이런 부분들은 유명한 DP, BFS 알고리즘처럼 공식화되어있거나 잘 정리되어 있는 것을 찾기 어려운 것 같아요. 이러한 부분들을 개인적으로 터득하기 위해선 여러 문제를 풀어보며 익히고 스스로 정리해서 파악할 수 밖에 없다고 생각합니다. 그러나 코드트리에서 학습한다면, 유형별로, 단계별로 구분되어 웬만한 유형을 다 파악할 수 있습니다 :) 

 

대표적으로 이번 게시물에선, 코드트리(CodeTree)의 Novice Mid 단계, Chapter 9. Lesson 1 겹치는 경우 파트를 중점적으로 알아보겠습니다.

 

🌳 코드트리만의 커리큘럼 구조

백준이나 프로그래머스 같은 타 플랫폼에서 문제를 풀 때는 '맨땅에 헤딩'하는 기분이 들 때가 많았습니다. 관련 개념을 모르면 구글링을 통해 파편화된 지식을 모아야 했죠.

하지만 코드트리는 [개념 학습] -> [기본 문제] -> [연습 문제] -> [테스트]로 이어지는 레슨 단위의 체계적인 커리큘럼을 제공합니다. 이번에 학습한 '겹치는 경우'에서도 단순히 문제만 툭 던져주는 것이 아니라, 시각적인 자료(그림)와 함께 수학적 접근법을 먼저 제공합니다. 이러한 구조 덕분에 '이 문제는 어떤 원리로 접근해야 하는가'에 대한 본질적인 이해도가 훨씬 높아졌습니다.

💡 풀이 감각의 변화: "겹치는 걸 찾지 말고, 안 겹치는 걸 찾자!"

이전에는 두 선분이나 직사각형이 겹치는지 확인할 때, '어떤 점이 다른 선분 안에 포함되는가'를 일일이 조건문으로 만들려다 보니 코드가 끝없이 길어지고 가독성도 떨어졌습니다.

하지만 코드트리의 개념 설명을 보고 망치로 머리를 맞은 듯한 깨달음을 얻었습니다. "겹치는 경우를 바로 판단하기에는 가짓수가 너무 많기 때문에, 반대로 겹치지 않는 경우가 언제인지를 생각한다"는 여집합의 논리였습니다.

1. 1차원 직선 상의 두 선분 교차 문제 [x1, x2]와 [x3, x4]가 있을 때, 겹치지 않는 경우는 딱 2가지뿐입니다.

  • case 1) x2 < x3 (첫 번째 선분이 완전히 왼쪽에 있을 때)
  • case 2) x4 < x1 (두 번째 선분이 완전히 왼쪽에 있을 때) 이 두 가지를 제외한 나머지는 무조건 겹치는 경우(intersecting)로 처리하면 끝이었습니다. (입력 예제 1 5 4 6의 경우 위 조건에 해당하지 않으므로 교차함)
x1, x2, x3, x4 = map(int, input().split())

if x1<=x3 and x2>=x3 :
    print('intersecting')
elif x3<=x1 and x4>=x1:
    print('intersecting')
else:
    print('nonintersecting')

 

2. 2차원 평면 상의 두 직사각형 겹침 문제 1차원에서의 깨달음은 2차원으로 자연스럽게 확장되었습니다. 기본-연습 문제를 따라가다 보니, 직사각형 문제도 x축과 y축 각각에 대해 '안 겹치는 조건'만 걸러내면 된다는 것을 스스로 유추할 수 있었습니다.

제가 작성해서 통과한 코드는 다음과 같습니다.

 
x1, y1, x2, y2 = map(int, input().split())
a1, b1, a2, b2 = map(int, input().split())

# 겹치지 않는 4가지 경우를 OR 조건으로 묶어 필터링
if x2 < a1 or a2 < x1 or y2 < b1 or b2 < y1:
    print("nonoverlapping")
else:
    print("overlapping")

과거의 저였다면 꼭짓점 4개의 위치를 다 비교하고 있었겠지만, 지금은 단 4줄의 직관적인 조건문으로 문제를 깔끔하게 해결할 수 있게 되었습니다.

 

🔍 해설 및 모범코드 제공

문제를 풀고 난 후, 코드트리에서 제공하는 모범코드와 해설을 확인하는 과정도 큰 도움이 되었습니다. 내가 푼 방식이 우연히 맞은 것인지, 아니면 출제자가 의도한 최적의 방식인지 바로 점검할 수 있기 때문입니다. 특히 깔끔하게 그려진 좌표 일러스트들은 텍스트로만 이해하기 어려운 기하학적 조건들을 한눈에 파악하게 해주어 학습 효율을 극대화해주었습니다.

앞으로도 코드트리의 커리큘럼을 믿고, 비어있는 알고리즘 기초 개념들을 차근차근 채워나가려 합니다. 저처럼 특정 조건 분기나 구현에서 자꾸 헷갈리시는 분들이라면 꼭 코드트리의 개념 학습을 따라가 보시길 추천합니다!

 

🔗 코드트리로 코딩테스트 준비하러 가기: https://www.codetree.ai