목차16개 항목
출처와 참고
테오(teo)의 「컴퓨팅 사고와 개발 실력 늘리는 공부법」(2023.03)과 「프론트엔드 개발자에게 알고리즘 공부가 미치는 영향」(2021.12)을 바탕으로 재구성한 노트다. 「문제를 해결할 때 사고가 중요한 이유」의 내용을 더해 보강했다. 프론트엔드 실무 활용 표는 「프론트엔드 개발자에게도 알고리즘 공부가 중요할까?」(2022.05)를 바탕으로 보강했다. 컴퓨팅 사고의 구성 요소, 문제 해결 절차, 알고리즘 표현 방법과 제어 구조는 고려사이버대학교 「알고리즘과 문제해결」(2023-2학기) 강의 내용으로 보강했다.
컴퓨팅 사고란
컴퓨팅 사고(Computational Thinking) 는 문제를 컴퓨터가 효과적으로 수행할 수 있는 형태로 정의하고 답을 기술하는 사고 과정이다. 지넷 윙(Jeannette Wing)이 2006년 글에서 이 말을 널리 알렸다. 계산하는 주체가 사람이든 기계든 실행할 수 있게 문제와 해법을 표현하는 능력이라, 프로그래머만이 아니라 누구나 갖출 기초 소양으로 본다.
네 가지 구성 요소
| 요소 | 하는 일 | 지하철 경로 안내 앱으로 보면 |
|---|---|---|
| 분해(decomposition) | 큰 문제를 다룰 수 있는 작은 문제로 쪼갠다 | 입력 받기, 경로 계산, 결과 출력으로 나눈다 |
| 패턴 인식·일반화(generalization) | 반복되거나 닮은 부분을 찾아 하나로 묶는다 | 「최소 시간」과 「최소 환승」은 같은 그래프에서 가중치만 다르다 |
| 추상화·모형화(modeling) | 필요 없는 세부를 버리고 핵심만 자료로 표현한다 | 역은 정점, 구간은 간선, 소요 시간은 가중치. 역 건물 모양은 버린다 |
| 알고리즘 | 남은 모델을 푸는 단계별 절차를 만든다 | 다익스트라로 최단 경로를 구한다 |
여기에 만든 절차를 실제 프로그램으로 돌리는 자동화를 마지막 단계로 붙이기도 한다. 블록 코딩으로 사람 그림을 그리는 예가 이 흐름을 잘 보여 준다. 머리부터 발끝까지 한 번에 그리면 코드가 길고 고치기 어렵다. 팔과 다리가 같은 모양이라는 패턴을 찾아 함수 하나로 만들고 크기를 인자로 받게 하면, 같은 함수로 여러 사람을 그린다. 패턴 인식은 함수(재사용)로, 추상화는 매개변수로 이어진다.
데이터의 관점으로 보기
컴퓨터는 0과 1, 곧 숫자만 다룬다. 그래서 컴퓨터의 관점으로 본다는 것은 데이터의 관점으로 세상을 보는 것이다. 개발은 사람의 요구사항을 계속 변하는 값, 즉 데이터의 형태로 바꾸는 일이다.
// "불을 켜고 끈다" → 상태 하나와 그 상태를 바꾸는 두 함수
let isLight = false
const turnOn = () => { isLight = true }
const turnOff = () => { isLight = false }사람은 불을 켜면 켜진 것을 당연히 안다. 컴퓨터는 켜짐을 직접 인식하지 못하므로 반드시 값으로 표현해야 한다. 이 번역을 의식하면서 하는 것이 컴퓨팅 사고의 출발이다.
데이터 → 구조 → 알고리즘 → 추상화
| 단계 | 하는 일 | 할 일 앱 예시 |
|---|---|---|
| 데이터로 보기 | 요구사항에서 상태를 찾아 값으로 표현한다 | "체크한다" = completed: boolean |
| 구조 고르기 | 0과 1보다 사람에게 가까운 구조를 고른다. 숫자 → 문자 → 배열 → 트리·그래프로 쌓아 온 것이 자료구조다 | 추가·삭제·목록 = 객체의 배열 |
| 알고리즘 | 구조를 활용해 원하는 결과를 얻는 절차 | "완료한 일만 보기" = 조건으로 거르기 |
| 추상화 | 절차를 함수로 감싸 세부를 숨기고 재사용한다 | todos.filter(t => t.completed) |
filter의 본질은 "조건에 맞는 요소만 거른다"이다. 반복문과 push 같은 세부는 밖으로 드러낼 필요가 없다. 자동차를 운전할 때 엔진 구조를 몰라도 핸들과 페달만 알면 되는 것과 같다. 데이터로 보는 것이 출발이라면, 추상화를 이해하고 쓰는 것이 다음 단계다.
결국 프로그래밍의 핵심 요소는 언어가 바뀌어도 같다. 변수, 타입, 조건, 반복, 함수로 데이터의 구조와 알고리즘을 표현한다.
알고리즘으로 적기
문제 해결 절차
- 문제 정의: 무엇이 주어지고 무엇을 내야 하는지, 입력과 출력을 분명히 적는다. 여기가 흐리면 알고리즘도 흐려진다.
- 설계: 분해·패턴 인식·추상화를 거쳐 해법을 만든다.
- 표현: 아래 방법 중 하나로 절차를 적는다.
- 구현과 검증: 코드로 옮기고 경계 사례로 시험한다(코딩 테스트 접근법).
- 분석: 다른 해법과 시간·공간을 비교한다(빅오 표기법). 비교 기준(정확성·효율성 등)은 그 노트의 「알고리즘이란」에 있다.
알고리즘을 적는 네 가지 방법
「임시 변수 tmp로 x와 y의 값을 맞바꾼다」 같은 절차도 적는 방법에 따라 성격이 달라진다.
| 방법 | 장점 | 단점 |
|---|---|---|
| 자연어 | 누구나 읽는다 | 모호하다. 「그것을 옮긴다」의 「그것」이 무엇인지 해석이 갈린다 |
| 순서도(flowchart) | 흐름과 분기가 한눈에 보인다 | 프로그램이 커지면 그리기도 읽기도 어렵다 |
| 의사 코드(pseudo code) | 자연어보다 정확하고 특정 언어 문법에 매이지 않는다 | 표준이 없어 쓰는 사람마다 모양이 다르다 |
| 프로그래밍 언어 | 바로 실행된다 | 세부 문법이 핵심 논리를 가린다 |
설계 단계에서 가장 쓸모 있는 것은 의사 코드다. 코딩 전에 생각을 정리하고, 리뷰 때 핵심 논리만 놓고 이야기할 수 있다. 순서도는 도형에 뜻이 정해져 있다. 둥근 사각형은 시작·끝, 평행사변형은 입출력, 직사각형은 처리, 마름모는 조건 분기다.
swap(x, y):
tmp ← x
x ← y
y ← tmp세 가지 제어 구조
어떤 알고리즘이든 순차·선택·반복 세 구조의 조합으로 적을 수 있다(뵘-야코피니 정리). 이 셋만으로 프로그램을 짜자는 규율이 구조적 프로그래밍이다.
| 구조 | 뜻 | 예 |
|---|---|---|
| 순차 | 위에서 아래로 차례대로 실행 | 입력 → 계산 → 출력 |
| 선택 | 조건에 따라 다른 명령을 실행 | 최소 환승이면 A, 아니면 B로 계산 |
| 반복 | 조건이 맞는 동안 같은 명령을 되풀이 | 벽에 닿을 때까지 한 걸음씩 전진 |
def largest(nums): # 순차
best = nums[0]
for n in nums[1:]: # 반복
if n > best: # 선택
best = n
return best알고리즘 공부가 필요한 이유
알고리즘은 자료구조를 바탕으로 문제를 푸는 절차이고, 알고리즘을 배운다는 것은 지금까지 찾아낸 가장 효율적인 풀이를 배우는 것이다. 기준은 기계 성능이 아니라 입력이 늘 때 시간이 얼마나 늘어나는지, 즉 시간 복잡도(Big-O)다.
| 배울 것 | 핵심 |
|---|---|
| 시간 복잡도 | 입력 대비 시간 함수가 가파를수록 나쁜 알고리즘이다 |
| 선형 검색 vs 이진 검색 | 정렬돼 있으면 반씩 줄이는 전략으로 100개를 7번 만에 찾는다. 이후 배우는 많은 알고리즘의 근간이다 |
| 선택 정렬 vs 퀵 정렬 | 사람이 책을 정리하듯 하면 O(n²), 사람에게 낯선 "컴퓨터스러운" 방식이면 O(n log n) |
현실의 방식을 그대로 본뜬 풀이가 비싸면, 더 컴퓨터스럽게 생각해 최적화하는 법을 배우는 것이 알고리즘 공부다.
프론트엔드 개발자에게는
실무에서 프론트엔드가 알고리즘을 직접 짤 일은 드물다. 그래프보다 복잡한 자료구조를 쓰는 경우도 많지 않다. 디자이너가 포토샵 내부 구현을 몰라도 되듯, Array.prototype.sort()의 내부를 몰라도 쓸 수 있다. 프론트엔드는 오히려 최적화보다 가독성과 사람에 가까운 코드를 중시한다. 그래도 공부가 필요한 이유는 둘이다.
- 요구사항을 String·Array·Object로 만드는 감각이 길러진다. 문제를 이미 알려진 자료구조의 세계로 끌고 오면, 그 세계의 문법으로 보고 이미 해결된 방법으로 풀 수 있다. 자료구조와 알고리즘은 컴퓨터와 소통하는 언어다.
- 프론트엔드에도 최적화가 필요한 순간이 있다. 이때는 알고리즘 목록보다 최적화 원리(분할 정복, 동적 계획법, 탐욕법)가 쓸모 있다. React의
useMemo도 동적 계획법의 메모이제이션이다.
프론트엔드 실무에서 자료구조·알고리즘이 드러나는 자리는 다음과 같다.
| 상황 | 쓰이는 개념 |
|---|---|
| 정렬된 목록에서 값 찾기, 가상 스크롤의 보이는 행 계산 | 이분 탐색 |
| 팔로우 관계, 의존성, 화면 간 이동 흐름 | 그래프와 탐색(BFS·DFS) |
| 파일 탐색기·댓글 스레드·메뉴 같은 중첩 UI | 트리와 재귀(분할 정복) 컴포넌트 |
| 서버 응답·계산 결과 재사용 | 메모이제이션(동적 계획법) |
원리를 알면 언어나 플랫폼이 바뀌어도 빨리 적응한다. 응용 기술은 기초 기술 위에 서 있으므로, 쓰는 도구를 떠받치는 기반을 알아 두면 특정 환경에 묶이지 않는다.
어디까지 깊게 팔지는 전략적으로 정한다. 사전처럼 알고리즘을 외우기보다 "현실 문제를 어떻게 데이터로 보고 어떻게 최적화하는가"를 익힌다고 생각한다.
코딩 테스트의 의미
코딩 테스트 문제는 특정 언어·라이브러리에 묶이지 않는다. 실무 능력이 아니라 지문을 읽고 알맞은 자료구조와 알고리즘을 찾는 능력, 즉 컴퓨팅 사고를 보기 때문이다. 취업 준비 때 제대로 공부해 두면 좋다. 입사 후에는 동기가 잘 안 생긴다. 다만 시간 제약이 있는 평가 도구라, 실무에 필요한 디자인·일정·협업·보안·유지 보수는 다루지 않는다. 실력을 키우는 주 훈련으로 삼기에는 부족하다. 코딩 테스트 준비법은 코딩 테스트 접근법에 있다.
개발은 학문이 아니라 운동이다
축구 교재와 경기 영상만 봐서는 공을 잘 찰 수 없다. 개발도 직접 해 봐야 늘고, 한 번에 늘 수 있는 폭에 한계가 있어 꾸준함이 중요하다. 무작정 실전만 하면 나쁜 습관이 붙으니 공부와 훈련을 병행하되, 처음에는 실전 비중이 훨씬 커야 한다. 실력이 오르면 다양한 경험과 넓은 시야가 중요해진다. 팀 스포츠처럼 협업과 내 포지션에 대한 이해도 실력이다.
- 도구 숙련도와 본질은 다르다. React를 잘하면 Vue도 금방 한다. 잘하는 개발자는 무엇을 해도 잘한다.
- 많이 아는 것과 잘하는 것은 다르다. 면접에서 잘 대답한 사람이 실무에서 못하는 일이 생기는 이유다.
훈련 방법: 베끼고, 돌리고, 고치고, 합친다
flowchart TB n1["목표 정하기"] --> n2["가장 비슷한 남의 코드 찾기"] n2 --> n3["일단 내 환경에서 돌리기"] n3 --> n4["숫자·문자를 바꿔 가며 내 것으로 고치기"] n4 --> n5["다른 코드와 결합하기"] n5 --> n6["반복해서 완성"]
- 만들고 싶은 것부터 정한다. 개발은 기술로 가치를 만드는 일이라 만들지 않으면 의미가 없다. 모르겠으면 책의 예제라도 "만든다"를 목표로 삼는다.
- 돌아가는 남의 코드를 가져와 일단 돌린다. 분석은 나중이다. 에러는 검색이나 AI에 물어 해결한다.
- 고쳐서 내 것으로 만든다. 보이는 값을 바꿔 가며 변화를 느끼면 맥락이 잡힌다. 목적이 있을 때 공부한 것은 빨리 내 지식이 된다. 처음부터 다 이해해야 넘어가겠다는 생각이 가장 큰 방해물이다. 띄엄띄엄 배워도 된다.
- 결합한다. 원하는 코드가 100% 있을 리 없다. 서로 다른 코드를 합치는 과정에서 대부분의 문제가 생기고, 그때 얻는 지식이 오래 남는다. 바퀴를 다시 발명하지 말고 필요한 부분만 이해해 조립하는 것, 이것이 추상화이자 개발의 공유 문화다.
- 반복해서 완성한다. 위태롭게 쌓은 코드도 조금씩 안정된다.
의식적으로 생각하며 훈련한다
run & fix만 반복하며 직관에 기대면 어느 지점에서 성장이 멈춘다. 의식적으로 연습하면 나중에는 실전에서 직관에 맡겨도 컴퓨팅 사고가 자동으로 작동한다.
| 연습 | 효과 |
|---|---|
| 요구사항을 데이터 관점으로 나눠 적어 보기 | 어떤 데이터를 다루는지와 방향이 정해진다 |
| 코드보다 데이터 구조를 먼저 기술하기 | 이름과 타입을 먼저 생각하는 습관이 든다 |
| 문제에 맞는 알고리즘 고르기 | 많이 풀고 다양한 알고리즘을 겪어야 는다 |
| 기존 데이터와 알고리즘을 연결해 새 데이터 만들기 | 데이터 처리와 알고리즘 적용을 잇는 능력이 생긴다 |
문제 해결의 사고 습관
기술을 아는 것과 문제를 푸는 것은 다르다. 같은 지식으로도 어떤 각도에서 문제를 보느냐에 따라 해법의 비용이 크게 달라진다.
| 습관 | 내용 |
|---|---|
| 추측 대신 가설과 검증 | 원인을 짐작해 고치지 않는다. 가설을 세우고 실험으로 하나씩 확인해 범위를 좁힌다 |
| 문제의 종류에 맞춰 사고를 바꾼다 | 버그는 「무엇이 틀렸나」를, 성능 문제는 「어디에 시간이 쓰이나」를 묻는다. 접근법이 다르다 |
| 실행 환경의 제약을 본다 | 자원 공유, 메모리, 동시 실행 같은 조건이 해법의 효과를 좌우한다 |
| 관점을 바꿔 본다 | 작업을 더 빠르게 만드는 대신 멈추거나 미루거나 하지 않는 쪽이 답일 때가 있다 |
| 단순한 대안부터 | 복잡한 기술을 들이기 전에 더 간단한 방법이 없는지 따진다 |
| 사용자가 먼저 느끼는 곳부터 | 우선순위는 체감 효과가 큰 곳에 둔다 |
| 구현 전에 생각에 시간을 쓴다 | 여러 각도에서 충분히 생각한 뒤 손을 움직이는 편이 결과적으로 빠르다 |
정리
- 컴퓨팅 사고는 분해·패턴 인식·추상화·알고리즘으로 문제를 실행 가능한 절차로 바꾸는 것이고, 그 출발은 사람의 요구사항을 데이터의 관점으로 다시 정의하는 것이다.
- 알고리즘은 자연어·순서도·의사 코드·코드로 적을 수 있고 설계 단계에서는 의사 코드가 가장 실용적이다. 모든 절차는 순차·선택·반복의 조합이다.
- 알고리즘 공부의 가치는 알고리즘 목록이 아니라 데이터로 사고하고 최적화하는 법을 익히는 데 있다. 프론트엔드 개발자에게도 그렇다.
- 개발은 운동처럼 훈련으로 는다. 목표를 정하고, 남의 코드를 돌리고, 고치고, 합치는 과정을 반복한다.
- "일단 뭐든 만들어 보되, 생각은 하면서."
관련 노트: 코딩 테스트 접근법, 빅오 표기법과 시간 복잡도, 프로그래밍 패러다임, 초보 웹 개발자의 공부 방향과 차별화, 사이드 프로젝트를 시작하고 끝까지 가는 10가지 팁, 프론트엔드 개발자의 업무 범위와 역량, 개발 자료 잘 찾는 법, 개발자의 지속 가능한 학습 루프