가이드
가입부터 문제 풀기, 한 줄씩 따라가는 해설 화면 읽는 법, 점수·랭킹까지 차례대로 안내해요. 프로그래밍 용어가 낯설어도 괜찮아요 — 그림은 모두 실제 해설 화면과 같은 부품으로 그렸어요.
① 시작하기
- 회원가입: 이메일+비밀번호 또는 Google 계정으로 가입해요. 비밀번호는 8~72자이고 영문·숫자·특수문자를 각각 1개 이상 넣어야 해요. 이메일로 가입하면 확인 메일이 갈 수 있어요 — 메일의 링크를 눌러 인증한 뒤 로그인하세요.
- 승인 대기: 가입하면 관리자가 확인한 뒤 승인해요. 승인 전에도 문제와 코드는 볼 수 있지만 제출(채점), 해설, 랭킹은 이용할 수 없어요. 기다리는 동안 이 가이드를 읽어 두면 좋아요.
- 승인 후: 바로 모든 기능을 쓸 수 있어요. 로그인 상태와 내 점수는 헤더 오른쪽에서 확인해요.
② 문제 풀기
- 문제 목록: 언어(C / Python / Java)와 유형(출력 결과 / 빈칸 채우기)으로 골라 볼 수 있어요. 이미 푼 문제에는 ✓ 표시가 붙어요.
| 유형 | 무엇을 쓰나 | 채점 방식 |
|---|---|---|
| 출력 결과 | 프로그램이 화면에 찍는 결과 전체 | 각 줄 끝 공백과 맨 끝 빈 줄은 무시해요. 대소문자·줄바꿈 위치·줄 앞 공백은 구분해요. |
| 빈칸 채우기 | ( ① ) 자리에 들어갈 코드 | 공백은 모두 지우고 비교해요(i<n과 i < n은 같은 답). 대소문자는 구분해요. |
- 출력 결과 입력 팁: 여러 줄이면 Enter로 줄을 나눠요. 쉼표·괄호·따옴표처럼 화면에 찍히는 문자는 그대로 써요.
- 모르겠으면: 모르겠어요, 해설 보기를 누르면 해설이 열려요. 그 뒤에 맞히면 점수는 50%만 받아요.
- 이미 푼 문제: 다시 들어오면 해설이 바로 열리지 않고 처음 상태로 보여요. 그대로 다시 제출해 연습하거나(점수 없음), 위쪽 해설 바로 보기로 바로 확인할 수 있어요. 맞힌 뒤에는 ↺ 다시 풀기, 해설을 연 뒤에는 해설 닫고 다시 풀기로 처음부터 다시 풀 수 있어요.
- 공유: 문제 제목 옆 🔗 공유 버튼 → 휴대폰은 공유 창이, PC는 링크 복사(
/problems/번호/)가 돼요.
③ 해설 화면 보는 법
해설은 코드를 디버거처럼 한 단계씩 실행하며 보여 줘요. 화면 한쪽엔 코드, 다른 쪽엔 그 순간의 변수와 출력이 있어요. 이 절만 읽어도 해설 화면의 거의 모든 것을 읽을 수 있어요.
3-1. 한눈에 보기
아래는 실제 해설 화면과 똑같은 부품으로 만든 예시예요. 직접 눌러서 넘겨 봐도 돼요.
1class Box {2int value;34Box(int value) {5this.value = value;6}7}89public class Main {10public static void main(String[] args) {11Box a = new Box(1);12Box b = a;13b.value = 5;▶14Box c = new Box(7);15System.out.println(a.value + " " + c.value);16}17}
5변수 (콜 스택)
| aBox | → @1 |
| bBox | → @1 |
6힙 (객체)
| @1Box | Box value5 |
7출력 (stdout)
(아직 출력 없음)버튼으로 넘겨 보세요. 이 상자를 한 번 누른 뒤에는 키보드 ← → 로도 넘길 수 있어요.
| 번호 | 이름 | 한 줄 설명 |
|---|---|---|
| 1 | 조작 막대 | 한 단계씩 앞뒤로, 자동 재생, 속도, 슬라이더로 원하는 단계로 이동. 키보드 ← → |
| 2 | 지금 단계 | 이번 단계가 실행 / 함수 호출 / 함수 반환 / 예외 발생 중 무엇인지와 줄 번호 |
| 3 | 줄 해설 💡 | 출제자가 이 줄에 단 설명 (없는 줄도 있어요) |
| 4 | 코드 | ▶ = 다음에 실행될 줄(노란 바탕), 흐린 바탕 줄 = 방금 실행한 줄 |
| 5 | 변수 (콜 스택) | 지금 살아 있는 함수들과 그 안의 변수 |
| 6 | 힙 (객체) | Java의 new, C의 malloc으로 만든 것이 사는 곳 (있을 때만 나타나요) |
| 7 | 출력 | 지금까지 화면에 찍힌 내용. 이번 단계에서 새로 찍힌 부분은 노란색 |
3-2. 가장 중요한 규칙: ▶는 "실행 직전"
▶가 가리키는 줄은 아직 실행되지 않았어요. 오른쪽 변수·출력은 그 줄을 실행하기 전 상태예요.
그 줄의 결과는 다음 ▶을 한 번 눌러야 보여요.
짧은 예시의 두 단계를 나란히 놓고 보면 이렇게 돼요.
1x = 3▶2x = x * 23nums = [1, 2, 3]4nums[1] = x5print(x, nums)
| xint | 3 |
▶가 x = x * 2에 있지만 x는 아직 3 — 이 줄은 아직 실행되지 않았어요.
1x = 32x = x * 2▶3nums = [1, 2, 3]4nums[1] = x5print(x, nums)
| xint | 6 |
한 단계 넘기자 x가 6으로 바뀌었어요. ✨ 바뀐 값은 노랗게 반짝여요.
- 노랗게 반짝 = 직전 단계와 비교해 값이 바뀌었거나 새로 생긴 변수예요. 배열·리스트는 바뀐 칸만 반짝여요.
- 화살표(
→ arr[2],→ @2)가 다른 곳을 가리키게 되거나, 힙 객체·딕셔너리에서 값이 바뀐 필드·항목도 그 줄만 반짝여요. 새로 생긴 변수와 객체는 이름까지 반짝여요. - 반짝임은 한 번만 지나가요. 놓쳤다면 ◀ 이전 → 다음 ▶으로 다시 보면 돼요.
직접 넘겨 보세요.
▶1x = 32x = x * 23nums = [1, 2, 3]4nums[1] = x5print(x, nums)
변수 (콜 스택)
출력 (stdout)
(아직 출력 없음)버튼으로 넘겨 보세요. 이 상자를 한 번 누른 뒤에는 키보드 ← → 로도 넘길 수 있어요.
❓ 확인 질문:▶가 print(x, nums)에 있을 때 출력 칸에 6 [1, 6, 3]이 있을까요? (눌러서 답 보기)
3-3. 단계 표시의 네 종류
| 표시 | 뜻 | 볼 것 |
|---|---|---|
| 실행 | 평범하게 한 줄 진행 | ▶ 줄과 바뀐 변수 |
| 함수 호출 | 함수에 막 들어옴 | 콜 스택 맨 위에 새 칸이 생김, 매개변수 값 |
| 함수 반환 | 함수가 끝나 값을 돌려줌 | 초록 return 6 표시 → 다음 단계에서 그 칸이 사라지고 호출한 쪽으로 돌아가요 |
| 예외 발생 | 오류가 던져짐 | try/catch 문제에서 어느 줄에서 터졌는지 |
3-4. 변수 (콜 스택)
💭 비유:식판 쌓기. 함수를 부를 때마다 새 식판(칸)이 맨 위에 올라가고, 함수가 끝나면 맨 위 식판부터 치워요. 일은 언제나 맨 위 식판에서 해요.
화면에서는
- 파란 테두리 칸 = 지금 실행 중인 함수(맨 위). 그 아래 칸들은 “내가 부른 함수가 끝나길 기다리는 중”이에요.
- 칸 제목 = 함수 이름. 예: main() total() Main.main(), 생성자 Box(), Python 맨 바깥 코드는 전역
- 칸 안 = 그 함수의 지역 변수와 매개변수. 이름 옆 작은 글씨는 자료형(
int,int[5],str…)이에요. - 전역 / static 칸: C의 전역 변수, Java의
static필드. 어느 함수에서나 같은 값을 봐요.
재귀가 이해되는 순간
가이드 예시 total(3) → total(2) → total(1)이 가장 깊이 들어간 순간의 콜 스택이에요.
| nint | 1 |
| nint | 2 |
| nint | 3 |
- 같은 이름
n이 여러 개 보이는 건 오류가 아니에요. 호출마다 자기 변수를 따로 가져요. 같은 이름이지만 다른 칸 = 다른 변수예요. return할 때마다 맨 위 칸이 하나씩 사라지고, 아래 칸이 돌려받은 값으로 계산을 이어가요.- 공부 팁: 함수 반환 단계의 초록 표시만 따라가도 결과가 조립되는 과정이 보여요 — return 1 → return 3 → return 6
▶1def total(n):2if n == 1:3return 14return n + total(n - 1)56print(total(3))
변수 (콜 스택)
출력 (stdout)
(아직 출력 없음)버튼으로 넘겨 보세요. 이 상자를 한 번 누른 뒤에는 키보드 ← → 로도 넘길 수 있어요.
3-5. 힙 (객체)
💭 비유:물건은 창고(힙)에, 변수에는 창고 번호표만. Java에서 new Box(1)을 하면 객체는 힙에 만들어지고, 변수에는 “그 객체가 어디 있는지”(참조)만 들어가요.
화면에서는
- 변수 값이 → @1 처럼 보이면 “힙의 @1번 상자를 가리킨다”는 뜻이에요. 오른쪽 아래 힙 (객체)에서
@1을 찾아요. - 힙의 상자 = 객체 하나. 맨 위 회색 줄은 실제 클래스 이름, 아래는 필드와 값이에요.
- 두 변수가 똑같이
→ @1이면 같은 객체 하나를 함께 가리켜요. 한쪽에서 바꾸면 다른 쪽에서도 바뀐 값이 보여요. 아래 예시에서b.value = 5를 실행하는 순간 힙의@1상자 안value줄이 반짝이는 걸 확인해 보세요.
변수 (콜 스택)
| aBox | → @1 |
| bBox | → @1 |
힙 (객체)
| @1Box | Box value5 |
this도 참조예요. 생성자·메서드 안에서this → @1= “지금 다루는 객체는 @1”.- 필드 이름 옆 괄호
x (Parent),x (Child): 부모와 자식이 같은 이름의 필드를 각각 가진 경우예요. 둘은 다른 칸이에요.
| @1Child | Child x (Parent)1 x (Child)0 |
- 정처기 단골 함정: 생성자 안에서 오버라이딩된 메서드 호출 → 콜 스택 맨 위가 자식 메서드로 바뀌는 순간, 자식 필드가 아직 기본값(0)인 것을 힙에서 확인해 보세요.
- 힙 칸은 비어 있으면 아예 보이지 않아요. Python은 리스트·객체를 변수 칸 안에 바로 보여 줘서 힙 칸이 나오지 않아요.
1class Box {2int value;34Box(int value) {5this.value = value;6}7}89public class Main {10public static void main(String[] args) {▶11Box a = new Box(1);12Box b = a;13b.value = 5;14Box c = new Box(7);15System.out.println(a.value + " " + c.value);16}17}
변수 (콜 스택)
출력 (stdout)
(아직 출력 없음)버튼으로 넘겨 보세요. 이 상자를 한 번 누른 뒤에는 키보드 ← → 로도 넘길 수 있어요.
❓ 확인 질문:Box b = a; 를 실행하면 힙에 상자가 하나 더 생길까요? (눌러서 답 보기)
→ @1이에요. 새 상자는 new를 할 때만 생겨요.3-6. 포인터·참조 화살표
- C 포인터
p int * → arr[1]= p에 arr[1]의 주소가 들어 있다 = “p가 arr[1]을 가리킨다”.*p= 가리키는 곳의 값 (아래 그림에서는 arr[1]의 값 6)p++하면 화살표가→ arr[2]로 한 칸 이동하는 게 보여요(바뀐 화살표는 노랗게 반짝여요)- → NULL = 아무것도 가리키지 않음
p++ 하기 전
| arrint[3] | 03 16 29 |
| pint * | → arr[1] |
| qint * | → NULL |
p++ 한 뒤 — 화살표가 한 칸 이동
| arrint[3] | 03 16 29 |
| pint * | → arr[2] |
| qint * | → NULL |
- Java 참조와 C의
malloc메모리도 같은 화살표 표기(→ @1)를 써요. Java에서 비어 있는 참조(null)도→ NULL로 보여요. - Python 변수는 화살표 없이 값(리스트·객체 포함)을 칸 안에 바로 보여 줘요.
3-7. 값 읽는 법
| 모양 | 뜻 | ||||
|---|---|---|---|---|---|
010 120 230 | 배열/리스트. 칸 위 작은 숫자가 인덱스(0부터) | ||||
| "a b" | 문자열 (따옴표가 있어 공백도 보여요) | ||||
| 'A' | C/Java 문자 하나 (char) | ||||
| TrueNone | Python의 참/거짓, 값 없음 | ||||
| true→ NULL | Java의 참/거짓, 비어 있는 참조(null) | ||||
| 딕셔너리(dict): 왼쪽 키, 오른쪽 값 | ||||
01 16 23 | 배열 칸 하나만 반짝 = 그 인덱스만 바뀜 |
3-8. 출력 (stdout)
- 프로그램이 지금까지 화면에 찍은 전부가 쌓여 보여요.
- 노란 글씨 = 이번 단계에서 새로 찍힌 부분. 어느 줄이 무엇을 찍었는지 바로 연결돼요.
- 출력 결과 문제를 틀렸다면: 마지막 단계의 출력과 내 답을 한 글자씩 비교해 보세요(공백·줄바꿈 위치).
1 2
3 4
3-9. 조작법
| 하고 싶은 것 | 방법 |
|---|---|
| 한 단계 앞/뒤 | 다음 ▶ / ◀ 이전, 키보드 → / ← |
| 처음·끝으로 | ⏮ / ⏭, 키보드 Home / End |
| 원하는 지점으로 | 슬라이더 끌기 |
| 저절로 넘기기 | ▶ 재생 (누르면 ⏸ 정지로 바뀜), 속도 느리게/보통/빠르게 |
3-10. 언어별로 다르게 보이는 점
C
- 맨 아래 칸
- main()
- 자주 보는 것
배열 칸, 포인터 화살표
→ arr[1]031629- 주의
printf는\n을 써야 줄이 바뀌어요
Python
- 맨 아래 칸
- 전역
- 자주 보는 것
리스트·딕셔너리, 재귀 칸
0112"k" 1 - 주의
print는 끝에 자동으로 줄을 바꿔요
Java
- 맨 아래 칸
- Main.main()
- 자주 보는 것
힙 객체,
this, static, 생성자 칸→ @1"hi"- 주의
print는 줄을 안 바꾸고println은 바꿔요
3-11. 추천 공부 순서
- 먼저 손(종이)으로 끝까지 추적해서 답을 내요.
- 해설에서 ▶ 재생으로 한 번 전체 흐름을 봐요.
- 내 추적과 달라지는 지점을 슬라이더로 찾아 그 단계에서 멈춰요 — 어떤 변수가 예상과 다른지.
- 함수 호출 / 함수 반환 단계와 노랗게 반짝이는 값만 골라 다시 봐요.
- 핵심 정리로 개념을 정리하고, 내 말로 학습자 해설을 남겨요.
④ 핵심 정리와 학습자 해설
- 핵심 정리: 출제자가 쓴 요약이에요. 정답을 맞히거나 해설을 연 뒤에만 보여요.
- 학습자 해설: 같은 코드라도 설명 방식은 사람마다 달라요. 문제를 맞힌 사람만 쓸 수 있고(문제마다 한 개, 나중에 수정 가능), 풀이 중에는 보이지 않아요. 좋아요가 많은 해설이 위로 올라가요.
- 부적절한 글은 관리자가 숨길 수 있어요.
⑤ 점수·랭킹
문제마다 기본점이 있어요: 난이도 ★ 10점 · ★★ 20점 · ★★★ 30점.
| 상황 | 받는 점수 |
|---|---|
| 첫 제출에 정답 | 기본점 100% |
| 두 번째 제출 이후 정답 | 80% |
| 해설을 먼저 보고 정답 (몇 번째 제출이든) | 50% |
| 이미 맞힌 문제 다시 풀기 | 0점 (연습) |
- 점수는 문제마다 처음 맞힐 때 한 번만 받아요. 맞힌 뒤 해설을 보는 건 점수에 영향이 없어요.
- 티어 (누적 점수): 브론즈 → 실버(200) → 골드(600) → 플래티넘(1500) → 다이아(3000)
- 랭킹: 이번 주(월요일 0시부터, 한국 시간) / 전체. 승인된 회원만 집계해요. 랭킹 보기 →
⑥ 자주 묻는 질문
정답 같은데 오답이에요
대소문자, 줄바꿈 위치, 출력에 없는 공백(특히 줄 앞 공백)을 확인하세요. 줄 끝 공백과 마지막 빈 줄은 괜찮아요. 빈칸 채우기는 공백을 무시하지만 대소문자는 구분해요.
제출 버튼이 안 눌려요 / 해설이 안 열려요
로그인했는지, 그리고 승인 상태(헤더 아래 안내 줄)를 확인하세요. 승인 전에는 제출·해설을 쓸 수 없어요.
승인은 언제 되나요?
관리자가 확인하는 대로 승인돼요. 그동안 문제와 코드는 볼 수 있어요.
해설 단계가 너무 많아요
슬라이더로 건너뛰고, 💡 줄 해설이 있는 단계와 함수 호출/반환 단계 위주로 보세요.
모바일에서도 되나요?
돼요. 코드 아래에 변수·출력이 이어서 나와요. 가로로 돌리면 더 넓게 볼 수 있어요.