알고리즘 입문
개념 배우기직접 풀어보기
놀면 뭐 하니,
그냥 하는거야.

하나씩 훑어보자! 리스트 순회와 탐색

코딩냥

안녕, 나 코딩냥이다냥! 파이썬 문법은 다 배웠지? 반복문도 알고, 리스트도 안다냥. 그런데 막상 문제를 받으면 "어디서부터 손대야 하지?" 하고 멈추게 된다냥. 오늘부터는 그 막막함을 없애는 연습을 할 거다냥. 첫 무기는 순회(하나씩 훑기) 라냥. 알고리즘의 절반은 이걸로 풀린다냥!

오늘의 학습 목표

  • 리스트를 처음부터 끝까지 훑는(순회) 패턴을 손에 익힌다.
  • 훑으면서 최댓값 찾기 · 합계 구하기 · 조건에 맞는 개수 세기를 직접 만든다.
  • 문제를 보고 "이건 한 번 훑으면 되는 문제" 라고 알아채는 감을 기른다.

1단계 · 컴퓨터는 한눈에 못 본다냥 (5분)

코딩냥

질문 하나 할게냥. 숫자 카드 다섯 장이 뒤집혀 있다냥. [3, 9, 1, 7, 5] 여기서 제일 큰 수가 뭐냥?

너는 눈으로 쓱 보고 바로 9라고 답했을 거다냥.

그런데 컴퓨터는 그게 안 된다냥. 컴퓨터한테 리스트는 뒤집혀 있는 카드 더미와 같다냥. 한 장씩 뒤집어봐야만 그 안에 뭐가 있는지 안다냥.

비유로 이해하기 — 뒤집힌 카드 더미

사람컴퓨터
다섯 장을 한눈에 본다한 장씩 차례로 뒤집어본다
"제일 큰 건 9네""지금까지 본 것 중 제일 큰 건 …"
순서가 필요 없다반드시 처음부터 끝까지 훑어야 한다

그래서 알고리즘의 기본은 "하나씩 훑기" 라냥!

2단계 · 순회의 기본 모양 (5분)

코딩냥

훑는 코드는 늘 똑같이 생겼다냥. 이 모양만 외워두면 절반은 끝이라냥!

numbers = [3, 9, 1, 7, 5]

for n in numbers:
    print(n)

for n in numbers 는 "numbers 안에 든 걸 하나씩 꺼내서 n 이라고 부르자" 라는 뜻이다냥. 카드를 한 장씩 뒤집는 것과 똑같다냥.

핵심순회 = 카드 한 장씩 뒤집기

꺼낼 카드가 없을 때까지 자동으로 반복된다냥. 카드가 5장이면 5번, 100장이면 100번 돈다냥. 몇 장인지 몰라도 코드는 그대로라는 게 편한 점이라냥!

3단계 · 훑으면서 기억하기 (10분)

코딩냥

그냥 훑기만 하면 아무것도 안 남는다냥. 훑으면서 뭔가를 기억해두는 것, 그게 진짜 기술이라냥. 기억할 상자를 하나 미리 만들어두면 된다냥!

최댓값 찾기

카드를 한 장씩 뒤집으면서 "지금까지 본 것 중 제일 큰 수" 를 계속 갱신한다냥.

numbers = [3, 9, 1, 7, 5]

biggest = numbers[0]        # 일단 첫 장을 챔피언으로 둔다냥

for n in numbers:
    if n > biggest:         # 더 큰 놈이 나오면
        biggest = n         # 챔피언을 바꾼다냥

print(biggest)              # 9

biggest = 0 으로 시작하면 안 된다냥!

[-5, -2, -9] 처럼 전부 음수인 리스트에서는 0보다 큰 수가 하나도 없어서 답이 0 이 나와버린다냥. 리스트에 없는 값이 답으로 나오면 안 되겠지?

그래서 첫 번째 원소를 시작값으로 두는 것이 안전하다냥.

합계 구하기

이번엔 기억 상자에 더해나간다냥.

numbers = [3, 9, 1, 7, 5]

total = 0                   # 아직 아무것도 안 더했으니 0 이라냥

for n in numbers:
    total = total + n       # total += n 이라고 짧게 써도 된다냥

print(total)                # 25

합계는 왜 0 으로 시작해도 괜찮냥? 아무것도 안 더한 상태의 합이 정확히 0 이기 때문이라냥. 최댓값과 달리 여기선 0이 진짜 정답의 출발점이라냥!

조건에 맞는 개수 세기

훑으면서 조건에 맞을 때만 상자를 1씩 늘린다냥.

numbers = [3, 9, 1, 7, 5, 8, 2]

count = 0

for n in numbers:
    if n % 2 == 0:          # 2로 나눈 나머지가 0이면 짝수라냥
        count += 1

print(count)                # 2  (8, 2)
정리셋 다 모양이 똑같다냥
  1. 기억할 상자를 만든다 (biggest / total / count)
  2. for 로 하나씩 훑는다
  3. 상자를 갱신한다
  4. 다 훑은 뒤 상자를 출력한다

바뀌는 건 3번뿐이라냥. 이 틀을 외워두면 비슷한 문제는 다 풀린다냥!

4단계 · 몇 번이나 훑을까냥? (5분)

코딩냥

마지막으로 감각 하나만 더 챙겨가자냥. "몇 번 훑었냐" 를 세는 습관이라냥.

위 코드들은 전부 리스트를 딱 한 번 훑는다냥. 카드가 100장이면 100번, 1000장이면 1000번 본다냥. 카드 수가 늘어난 만큼만 느려지니까 아주 착한 코드라냥.

나중에 배울 이야기지만 미리 살짝 알려준다냥. 리스트를 한 번 훑는 걸 O(n) 이라고 부른다냥. 지금은 용어를 외울 필요 없다냥. 대신 이것만 기억하자냥 — "한 번만 훑으면 빠르다, 훑는 안에서 또 훑으면 느려진다."

오늘 배운 내용 정리

코딩냥

배운 걸 머릿속에 콕! 박아넣을 시간이다냥. 먼저 스스로 답해보고, "정답 보기"를 눌러서 맞는지 확인해보자냥!

Q1.최댓값을 찾을 때 시작값을 0으로 두면 안 되는 이유가 뭐냥?
Q2.합계는 왜 0으로 시작해도 괜찮냥?
Q3.최댓값 찾기, 합계 구하기, 개수 세기 — 이 셋의 공통 뼈대가 뭐냥?

이제 직접 풀어볼 차례다냥

코딩냥

오늘 배운 뼈대 하나로 문제 세 개를 풀 수 있다냥! 실습 페이지에서 진짜 채점기에 제출해보자냥. 막히면 AI 힌트 버튼을 눌러도 된다냥 — 정답을 알려주진 않고 생각할 방향만 알려준다냥. 가보자냥~