[WIL - 2주차] 컴퓨팅 사고로의 전환 (알고리즘)

이지섭·2026년 3월 12일
post-thumbnail

핵심 역량 목표

1. 문제해결 : 브론즈 수준의 문제를 AI 도움 없이 풀 수 있음. (문법적인 부분만 구글링 사용)
2. 설계 : 간단한 의사 코드를 통해 문제 해결 방법을 설계할 수 있음.
3. 구현 : 설계한 의사 코드를 설계된 내용을 파이썬 코드로 작성할 수 있음.
4. 품질 : 코드를 실행하기 전 엣지 케이스에 대해 생각해볼 수 있음.
5. 유지보수 : 스스로 짠 코드가 지나치게 복잡한 경우 개선할 수 있음.
6. 협업: 코어 타임은 최소인 2회만 만족하되, 모르는 것이 있을 때 적극적으로 알려주기
7. 태도 : 정한 계획에 맞춰 문제를 풂. (하루에 최소 1문제 이상)
- 토: basic 10개 / 일: 초급 3개 / 월: 초급 3개, 중급 2개 / 화: 중급 4개
8. 비즈니스 이해 : 문제를 해결하기 위해 사용한 코드가 어떤 비즈니스에서 어떻게 사용할 수 있을지 생각해볼 수 있음.
9. AI 활용: 풀지 못한 문제나 이해가 가지 않는 개념에 대해 AI를 이용해 빠르게 학습함.
10. 학습 민첩성 : 알고리즘을 풀기 위해 활용하는 이론 및 python 코드 및 문법을 학습할 수 있음.

학습 포인트

  • 알고리즘: 기존의 알고리즘 공부는 부족한 부분이 많았다. 과제나 시험을 풀기에 급급해서 스스로 풀기보다 AI의 도움을 받고 다른 사람의 코드를 참고하는 것을 우선으로 했다. 이번 주에 알고리즘을 공부할 때에는 최대한 이론을 내 것으로 만들기 위해 노력하는 것이 필요하다.
  • 동료 학습: 파인만 학습법이라 불리는 학습 방법이 있다. 내가 배운 내용을 그 내용을 전혀 모르는 사람에게 이해시킬 수 있을 만큼 스스로 가공하고 이해하는 것이다. 다른 사람이 어떤 개념에 대한 설명을 요청했을 때 그 개념을 설명하는 과정에서 이해하지 못한 부분을 발견하고 보완할 수 있게 된다.

구체적인 목표 및 접근 방법

이번 주차는 총 22문제의 알고리즘 문제를 푸는 것으로 구성되어 있다. basic 10문제와 난이도 하/중 문제가 각각 6개씩이다. 과제를 해결하기 위해 날짜별로 과제를 나누어 일정별로 다음과 같은 목표를 수립했다. 그리고 문제를 푸는 과정에서 AI의 활용 범위와 풀이 시간 규칙을 설정했다.

  • 일정: 토요일(basic 10문제), 일요일(초급 3문제), 월요일(초급 3문제, 중급 2문제), 화요일(중급 4문제)
  • 규칙:
    • 시간: 한 문제당 최소 30분을 혼자 고민할 것. 그러나 문제당 1시간 30분 이상을 혼자 고민하지 말 것.
    • AI 활용:
      - 바로 답을 요청하지 말 것.
      • 문제 풀이 최소 시간이 지난 경우 필요에 따라 AI에게 학습모드로 힌트를 요청할 것.
      • 시간을 초과하는 경우 구글링을 통해 풀이 과정이 있는 자료를 확인하고 그래도 이해가 가지 않을 경우 AI를 사용할 것.
      • 필요한 경우 이론, 개념, 문법과 관련된 부분에는 AI를 사용할 것.
      • 필요한 경우 코드를 검토하는 용도로는 AI를 사용할 것.

문제와 해결 과정

보통 문제의 개념을 몰라서 막히는 경우가 많았다. 그런 경우에 어떤 식으로 부족한 부분을 채웠는지 간략히 기록해보고자 한다.

토요일(basic 10문제)

백트래킹 - 조합 경우의 수 구하기

  • 개념 구글링 -> 다른 사람의 코드 참고

기존에도 알고리즘을 잘 모른다고 생각했는데, 간단한 조합 만들기 문제에서부터 막힐 줄은 몰랐다. 그래서 더더욱 현재 하고 있는 알고리즘 공부는 단순히 답을 보고 베끼는 정도가 아니라 체화할 수 있도록 학습하는 것이 중요하겠다는 생각을 했다. 그런 고로, 이 문제는 조금 오래 풀었다.

  • 백트래킹 개념 부족: 백트래킹이 정확히 무엇인지 알지 못하고 있었다. 이러한 내용은 규칙에 맞게 우선 구글링을 사용해서 알아 봤다.
  • 구현: 시간을 조금 많이 들이더라도 스스로 코드를 작성해보았다.
  • 다른 코드 참고: 구글링을 통해 다른 코드를 참고 했다. AI였는지 구글링이었는지 정확히 기억은 나지 않는다.

문제점: 백트래킹이 재귀와 상태 변화를 바탕으로 한다는 것에 너무 매몰되어서, 내가 작성한 코드가 정답에서 가까운지 먼지도 판단하지 못 했다. 결국에 마지막에 참고하기 위한 정답 코드를 보았을 때 정답에 상당히 근접한 상태였던 것으로 기억한다.
개선 방향: 문제를 푸는 것에 급급하지 말고, 최소 문제 풀이 시간인 30분 동안은 '코드 라인을 채우는 행위'보다 '어떻게 풀지 생각하는 것'에 집중하는 것이 좋겠다. 이 과정을 머릿속에서 하는 것은 어려울 수 있으므로, 종이에 써 보거나 의사 코드를 작성해보는 방법이 도움이 되겠다.

일요일(초급 6문제)

문제 목록을 전체적으로 훑어 보았는데 중급 문제가 시간이 많이 걸릴 것 같다고 생각이 되어 초급 6문제를 모두 푸는 것으로 목표를 수정하였다.

확장된 유클리드 호제법

  • 구글링 활용 -> AI 학습 모드 활용 -> 혼자서 증명 유도

개념을 잘 몰랐기 때문에 바로 구글링을 했다. 유클리드 호제법, 특히 확장된 유클리드 호제법 같은 경우에 인터넷에서 만족할 만한 자료를 찾기가 쉽지 않았다. 3시간 이상을 문제를 풀기 위한 개념을 이해하는 데에만 투자했던 것 같다. 이 과정에서 새벽까지 머리가 돌아가지 않는 상태로 문제를 붙들고 있으면 안 되겠다는 것을 절절히 깨달았다.
그리고 개념에 대한 이해 부분은 구글링보다도 AI를 사용하는 것이 낫겠다는 생각이 들었다. 개념을 공부하는 것은 빠르게 이루어져야 하는데, 그 과정에서 인터넷의 자료를 참고하는 것은 시간 소요가 크다. 사람이 쓰다보니 생략되거나 그 사람의 사고 과정을 유추해야 하는 문제가 있기 때문이다.

개념을 배워야 할 때는 AI의 학습모드를 적극적으로 이용하자.

ChatGPT의 학습모드를 이용해서 확장된 유클리드 호제법의 점화식을 유도하는 방법을 학습하고, 해당 내용을 다시 화이트보드에 혼자서 써보면서 내용을 체화하는 시간을 가졌다.

백준 단어 공부 문제

https://www.acmicpc.net/problem/1157

  • 혼자 풀기 -> 백준 공개된 정답과 AI 활용하여 개선 코드 찾기

이 문제의 경우에는 주변에서 풀었다는 말을 듣고 너무 쉽게 생각하고 조급해 했다가 오히려 잘 풀지 못했던 문제였다.
'처음부터 짧고 간결한 코드를 짜겠다'는 생각보다는 '일단 어떻게 문제를 해결할지 구상하고 돌아가는 코드를 만들어보자'는 마음으로 접근하는 것이 좋겠다.

그리고 내가 짠 코드가 반복되는 부분이 많고 좋지 않아 보인다면 다른 사람의 코드를 참고하는 것이 큰 도움이 될 수 있다는 것을 느꼈다. 단어공부 문제의 경우에도 알파벳은 26개의 고정된 수라는 걸 이용해서 직접 array를 만들어 개수를 세는 패턴을 사용하는 코드가 더 효율적인 코드였는데, 나라면 생각하지 못 했을 방법이다.

더 나은 코드가 있을지 다른 사람의 코드를 보는 것은 큰 도움이 되겠다.

월요일(중급 3문제)

꼬리 재귀

  • 이동석 코치님 알고리즘 기초 강의 중 언급 -> 개념 이해를 위해 ChatGPT 학습 모드 이용

들어 본 적 있는 개념이지만 잘 모르는 내용들도 내가 짚고 넘어가야 할 것들 중 하나이다. 꼬리 재귀도 알고리즘 기초 강의 중 간단히 언급되었던 키워드이다. 알고 있지만 잘 모르기에 이것은 ChatGPT의 학습 모드를 이용해서 학습했다.

꼬리 재귀의 핵심 내용: 재귀 함수 반환 후 남아 있는 연산이 없도록 한다. (return == 종료를 의미하도록 구성) 지금까지 이해한 바로는 결과값을 파라미터로 넘겨서 전파시킨다. (accumulator 패턴)

TCO(Tail Call Optimization) 개념으로 컴파일러 단에서 변경을 해준다.
파이썬은 지원 안 한다. (1. 읽기 쉬울 것, 2. 디버깅이 쉬울 것. 이 두 가지 원칙에서 2번 원칙에 위배된다.)
그리고 꼬리 재귀가 가능하다면 어차피 while loop로 대체 가능하다.

def fact(n):
    if n == 0:
        return 1
    return n * fact(n-1)
def tail_fact(n, acc):
	if n == 0:
    	return 1
	return fact(n - 1, n * acc)
tail_fact(4, 1)

들어 봤다고 아는 게 아니다. 스스로 이해하는 과정을 거치자. 이때에는 AI 학습 모드를 이용하자.

화요일(중급 3문제)

백준 IPv6 문제

https://www.acmicpc.net/problem/3107
문제를 잘못 읽어서 엄청나게 시간을 허비했던 문제이다. 애초에 설계와 구현을 못하기도 하였다.
이 문제를 풀면서 문제를 제대로 읽자는 다짐을 많이 했다. 그리고 구현을 하기 위해서는 문제를 어떻게 나누는 것이 가장 문제를 해결하기 좋은 방법일지 고민하는 과정이 필요하다고 느꼈다. 알고리즘을 여러 번 풀면서 느끼는 건데, 자꾸 생각하는 것보다 키보드에 손이 먼저 가는 경우가 많다. 이 문제를 풀 무렵에는 그것을 알면서도 제어하지 못한 것 같다. 아무리 시간에 쫓기더라도 문제를 아무렇게나 풀기 위해 키보드에 손을 올리지 말자.

LeetCode 정렬된 배열 중복 제거 문제

https://leetcode.com/problems/remove-duplicates-from-sorted-array/description/
코어 타임 30분 동안 혼자 풀 때에는 접근이 어려웠던 문제이다. 문제를 풀고 나서 서로 답변을 공유하는 과정에서 정답을 도출하는 방법에 대한 개괄적인 접근 방향이 잡혔다. 혼자 풀었다면 풀지 못 했을 문제이다. 가끔은 집단지성이 필요할 때도 있다.

골드바흐의 추측

https://www.acmicpc.net/problem/9020
문제를 풀기 위한 접근이 이해되지 않는 문제였다. 문제의 풀이 흐름을 전혀 따라갈 수가 없었다. 이해를 하고 대입해서 답이 나오는 걸 확인할 수는 있지만 이를 논리적으로 생각하기가 쉽지 않았다.
이런 문제는 아직까지도 어떻게 해야 할지 잘 모르겠다. 다만, 이제부터는 몇 가지 선택을 할 수 있다. 아예 모르는 경우에는 우선 경험의 부족이라고 생각하고 최소 고민 시간 이후에는 바로 AI에게 힌트를 요청할 수 있다. 풀이 방향을 대강 파악하였고 구현할 방법이 떠오른다면 우선 더 풀어볼 수 있다.

경우의 수 백트래킹(조합, 순열, 중복조합, 중복순열)

원래는 조합의 경우의 수를 구하는 문제만 풀려고 했다. ChatGPT의 학습모드를 이용해서 하다보니 조합에서 순열, 중복조합, 중복순열까지 공부하게 되었다.
공부할 당시에는 이해했다고 생각했는데 정리를 하면서 백지부터 다시 짜려니 하나도 모르겠다는 걸 알았다. 결국 코드는 AI를 참고했다. 그런데 경우의 수는 조합, 순열, 중복조합, 중복순열 4가지밖에 없기도 하고 특수한 경우라서 코드 템플릿 자체와 아이디어를 기억해 둬도 좋을 것 같다.

조합

def combinations(n, k):
   result = []
   
   def dfs(start, path):
       if len(path) == k:
           result.append(path[:])
           return
       for i in range(start, n + 1):
           path.append(i)
           dfs(i + 1, path)
          path.pop()

   dfs(1, [])
   return result

순열

def permutation(n, k):
    result = []
   visited = [False] * (n + 1)

   def dfs(path):
       if len(path) == k:
           result.append(path[:])
           return

       for i in range(1, n + 1):
           if not visited[i]:
               path.append(i)
               visited[i] = True

               dfs(path)

               path.pop()
               visited[i] = False

   dfs([])
   return result

중복 조합

def combination_with_repetition(n, k):
   result = []

   def dfs(start, path):
       if len(path) == k:
           result.append(path[:])
           return
       for i in range(start, n + 1):
           path.append(i)
           dfs(i, path)
           path.pop()

   dfs(1, path)
   return result

중복 순열

def permutation(n, k):
    result = []

   def dfs(path):
       if len(path) == k:
           result.append(path[:])
           return

       for i in range(1, n + 1):
           path.append(i)

            dfs(path)

           path.pop()

   dfs([])
    return result

핵심 역량 목표 달성률 평가

(평가는 주로 개인적인 만족도를 반영하였다.)
1. 문제해결 : 브론즈 수준의 문제를 AI 도움 없이 풀 수 있음. (문법적인 부분만 구글링 사용)
=> (약 90%) basics 문제임에도 불구하고 풀지 못하는 문제가 있었다.
2. 설계 : 간단한 의사 코드를 통해 문제 해결 방법을 설계할 수 있음.
=> (약 10%) 처음엔 설계에 시간을 많이 들였으나 데드라인이 다가오지만 문제는 많이 못 풀어서 설계를 거의 하지 않음.
3. 구현 : 설계한 의사 코드를 설계된 내용을 파이썬 코드로 작성할 수 있음.
=> (약 20%) 의사코드가 추상적인 경우가 많아서 파이썬 코드로 옮기는 과정도 쉽지 않았음. 구체적인 구현 방법을 생각해내지 못 함.
4. 품질 : 코드를 실행하기 전 엣지 케이스에 대해 생각해볼 수 있음.
=> (10% 미만) 보통 실행 이후에야 틀리는 걸 확인하고 고치는 경우가 많았다.
5. 유지보수 : 스스로 짠 코드가 지나치게 복잡한 경우 개선할 수 있음.
=> (약 30%) 푼 코드에 대해서 개선하기 위한 방법은 많이 찾아봤지만 스스로 아이디어를 내지는 못 했다.
6. 협업: 코어 타임은 최소인 2회만 만족하되, 모르는 것이 있을 때 적극적으로 알려주기
=> (약 50%) 코어 타임 최소 2회는 만족했지만 모르는 것이 있을 때 교류가 생각보다 많지는 않았다. 오히려 한 문제에 대해 오래 설명하느라 다른 문제를 설명하지 못하는 경우가 많았다고 생각한다. 그리고 설명을 하기에는 내가 정확히 아는 것이 없었다.
7. 태도 : 정한 계획에 맞춰 문제를 풂. (하루에 최소 1문제 이상)
- 토: basic 10개 / 일: 초급 3개 / 월: 초급 3개, 중급 2개 / 화: 중급 4개
=> (약 90%) N-Queen과 외판원 순회 문제를 제외하고는 모두 풀었다. 물론, 내 힘으로 못 푼 문제도 있었다.
8. 비즈니스 이해 : 문제를 해결하기 위해 사용한 코드가 어떤 비즈니스에서 어떻게 사용할 수 있을지 생각해볼 수 있음.
- (5% 미만) 비즈니스에 어떤 알고리즘이 적용될 수 있는 방법은 거의 생각해보지 못 했다. 확장된 유클리드 호제법은 보안에 사용된다는 것 정도만 알고 있다.
9. AI 활용: 풀지 못한 문제나 이해가 가지 않는 개념에 대해 AI를 이용해 빠르게 학습함.
=> (약 50%) 빠르게 찾아봐야 하는 상황에서도 구글링을 하거나 스스로 푸는 것을 고집하여 병목이 생긴 부분이 있었다. 모르는 개념이 나오거나 팀에서 정한 시간 제한을 초과했다면 미련 없이 AI의 학습 모드 등을 이용하거나 다른 문제를 풀어야 한다.
10. 학습 민첩성 : 알고리즘을 풀기 위해 활용하는 이론 및 python 코드 및 문법을 학습할 수 있음.
=> (약 60%) 파이썬 문법은 익숙하므로 문법에 대한 학습 속도는 빨랐다. 그러나 이론을 이해하고 나의 것으로 만드는 과정에서 시간이 오래 지체되었다.

느낀 점 요약

  • '코드 라인을 채우는 행위'보다 '어떻게 풀지 생각하는 것'에 집중하는 것이 좋겠다. 이 과정을 머릿속에서 하는 것은 어려울 수 있으므로, 종이에 써 보거나 의사 코드를 작성해보는 방법이 도움이 되겠다.
  • 휴식이 필요함에도 문제 풀이를 강행하지 말자. (종종 휴식을 취하거나, 내일을 위해 쉬기)
  • 개념을 배워야 할 때는 AI의 학습모드를 적극적으로 이용하자.
  • '처음부터 짧고 간결한 코드를 짜겠다'는 생각보다는 '일단 어떻게 문제를 해결할지 구상하고 돌아가는 코드를 만들어보자'는 마음으로 접근하는 것이 좋겠다.
  • 더 나은 코드가 있을지 다른 사람의 코드를 보는 것은 큰 도움이 되겠다.
  • 들어 봤다고 아는 게 아니다. 스스로 이해하는 과정을 거치자. 이때에는 AI 학습 모드를 이용하자.
  • 문제를 제대로 읽자.

풀지 못한 기본 문제

시도해볼 것 (TRY)

팀원과의 회고를 바탕으로 다음과 같은 목록이 만들어졌다.

모든 활동은 제한 시간을 두기

루틴의 우선 순위를 가장 높게 두기

  • 데일리 스크럼 (진행 상황 공유, 모르는 문제/알려주고 싶은 문제가 있는 경우 공유)
  • 운동 (아침 7시 30분)
  • TIL 작성 개념, 이론, 문제점과 느낀점 위주 (하루의 끝)
  • 코어 타임(문제 풀이, 코드 리뷰, 정답 찾기) (점심 이후)
  • 책 읽기 (저녁 이후)
  • 퀴즈, 키워드 개념 공부 (basic, 화요일)
  • 쉬는 시간 (문제 풀이 후 최소 5분 쉬기)

조급해 하지 않기

  • 쉬어야 할 때는 쉬기
  • 요일별 진도는 현실적으로 (진행 상황에 따라 더 하면 된다.)
  • 하루를 3개의 블록으로 나누어 계획하기 (아침, 점심, 저녁)
  • 최소 30분은 혼자서 고민하기. 혼자서 고민하는 시간은 되도록 1시간 30분을 넘지 않기.
profile
이지섭입니다.

0개의 댓글