RiseOJ는 solved.ac와 제휴 관계가 없습니다. 티어 아이콘 © solved.ac. solved.ac
← 브론즈 III

함수

코드를 묶어 재사용하는 단위 — 인자와 반환값.

기초 & 구현 Bronze III 브론즈 III
선수 지식: 변수
1강 함수의 개념: 코드를 묶어 재사용 공식

함수란?

함수(function) 는 자주 쓰는 코드 묶음에 이름을 붙여 재사용하는 단위입니다.
"입력(인자)을 받아 일을 하고, 결과(반환값)를 돌려준다"가 기본 구조입니다.


1. 함수의 모양

int add(int a, int b) {   // 반환형 이름(인자) { 본문 }
    return a + b;          // 결과를 돌려준다
}

int main() {
    cout << add(3, 5) << '\n';   // 8
}
def add(a, b):
    return a + b

print(add(3, 5))   # 8
  • 반환형 (C++): 함수가 돌려주는 값의 자료형. 돌려줄 게 없으면 void.
  • 인자 : 함수에 건네는 입력값.
  • return : 결과를 돌려주고 함수를 끝낸다.

2. 왜 함수를 쓰나

같은 코드를 여러 번 적는 대신 한 번 정의하고 여러 번 호출합니다.

bool isEven(int x) { return x % 2 == 0; }

// 여러 곳에서 재사용
if (isEven(a)) ...
if (isEven(b)) ...

코드가 짧아지고, 고칠 때 한 곳만 고치면 되며, 이름 덕분에 읽기도 쉬워집니다.


3. 반환값이 없는 함수

출력만 하고 돌려줄 값이 없으면 void(C++) / 그냥 return 없음(파이썬).

void greet(string name) {
    cout << "안녕, " << name << '\n';
}
def greet(name):
    print("안녕,", name)

4. 지역 변수와 범위

함수 안에서 만든 변수는 그 함수 안에서만 살아 있습니다(지역 변수). 함수가 끝나면
사라지므로, 다른 함수와 이름이 겹쳐도 서로 간섭하지 않습니다.

int square(int x) {
    int r = x * x;   // r은 이 함수 안에서만 존재
    return r;
}

복잡도

함수 호출 자체는 거의 비용이 없습니다(\(O(1)\)). 다만 함수 안에서 하는 일의
복잡도가 그대로 함수의 복잡도가 됩니다.


정리

  • 함수 = 이름 붙은 재사용 코드 묶음.
  • 인자로 입력, return으로 결과.
  • 돌려줄 게 없으면 void(C++).
  • 함수 안 변수는 지역 변수 — 밖에 영향 없음.
2강 함수 구현과 연습 공식

함수 구현 레퍼런스

함수를 실제로 어떻게 나누고 쓰는지, 그리고 값 전달의 함정을 코드로 정리합니다.


1. 여러 함수로 문제 쪼개기

판정 함수를 따로 만들면 main이 깔끔해집니다.

#include <bits/stdc++.h>
using namespace std;

bool isPrime(int n) {
    if (n < 2) return false;
    for (int i = 2; (long long)i * i <= n; i++)
        if (n % i == 0) return false;
    return true;
}

int main() {
    int n; cin >> n;
    cout << (isPrime(n) ? "소수" : "합성수") << '\n';
}
def is_prime(n):
    if n < 2:
        return False
    i = 2
    while i * i <= n:
        if n % i == 0:
            return False
        i += 1
    return True

n = int(input())
print("소수" if is_prime(n) else "합성수")

return을 만나면 함수가 즉시 끝납니다. 위 소수 판정은 약수를 하나라도 찾으면
바로 false를 돌려주고 끝나는 구조입니다.


2. 값 전달 vs 참조 전달 (C++)

기본적으로 인자는 복사되어 전달됩니다. 함수 안에서 바꿔도 밖의 값은 그대로입니다.

void tryChange(int x) { x = 100; }      // 복사본만 바뀜
void realChange(int &x) { x = 100; }    // 참조 — 원본이 바뀜

int a = 5;
tryChange(a);   cout << a;  // 5  (안 바뀜)
realChange(a);  cout << a;  // 100 (바뀜)

원본을 바꾸고 싶으면 &(참조)를 붙입니다. 큰 배열을 넘길 때도 복사를 피하려고
const& 참조를 자주 씁니다.


3. 기본 인자와 여러 값 반환

def power(base, exp=2):     # exp 기본값 2
    return base ** exp

print(power(3))      # 9  (제곱)
print(power(3, 3))   # 27

def min_max(arr):
    return min(arr), max(arr)   # 튜플로 두 값 반환

lo, hi = min_max([3, 1, 4, 1, 5])

파이썬은 여러 값을 한 번에 돌려줄 수 있어 편리합니다.


4. 함정과 패턴 인식

  • 반환 누락 — 모든 경로에서 return하지 않으면(C++) 이상한 값이 나옴.
  • 값 복사 착각 — C++에서 & 없이 넘기면 원본이 안 바뀜.
  • 전역/지역 혼동 — 같은 이름이라도 함수 안 변수는 별개.

문제에서 "같은 계산을 여러 번", "판정(소수/회문 등)", "재사용" 이 보이면 함수로
묶는 게 좋습니다. 재귀의 토대이기도 하니 확실히 익혀 두세요.


정리

함수는 (1) 판정/계산을 작은 단위로 쪼개고, (2) return으로 즉시 결과를 돌려주며,
(3) C++에선 원본 수정이 필요할 때 & 참조를 씁니다. 코드가 길어지면 함수로
나누는 습관을 들이세요.