초보자를 위한 최고의 코딩 과제: 쉬운 것부터 어려운 것까지 코딩 연습
아무도 알려주지 않는 사실이 하나 있습니다. 한 달 동안 튜토리얼을 몰아보고 모든 영상에 고개를 끄덕이며 따라 하다가도, 막상 빈 파일을 열면 뭘 입력해야 할지 전혀 모르는 경우가 있죠. 저도 그런 경험이 있습니다. 코딩을 배우는 대부분의 사람들이 겪는 일이죠.
해결책은 지루하지만 효과적입니다. 처음에는 서툴더라도 작은 문제들을 스스로 해결해 보세요. 이 가이드는 두 부분으로 나뉩니다. 첫 번째는 초보자를 위한 최고의 코딩 문제 10개를 엄선한 것입니다(난이도는 대략 쉬움부터 어려움까지). 두 번째는 제가 소개한 문제들을 모두 풀어본 후, 더 많은 문제를 찾을 수 있는 사이트들을 안내합니다.
어떤 프로그래밍 언어든 상관없습니다. 제 예시에서는 파이썬과 자바스크립트를 조금씩 사용하는데, 대부분의 사람들이 파이썬으로 시작하기 때문입니다. 가능하면 순서대로 풀어보세요. 각 문제마다 새로운 개념이 하나씩 포함되어 있습니다.
코딩 챌린지가 실질적인 코딩 실력 향상에 도움이 되는 이유
도전 과제란 무엇일까요? 아주 사소하고 정답이 명확한 것들입니다. "단어 하나를 골라 거꾸로 말해 보세요." "숫자 목록이 있는데, 가장 큰 숫자는 무엇일까요?" 아무것도 설치하거나 프레임워크를 선택할 필요도 없습니다. 기껏해야 열 줄 정도의 코드만 작성하면 됩니다.
튜토리얼을 보는 것은 다른 사람의 사고 과정을 따라가는 것입니다. 하지만 코딩 과제는 그 과정을 뒤집어 놓는데, 이는 불편하지만 유익한 경험입니다. 추측하고, 오류가 발생하고, 오류를 자세히 살펴보고, 다시 시도합니다. 몇 주 동안 이런 과정을 반복하다 보면, 어떤 것들은 조용히 더 쉬워집니다.
- 구문 활용 능력 향상. 이제 더 이상 for 루프 작성법을 다섯 번째로 구글링할 필요가 없습니다.
- 문제 해결 능력. 키보드를 두드리기 전에 모호한 작업을 단계별로 나누기 시작합니다.
- 논리적 사고. 빈 목록, 음의 정수, 한 글자 단어. 그런 것들을 예상하게 되죠.
- 디버깅. 빨간색 오류 메시지가 더 이상 모욕처럼 느껴지지 않습니다.
- 자신감. 해결한 모든 문제는 당신이 스스로 프로그램을 작성할 수 있다는 증거입니다.
누군가 코딩에는 80/20 법칙이 있다고 말해줬는데, 초보자 문제에는 꽤 정확한 것 같아요. 대부분의 문제는 반복문, if/else 문, 문자열 읽기, 딕셔너리 요소 개수 세기, 배열 순회라는 다섯 가지 기본적인 기법을 사용하거든요. 이런 것들을 익히면 많은 "새로운" 문제들이 사실은 익숙한 문제들을 새롭게 풀어낸 것임을 알게 될 거예요.

초보자를 위한 쉬운 코딩 문제 10가지
이 예제들은 모두 독창적인 것은 아니며, 바로 그 점이 핵심입니다. 거의 모든 초보자 강좌에 등장하는 이유는 효과적이기 때문입니다. 처음 다섯 개는 반복문, 조건문, 그리고 약간의 문자열이나 리스트 처리만 필요하지만, 마지막 다섯 개는 코드를 작성하기 전에 어떤 자료구조를 사용할지 고민하게 만듭니다. 무슨 일이 있어도, 설령 무의미하게 느껴지더라도 최소 20분 동안은 구글 검색을 하지 않도록 노력하세요.
챌린지 1: 피즈버즈
1부터 100까지의 숫자를 출력하되, 3의 배수는 "Fizz"로, 5의 배수는 "Buzz"로, 3과 5의 배수인 숫자는 "FizzBuzz"로 출력해야 합니다.
너무 간단하게 들려서 오히려 모욕적이라고 생각했던 기억이 납니다. 하지만 실제로는 그렇게 간단하지 않죠. 그래서 면접관들이 오랫동안 좋아했던 것 같습니다. 코딩에 대해 많이 읽었지만 직접 코드를 작성해 본 경험이 거의 없는 사람들은 보통 검사 순서를 헷갈려 합니다. 제가 파이썬으로 작성한 코드는 다음과 같습니다.
파이썬 for n in range(1, 101): if n % 15 == 0: print("FizzBuzz") elif n % 3 == 0: print("Fizz") elif n % 5 == 0: print("Buzz") else: print(n)
일단 제대로 작동하면, % 15 줄을 맨 아래로 드래그해서 실행하고, FizzBuzz가 몇 개나 살아남는지 확인해 보세요. 스포일러: 하나도 남지 않을 겁니다.
과제 2: 문자열을 뒤집기
"안녕하세요"가 들어가면 "올레"가 나옵니다.
거의 모든 언어에는 파이썬의 `s[::-1]`이나 자바스크립트의 `split("").reverse().join("")`처럼 단축 표현이 있습니다. 한 번쯤은 작동 방식을 확인하기 위해 작성해 보는 것도 괜찮습니다. 그 후에는 솔직히 삭제하고 반복문을 이용해 한 글자씩 추가하는 간단한 방법을 사용하는 게 좋습니다. 대부분의 언어에서 문자열을 제자리에서 변경할 수 없다는 사실을 여기서 알게 되는데, 이 점을 미리 배우지 않으면 나중에 많은 사람들이 혼란스러워합니다.
과제 3: 회문 검사기
회문은 "racecar"나 "noon"처럼 앞뒤로 읽어도 같은 단어입니다. 따라서 함수는 이러한 단어들에 대해서는 "예"라고 답하고 "hello"에 대해서는 "아니오"라고 답해야 합니다.
제대로 작동하면, "A man, a plan, a canal: Panama"라는 문자열을 입력해 코딩 실력을 한 단계 더 향상시킬 좋은 기회입니다. 이 코드는 텍스트를 소문자로 바꾸고 공백과 구두점을 제거해야만 제대로 작동합니다. 지난번 과제에서 사용했던 문자열 뒤집기 코드를 빌려 쓸 수 있는데, 꽤 만족스러운 경험이 될 겁니다.
과제 4: 피보나치 수열
아마 여러분은 0, 1, 1, 2, 3, 5, 8, 13과 같은 수열을 본 적이 있을 겁니다. 각 숫자는 앞의 두 숫자를 더한 값입니다. 여러분의 함수는 이 수열 중 처음 n개를 반환해야 합니다.
변수 두 개와 반복문 하나면 충분합니다. 하지만 재귀 함수를 사용해서 함수가 자기 자신을 호출하고 n=35를 입력받는 식으로 다시 작성하면 재미가 시작됩니다. 대부분의 노트북에서는 꽤 오랜 시간이 걸릴 텐데, 그 이유를 알아내는 과정이 동적 프로그래밍을 처음 접하는 좋은 경험이 될 겁니다. "아, 그래서 그랬구나" 하는 깨달음을 얻는 순간이죠.
과제 5: 배열 회전하기
배열과 숫자 k가 주어졌을 때, 배열의 모든 요소를 k칸씩 오른쪽으로 이동시키되, 맨 끝에 있는 요소는 맨 앞으로 이동합니다. 예를 들어 [1, 2, 3, 4, 5]이고 k=2이면 최종 배열은 [4, 5, 1, 2, 3]이 됩니다.
처음 시도할 때 k가 리스트보다 크면 대부분 오류가 발생합니다. 다섯 개의 항목을 7만큼 회전하는 것은 사실상 2만큼 회전하는 것과 마찬가지인데, 이는 일단 보면 명확하지만 그 전에는 알아차리기 어렵습니다.
그 다섯 가지를 별 탈 없이 해냈다면 정말 잘했어요. 다음 단계들은 조금 더 어려울 거예요.
과제 6: 배열에서 가장 큰 정수 찾기
max() 함수를 사용할 수 있다면 가장 큰 수를 찾는 것은 쉽지만, 여기서는 사용할 수 없습니다. 대신 반복문을 사용하여 가장 큰 수를 찾고, 리스트를 두 번 순회하지 않고 두 번째로 큰 수도 찾으세요. 이제 두 개의 값을 추적해야 하므로 어떤 값을 먼저 업데이트해야 하는지 주의해야 합니다.
중복된 데이터와 음수는 테스트에 유용한 요소입니다. 초기 솔루션 중 상당수가 이러한 요소에서 조용히 실패하기 때문입니다.
과제 7: 문장에서 모음 개수 세기
모음 세기는 준비 운동입니다. 실제 연습은 각 모음을 하나씩 세어 {"a": 3, "e": 5, "i": 1, "o": 2, "u": 0}과 같은 형식으로 출력하는 것입니다.
많은 초보자들에게 있어 이 순간이 바로 딕셔너리(또는 자바스크립트의 객체)가 비로소 이해되는 순간이며, 이는 매우 중요한 의미를 지닙니다. 왜냐하면 앞으로 1년 동안 가장 많이 사용하게 될 데이터 구조가 바로 딕셔너리이기 때문입니다.
챌린지 8: 아나그램 검사기
아나그램은 "listen"과 "silent"처럼 글자 순서만 다른 완전히 같은 단어를 사용하는 단어입니다. 따라서 두 문자열이 아나그램인지 판별하는 함수를 작성해야 합니다.
제가 아는 합리적인 방법은 두 가지입니다. 두 문자열을 모두 정렬한 후 결과를 비교하거나, 각 문자가 나타나는 빈도를 세어 비교하는 것입니다. 두 가지 방법을 모두 작성해 보고 어느 방법이 작업량이 적은지 생각해 보는 것이 바로 효율성에 대해 생각하는 첫걸음입니다.
챌린지 9: 두 개의 합계
[2, 7, 11, 15]와 같은 리스트와 목표값이 9인 경우, 합이 목표값(여기서는 [0, 1])이 되는 두 숫자의 위치를 반환합니다.
대부분의 사람들은 모든 쌍을 시도하는 두 개의 중첩 루프로 시작하는데, 이는 짧은 리스트에는 괜찮지만 금방 속도가 느려집니다. 더 빠른 방법은 이미 확인한 숫자를 딕셔너리에 저장하여 즉시 찾아볼 수 있도록 하는 것입니다. LeetCode에서 이 문제를 가장 먼저 다룬 것은 우연이 아닙니다. 올바른 데이터 구조가 얼마나 중요한지 명확하게 보여주기 때문입니다.
도전 과제 10: 숫자 맞추기 게임
이 게임에서 컴퓨터는 1에서 100 사이의 비밀 숫자를 선택하고, 플레이어는 계속해서 그 숫자를 추측합니다. 정답을 맞힐 때까지 컴퓨터는 "너무 높습니다" 또는 "너무 낮습니다"라고 알려주고, 정답을 맞추는 데 걸린 시도 횟수도 함께 표시합니다.
이건 단순한 프로그래밍 퍼즐이라기보다는 사용자 입력, while 루프, 그리고 난수를 사용하는 작은 앱에 가깝습니다. 누군가는 숫자 대신 "바나나"라고 입력할 수도 있으니, 잘못된 입력도 처리해야 합니다. 그리고 다른 퍼즐들과 달리, 이건 친구에게 건네주어 함께 플레이할 수 있다는 장점이 있습니다.
온라인 코딩 챌린지를 위한 최고의 웹사이트
제가 가진 10개의 문제를 다 쓰고 나면, 자동 채점 기능이 있는 무제한 문제 제공 사이트가 필요할 거예요. 온라인 코딩 챌린지 사이트들은 모두 그런 기능을 제공하지만, 사용감이 조금씩 다릅니다.
| 플랫폼 | ~에 가장 적합함 | 체재 | 비용 |
|---|---|---|---|
| 에다비트 | 완전 초보자 | 브라우저에서 즐길 수 있는 간단한 코딩 과제 | 무료 등급 |
| 코드워즈 | 게임화된 연습 | 커뮤니티 솔루션이 포함된 순위 "kata" | 무료 |
| 운동주의 | 좋은 습관 배우기 | 선택적으로 멘토링을 받을 수 있는 어학 과정 | 무료 |
| freeCodeCamp | 체계적인 학습 | 실습과 인증이 포함된 교육 과정 | 무료 |
| 해커랭크 | 기술 습득 과정 및 취업 준비 | 난이도가 표시된 주제별 문제 | 학습자용 무료 |
| LeetCode | 면접 준비 | 난이도(쉬움/중간/어려움)로 분류된 알고리즘 문제 | 무료 등급 |
| 코드셰프 | 경쟁을 향해 나아가다 | 연습 코스 및 정기 대회 | 무료 등급 |
| 오일러 프로젝트 | 수학 애호가들 | 수학 문제가 많이 나오는 퍼즐입니다. 정답만 제출하세요. | 무료 |
| 코드의 등장 | 계절의 즐거움 | 매년 12월, 스토리가 있는 일일 퍼즐 제공 | 무료 |
에다비트
친구가 어디서부터 시작해야 할지 물어보면, 저는 Edabit을 추천할 거예요. 문제들이 짧고, 모든 게 브라우저에서 실행되고, 경험치(XP)도 쌓을 수 있거든요. 파이썬, 자바스크립트, 자바, C++ 등 여러 언어를 다루고, "매우 쉬움"이라는 표시는 정말로 쉽다는 뜻이에요.
코드워즈
코드워즈에서는 문제를 카타(무술에서 훈련을 뜻하는 단어)라고 부릅니다. 난이도는 가장 쉬운 8급부터 1급까지 있습니다. 진정한 재미는 제출 후에 시작됩니다. 다른 사람들의 답을 볼 수 있는데, 내가 어설프게 작성한 열 줄짜리 답과 다른 사람이 멋지게 작성한 두 줄짜리 답을 비교해 보면 대부분의 튜토리얼보다 훨씬 많은 것을 배울 수 있습니다.
운동주의
Exercism은 비영리 단체로 운영되며, 완전 무료입니다. 80개가 넘는 프로그래밍 언어 과정을 제공하며, 요청하면 자원봉사 멘토들이 코드를 검토해 줍니다. 웹 브라우저에서 바로 연습하거나, 파일을 다운로드하여 자신의 컴퓨터로 옮겨서 연습할 수도 있습니다. 처음에는 Visual Studio Code와 터미널 사용에 익숙해지기 위해 다운로드 방식을 추천합니다.
freeCodeCamp
엄밀히 말하면 챌린지 사이트는 아닙니다. 전체 커리큘럼인데, 수백 개의 작은 코딩 연습 문제로 구성되어 있어서 챌린지 사이트라고 할 수 있죠. 자바스크립트, 파이썬, 반응형 웹 디자인 등 체계적인 학습을 좋아하시는 분들에게 좋습니다. 각 과정의 끝에는 자격증 프로젝트도 있습니다.
해커랭크
HackerRank는 문제를 기술 분야(Python, SQL, 자료 구조, 알고리즘)별로 분류하고 각 문제의 난이도와 해결자 수를 알려줍니다. 많은 기업들이 HackerRank를 통해 지원자를 선별합니다. 지금 인터페이스에 익숙해지면 나중에 스트레스를 덜 받을 수 있습니다.
LeetCode
여기는 면접 준비의 천국입니다. 문제들은 쉬움, 중간, 어려움으로 나뉘어 있는데, "쉬움"조차도 기본기는 다 갖췄다는 전제하에 풀 수 있습니다. 이 프로그래밍 문제들을 시작점이 아니라 앞으로 나아가야 할 방향으로 생각하세요. 제 열 문제 풀이가 익숙해지면 다시 오세요.
코드셰프
CodeChef는 경쟁 프로그래밍 사이트로 성장했습니다. 현재는 정규 대회 외에도 초보자를 위한 연습 코스를 제공하고 있으므로, 시간 제한 대회가 재미있다면 부담 없이 시도해 볼 수 있는 곳입니다.
오일러 프로젝트
코드로 풀어야 하는 수학 문제들. 사이트에는 에디터가 없습니다. 원하는 곳에 프로그램을 작성하고 최종 결과만 입력하면 됩니다. 수학 전공자들은 이 사이트를 매우 좋아하지만, 다른 사람들은 그다지 흥미를 느끼지 못하는 경향이 있습니다.
코드의 등장
매년 12월이면 재미있는 이야기로 연결된 두 부분으로 된 퍼즐이 매일 하나씩 제공됩니다. 최근 기간이 25일에서 12일로 줄어들고 글로벌 순위표가 없어져서, 요즘은 친구나 직장 동료들과 함께하는 비공개 순위표가 주를 이룹니다. 예전 퍼즐들은 연중 내내 남아 있으며, 아카이브는 훌륭한 연습 자료실 역할을 합니다.
또한, 과제와 면접 강의를 결합한 Coderbyte와 경력 개발자를 위한 Topcoder에 대해서도 듣게 될 것입니다.
한 가지 주의할 점이 있습니다. 예전 목록들 중 상당수가 여전히 Google Code Jam과 Kick Start를 가리키고 있는데, Google은 2023년에 두 서비스를 모두 종료했고 현재는 문제 아카이브만 남아 있습니다.

코딩 과제를 연습하면서 지치지 않는 방법
사이트를 10개 즐겨찾기에 추가한다고 해서 실력이 향상되는 건 아닙니다. 습관이 중요하죠. 제가 추천하는 방법은 대략 다음과 같습니다.
- 프로그래밍 언어 하나를 선택해서 꾸준히 연습하세요. 파이썬은 영어처럼 읽히기 때문에 흔히 선택되는 언어입니다. 웹사이트를 만들고 싶다면 자바스크립트를 배우는 것도 좋습니다.
- 제대로 된 코드 편집기를 설치하세요. 첫 주에는 브라우저 편집기도 괜찮지만, Visual Studio Code를 일찍 설치하면 파일을 실행하고, 터미널에서 오류를 읽고, 디버거를 사용하는 방법을 익힐 수 있습니다.
- 하루에 한두 문제씩 풀어보세요. 매일 조금씩 코딩 연습을 하는 것이 일요일에 여섯 시간씩 벼락치기하는 것보다 효과적입니다. 패턴은 연습 사이에 자연스럽게 몸에 배고, 작은 목표는 건너뛰기 어렵습니다.
- 풀이를 마친 후에는 다른 풀이들도 읽어보세요. Codewars나 Exercism에서 다른 답변 두세 개를 살펴보세요. 모범 사례와 정말 기발하고 유용한 팁들을 얻을 수 있을 겁니다.
- 예전에 풀었던 문제를 다시 살펴보세요. 일주일 후, 기억을 더듬어 다시 풀어보세요. 만약 풀 수 없다면, 이해하려던 것이 아니라 단순히 암기한 것입니다.
- 작은 프로젝트로 넘어가세요. 30~50개 정도의 문제를 풀고, 할 일 목록, 무료 API를 활용한 날씨 앱, 텍스트 어드벤처 게임 등 무언가를 만들어 보세요. 이때부터 서로 다른 기술들이 함께 활용되기 시작합니다.
코딩 과제를 하다가 막혔을 때 해야 할 일
막히는 순간이 올 겁니다. 경력이 많은 개발자들도 점심시간 전에 막히는 경우가 있죠. 그들에게는 막힌 부분을 해결하는 루틴이 있으니, 하나 빌려 쓰세요.
- 문제를 자신의 말로 다시 설명해 보세요. "이 문제를 풀 수 없어"라고 생각하는 순간들 중 상당수는 사실 "내가 문제를 잘못 이해했어"라는 이유에서 비롯됩니다.
- 예제를 직접 손으로 풀어보세요. 간단한 입력값을 사용하고, 펜과 종이를 준비해서 각 단계를 꼼꼼히 적어보세요. 그러면 완성입니다! 이것이 바로 여러분의 알고리즘입니다.
- 먼저 의사 코드를 작성하세요. "각 숫자에 대해, 현재 가장 큰 숫자보다 크면 해당 숫자를 유지하세요." 쉬운 말로 작성된 코드는 수정하기가 더 쉽습니다.
- 모든 것을 출력해 보세요. 대부분의 버그는 예상과 다른 값을 저장하는 변수에서 발생합니다. 해당 변수를 출력해서 찾아보세요.
- 소리 내어 설명해 보세요. 사람 앞에서든 고무 오리에게든 코드를 한 줄씩 읽어 보세요. 소프트웨어 버그는 종종 문장 중간쯤에서 발견됩니다.
- 힌트를 단계별로 활용하세요. 많은 플랫폼에서 정답을 보여주기 전에 힌트를 제공합니다. 힌트를 참고한 후 다시 시도해 보세요.
무슨 일이 있어도 다른 사람의 풀이를 베끼지 마세요. 풀이가 진행되는 것을 지켜보고 다음으로 넘어가세요. 저도 한동안 그렇게 했는데 아무 소용이 없었어요. 만약 다른 사람의 풀이를 읽었다면, 탭을 닫고 한 시간 정도 기다린 후 직접 다시 풀어보세요.
블록체인 초보자를 위한 암호화폐 테마 코드 챌린지
어쩌면 암호화폐 결제나 블록체인이 당신이 코딩을 배우려고 했던 이유일지도 모릅니다. 그렇다면 그 분야의 문제들을 풀어보세요. 기본 개념(문자열, 정수, API)은 동일하지만, 실제 기술 업무와 훨씬 더 유사한 문제들을 접하게 될 겁니다. 이런 문제들을 풀기 위해 합의 알고리즘을 이해할 필요는 전혀 없습니다.
- 실시간 코인 가격을 가져옵니다. 무료 공개 암호화폐 가격 API를 호출하여 현재 비트코인 가격을 출력하고, 매분마다 가격을 갱신합니다. HTTP 요청과 JSON을 활용해 보겠습니다.
- 지갑 주소 형식을 검증합니다. 문자열이 올바른 주소처럼 보이는지 확인합니다. 길이, 접두사, 허용된 문자만 사용했는지 등을 점검합니다. 문자열 연습에 도움이 될 뿐만 아니라 정규 표현식에 대한 쉬운 소개이기도 합니다.
- 단위 변환기를 만들어 보세요. 사토시를 비트코인(BTC)으로(1 BTC = 1억 사토시), 웨이를 이더리움(ETH)으로(1 ETH = 10¹⁸ 웨이) 변환해 보세요. 부동소수점과 화폐가 왜 어울리지 않는지, 그리고 개발자들이 왜 금액을 정수로 저장하는지 금방 알게 될 겁니다.
- 문자열을 SHA-256으로 해싱해 보세요. 표준 라이브러리를 사용하여 문장을 해싱하고, 글자 하나만 바꿔서 다시 해싱해 보세요. 완전히 다른 결과가 나옵니다. 바로 이 특성이 블록체인을 하나로 묶어주는 중요한 요소 중 하나입니다.
- 간단한 결제 페이지를 만드세요. 제품 페이지에 "암호화폐로 결제" 버튼을 추가하고, 이 버튼을 클릭하면 결제 게이트웨이 API를 통해 테스트용 청구서가 생성됩니다.
마지막 단계는 나머지 모든 단계를 하나로 묶어줍니다. 양식 작성, API 호출, 오류 처리, 그리고 실제 사용자에게 결과를 보여주는 단계까지 말이죠. Plisio 와 같은 게이트웨이는 연습용 스토어에 연결할 수 있는 API와 문서를 제공하므로, 초보자도 실제 전자상거래 통합과 매우 유사한 방식으로 연습할 수 있습니다.
오늘 바로 문제 하나 풀면서 코딩 연습을 시작해 보세요.
초보 시절에 제가 막혔던 부분을 해결해 준 것을 돌이켜보면, 전설처럼 어려운 문제는 아니었습니다. 초보자에게 가장 도움이 되었던 코딩 과제는 오히려 제가 실제로 끝낸, 따분하지만 재미있는 작은 문제들이었습니다. 보통 밤늦게 차가운 차를 마시며 노트북 옆에 두고 풀었던 문제들이었죠.
그러니 오늘 밤 에디터를 열고 FizzBuzz를 작동시켜 보세요. 코드가 좀 지저분하더라도 괜찮습니다. 재미있을 때 제 목록을 하나씩 따라 해 보세요. 재미가 없어지면 표에서 가장 친숙해 보이는 사이트로 옮겨가세요. 이 습관을 아주 작게 유지해서 건너뛰면 좀 어색하게 느껴지도록 하세요. 한 달 후에는 이 중 일부가 거의 지루하게 느껴질 텐데, 바로 그 지루함이 진정한 코딩 실력을 갖추었을 때 느끼는 감정일 겁니다.