목차

가이드

가입부터 문제 풀기, 한 줄씩 따라가는 해설 화면 읽는 법, 점수·랭킹까지 차례대로 안내해요. 프로그래밍 용어가 낯설어도 괜찮아요 — 그림은 모두 실제 해설 화면과 같은 부품으로 그렸어요.

① 시작하기

  1. 회원가입: 이메일+비밀번호 또는 Google 계정으로 가입해요. 비밀번호는 8~72자이고 영문·숫자·특수문자를 각각 1개 이상 넣어야 해요. 이메일로 가입하면 확인 메일이 갈 수 있어요 — 메일의 링크를 눌러 인증한 뒤 로그인하세요.
  2. 승인 대기: 가입하면 관리자가 확인한 뒤 승인해요. 승인 전에도 문제와 코드는 볼 수 있지만 제출(채점), 해설, 랭킹은 이용할 수 없어요. 기다리는 동안 이 가이드를 읽어 두면 좋아요.
  3. 승인 후: 바로 모든 기능을 쓸 수 있어요. 로그인 상태와 내 점수는 헤더 오른쪽에서 확인해요.

회원가입 하러 가기 →

↑ 맨 위로

② 문제 풀기

  • 문제 목록: 언어(C / Python / Java)와 유형(출력 결과 / 빈칸 채우기)으로 골라 볼 수 있어요. 이미 푼 문제에는 ✓ 표시가 붙어요.
유형무엇을 쓰나채점 방식
출력 결과프로그램이 화면에 찍는 결과 전체각 줄 끝 공백과 맨 끝 빈 줄은 무시해요. 대소문자·줄바꿈 위치·줄 앞 공백은 구분해요.
빈칸 채우기( ① ) 자리에 들어갈 코드공백은 모두 지우고 비교해요(i<n과 i < n은 같은 답). 대소문자는 구분해요.
  • 출력 결과 입력 팁: 여러 줄이면 Enter로 줄을 나눠요. 쉼표·괄호·따옴표처럼 화면에 찍히는 문자는 그대로 써요.
  • 모르겠으면: 모르겠어요, 해설 보기를 누르면 해설이 열려요. 그 뒤에 맞히면 점수는 50%만 받아요.
  • 이미 푼 문제: 다시 들어오면 해설이 바로 열리지 않고 처음 상태로 보여요. 그대로 다시 제출해 연습하거나(점수 없음), 위쪽 해설 바로 보기로 바로 확인할 수 있어요. 맞힌 뒤에는 ↺ 다시 풀기, 해설을 연 뒤에는 해설 닫고 다시 풀기로 처음부터 다시 풀 수 있어요.
  • 공유: 문제 제목 옆 🔗 공유 버튼 → 휴대폰은 공유 창이, PC는 링크 복사(/problems/번호/)가 돼요.

↑ 맨 위로

③ 해설 화면 보는 법

해설은 코드를 디버거처럼 한 단계씩 실행하며 보여 줘요. 화면 한쪽엔 코드, 다른 쪽엔 그 순간의 변수와 출력이 있어요. 이 절만 읽어도 해설 화면의 거의 모든 것을 읽을 수 있어요.

3-1. 한눈에 보기

아래는 실제 해설 화면과 똑같은 부품으로 만든 예시예요. 직접 눌러서 넘겨 봐도 돼요.

19 / 17
2실행14번 줄 실행 직전
3 💡 new를 한 번 더 하면 힙에 새 상자가 하나 더 생긴다
4
1class Box {
2 int value;
3
4 Box(int value) {
5 this.value = value;
6 }
7}
8
9public class Main {
10 public static void main(String[] args) {
11 Box a = new Box(1);
12 Box b = a;
13 b.value = 5;
▶14 Box c = new Box(7);
15 System.out.println(a.value + " " + c.value);
16 }
17}

5변수 (콜 스택)

Main.main()
aBox→ @1
bBox→ @1

6힙 (객체)

heap
@1Box
Box
value5

7출력 (stdout)

(아직 출력 없음)

버튼으로 넘겨 보세요. 이 상자를 한 번 누른 뒤에는 키보드 ← → 로도 넘길 수 있어요.

예시: Java 객체 만들기 (가이드 전용 코드를 실제로 실행한 기록)
번호이름한 줄 설명
1조작 막대한 단계씩 앞뒤로, 자동 재생, 속도, 슬라이더로 원하는 단계로 이동. 키보드 ← →
2지금 단계이번 단계가 실행 / 함수 호출 / 함수 반환 / 예외 발생 중 무엇인지와 줄 번호
3줄 해설 💡출제자가 이 줄에 단 설명 (없는 줄도 있어요)
4코드▶ = 다음에 실행될 줄(노란 바탕), 흐린 바탕 줄 = 방금 실행한 줄
5변수 (콜 스택)지금 살아 있는 함수들과 그 안의 변수
6힙 (객체)Java의 new, C의 malloc으로 만든 것이 사는 곳 (있을 때만 나타나요)
7출력지금까지 화면에 찍힌 내용. 이번 단계에서 새로 찍힌 부분은 노란색

↑ 맨 위로

3-2. 가장 중요한 규칙: ▶는 "실행 직전"

▶가 가리키는 줄은 아직 실행되지 않았어요. 오른쪽 변수·출력은 그 줄을 실행하기 전 상태예요.

그 줄의 결과는 다음 ▶을 한 번 눌러야 보여요.

짧은 예시의 두 단계를 나란히 놓고 보면 이렇게 돼요.

단계 2실행2번 줄 실행 직전
1x = 3
▶2x = x * 2
3nums = [1, 2, 3]
4nums[1] = x
5print(x, nums)
전역
xint3

▶가 x = x * 2에 있지만 x는 아직 3 — 이 줄은 아직 실행되지 않았어요.

단계 3실행3번 줄 실행 직전
1x = 3
2x = x * 2
▶3nums = [1, 2, 3]
4nums[1] = x
5print(x, nums)
전역
xint6

한 단계 넘기자 x가 6으로 바뀌었어요. ✨ 바뀐 값은 노랗게 반짝여요.

  • 노랗게 반짝 = 직전 단계와 비교해 값이 바뀌었거나 새로 생긴 변수예요. 배열·리스트는 바뀐 칸만 반짝여요.
  • 화살표(→ arr[2], → @2)가 다른 곳을 가리키게 되거나, 힙 객체·딕셔너리에서 값이 바뀐 필드·항목도 그 줄만 반짝여요. 새로 생긴 변수와 객체는 이름까지 반짝여요.
  • 반짝임은 한 번만 지나가요. 놓쳤다면 ◀ 이전 → 다음 ▶으로 다시 보면 돼요.

직접 넘겨 보세요.

1 / 6
실행1번 줄 실행 직전
💡 x를 만든다. 오른쪽 변수 칸에 x가 새로 생긴다
▶1x = 3
2x = x * 2
3nums = [1, 2, 3]
4nums[1] = x
5print(x, nums)

변수 (콜 스택)

전역
(변수 없음)

출력 (stdout)

(아직 출력 없음)

버튼으로 넘겨 보세요. 이 상자를 한 번 누른 뒤에는 키보드 ← → 로도 넘길 수 있어요.

예시: 변수 값이 바뀌는 순간 (Python)
❓ 확인 질문:▶가 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)이 가장 깊이 들어간 순간의 콜 스택이에요.

total()
nint1
total()
nint2
total()
nint3
전역
(변수 없음)
맨 위(파란 테두리)가 지금 실행 중인 total(1)
  • 같은 이름 n이 여러 개 보이는 건 오류가 아니에요. 호출마다 자기 변수를 따로 가져요. 같은 이름이지만 다른 칸 = 다른 변수예요.
  • return할 때마다 맨 위 칸이 하나씩 사라지고, 아래 칸이 돌려받은 값으로 계산을 이어가요.
  • 공부 팁: 함수 반환 단계의 초록 표시만 따라가도 결과가 조립되는 과정이 보여요 — return 1 → return 3 → return 6
1 / 15
실행1번 줄 실행 직전
▶1def total(n):
2 if n == 1:
3 return 1
4 return n + total(n - 1)
5
6print(total(3))

변수 (콜 스택)

전역
(변수 없음)

출력 (stdout)

(아직 출력 없음)

버튼으로 넘겨 보세요. 이 상자를 한 번 누른 뒤에는 키보드 ← → 로도 넘길 수 있어요.

예시: 재귀 호출과 콜 스택 (Python)

↑ 맨 위로

3-5. 힙 (객체)

💭 비유:물건은 창고(힙)에, 변수에는 창고 번호표만. Java에서 new Box(1)을 하면 객체는 힙에 만들어지고, 변수에는 “그 객체가 어디 있는지”(참조)만 들어가요.

화면에서는

  • 변수 값이 → @1 처럼 보이면 “힙의 @1번 상자를 가리킨다”는 뜻이에요. 오른쪽 아래 힙 (객체)에서 @1을 찾아요.
  • 힙의 상자 = 객체 하나. 맨 위 회색 줄은 실제 클래스 이름, 아래는 필드와 값이에요.
  • 두 변수가 똑같이 → @1이면 같은 객체 하나를 함께 가리켜요. 한쪽에서 바꾸면 다른 쪽에서도 바뀐 값이 보여요. 아래 예시에서 b.value = 5를 실행하는 순간 힙의 @1 상자 안 value 줄이 반짝이는 걸 확인해 보세요.

변수 (콜 스택)

Main.main()
aBox→ @1
bBox→ @1

힙 (객체)

heap
@1Box
Box
value5
b = a 다음 b.value = 5 를 실행한 뒤: a와 b가 같은 @1을 가리키므로 a.value도 5
  • this도 참조예요. 생성자·메서드 안에서 this → @1 = “지금 다루는 객체는 @1”.
  • 필드 이름 옆 괄호 x (Parent), x (Child): 부모와 자식이 같은 이름의 필드를 각각 가진 경우예요. 둘은 다른 칸이에요.
heap
@1Child
Child
x (Parent)1
x (Child)0
부모·자식에 같은 이름의 필드 x가 있을 때 (모양 예시)
  • 정처기 단골 함정: 생성자 안에서 오버라이딩된 메서드 호출 → 콜 스택 맨 위가 자식 메서드로 바뀌는 순간, 자식 필드가 아직 기본값(0)인 것을 힙에서 확인해 보세요.
  • 힙 칸은 비어 있으면 아예 보이지 않아요. Python은 리스트·객체를 변수 칸 안에 바로 보여 줘서 힙 칸이 나오지 않아요.
1 / 17
실행11번 줄 실행 직전
💡 new로 만든 객체는 힙에 생기고, 변수 a에는 화살표(참조)만 들어간다
1class Box {
2 int value;
3
4 Box(int value) {
5 this.value = value;
6 }
7}
8
9public class Main {
10 public static void main(String[] args) {
▶11 Box a = new Box(1);
12 Box b = a;
13 b.value = 5;
14 Box c = new Box(7);
15 System.out.println(a.value + " " + c.value);
16 }
17}

변수 (콜 스택)

Main.main()
(변수 없음)

출력 (stdout)

(아직 출력 없음)

버튼으로 넘겨 보세요. 이 상자를 한 번 누른 뒤에는 키보드 ← → 로도 넘길 수 있어요.

예시: 객체와 참조 (Java)
❓ 확인 질문:Box b = a; 를 실행하면 힙에 상자가 하나 더 생길까요? (눌러서 답 보기)
아니요. 객체를 복사하지 않고 화살표(참조)만 복사해요. 힙에는 여전히 @1 하나뿐이고, a와 b가 둘 다 → @1이에요. 새 상자는 new를 할 때만 생겨요.

↑ 맨 위로

3-6. 포인터·참조 화살표

  • C 포인터 p int * → arr[1] = p에 arr[1]의 주소가 들어 있다 = “p가 arr[1]을 가리킨다”.
    • *p = 가리키는 곳의 값 (아래 그림에서는 arr[1]의 값 6)
    • p++ 하면 화살표가 → arr[2]로 한 칸 이동하는 게 보여요(바뀐 화살표는 노랗게 반짝여요)
    • → NULL = 아무것도 가리키지 않음

p++ 하기 전

main()
arrint[3]
03
16
29
pint *→ arr[1]
qint *→ NULL

p++ 한 뒤 — 화살표가 한 칸 이동

main()
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)
TrueNonePython의 참/거짓, 값 없음
true→ NULLJava의 참/거짓, 비어 있는 참조(null)
"a"1
"b"2
딕셔너리(dict): 왼쪽 키, 오른쪽 값
01
16
23
배열 칸 하나만 반짝 = 그 인덱스만 바뀜

↑ 맨 위로

3-8. 출력 (stdout)

  • 프로그램이 지금까지 화면에 찍은 전부가 쌓여 보여요.
  • 노란 글씨 = 이번 단계에서 새로 찍힌 부분. 어느 줄이 무엇을 찍었는지 바로 연결돼요.
  • 출력 결과 문제를 틀렸다면: 마지막 단계의 출력과 내 답을 한 글자씩 비교해 보세요(공백·줄바꿈 위치).
1 2
3 4
두 번째 줄 '3 4'가 이번 단계에서 새로 찍힌 부분

↑ 맨 위로

3-9. 조작법

하고 싶은 것방법
한 단계 앞/뒤다음 ▶ / ◀ 이전, 키보드 → / ←
처음·끝으로⏮ / ⏭, 키보드 Home / End
원하는 지점으로슬라이더 끌기
저절로 넘기기▶ 재생 (누르면 ⏸ 정지로 바뀜), 속도 느리게/보통/빠르게

↑ 맨 위로

3-10. 언어별로 다르게 보이는 점

C

맨 아래 칸
main()
자주 보는 것

배열 칸, 포인터 화살표

03
16
29
→ arr[1]
주의
printf는 \n을 써야 줄이 바뀌어요

Python

맨 아래 칸
전역
자주 보는 것

리스트·딕셔너리, 재귀 칸

01
12
"k"1
주의
print는 끝에 자동으로 줄을 바꿔요

Java

맨 아래 칸
Main.main()
자주 보는 것

힙 객체, this, static, 생성자 칸

→ @1"hi"
주의
print는 줄을 안 바꾸고 println은 바꿔요

↑ 맨 위로

3-11. 추천 공부 순서

  1. 먼저 손(종이)으로 끝까지 추적해서 답을 내요.
  2. 해설에서 ▶ 재생으로 한 번 전체 흐름을 봐요.
  3. 내 추적과 달라지는 지점을 슬라이더로 찾아 그 단계에서 멈춰요 — 어떤 변수가 예상과 다른지.
  4. 함수 호출 / 함수 반환 단계와 노랗게 반짝이는 값만 골라 다시 봐요.
  5. 핵심 정리로 개념을 정리하고, 내 말로 학습자 해설을 남겨요.

↑ 맨 위로

④ 핵심 정리와 학습자 해설

  • 핵심 정리: 출제자가 쓴 요약이에요. 정답을 맞히거나 해설을 연 뒤에만 보여요.
  • 학습자 해설: 같은 코드라도 설명 방식은 사람마다 달라요. 문제를 맞힌 사람만 쓸 수 있고(문제마다 한 개, 나중에 수정 가능), 풀이 중에는 보이지 않아요. 좋아요가 많은 해설이 위로 올라가요.
  • 부적절한 글은 관리자가 숨길 수 있어요.

↑ 맨 위로

⑤ 점수·랭킹

문제마다 기본점이 있어요: 난이도 ★ 10점 · ★★ 20점 · ★★★ 30점.

상황받는 점수
첫 제출에 정답기본점 100%
두 번째 제출 이후 정답80%
해설을 먼저 보고 정답 (몇 번째 제출이든)50%
이미 맞힌 문제 다시 풀기0점 (연습)
  • 점수는 문제마다 처음 맞힐 때 한 번만 받아요. 맞힌 뒤 해설을 보는 건 점수에 영향이 없어요.
  • 티어 (누적 점수): 브론즈 → 실버(200) → 골드(600) → 플래티넘(1500) → 다이아(3000)
  • 랭킹: 이번 주(월요일 0시부터, 한국 시간) / 전체. 승인된 회원만 집계해요. 랭킹 보기 →

↑ 맨 위로

⑥ 자주 묻는 질문

정답 같은데 오답이에요

대소문자, 줄바꿈 위치, 출력에 없는 공백(특히 줄 앞 공백)을 확인하세요. 줄 끝 공백과 마지막 빈 줄은 괜찮아요. 빈칸 채우기는 공백을 무시하지만 대소문자는 구분해요.

제출 버튼이 안 눌려요 / 해설이 안 열려요

로그인했는지, 그리고 승인 상태(헤더 아래 안내 줄)를 확인하세요. 승인 전에는 제출·해설을 쓸 수 없어요.

승인은 언제 되나요?

관리자가 확인하는 대로 승인돼요. 그동안 문제와 코드는 볼 수 있어요.

해설 단계가 너무 많아요

슬라이더로 건너뛰고, 💡 줄 해설이 있는 단계와 함수 호출/반환 단계 위주로 보세요.

모바일에서도 되나요?

돼요. 코드 아래에 변수·출력이 이어서 나와요. 가로로 돌리면 더 넓게 볼 수 있어요.

↑ 맨 위로