[오늘의 문제] 함수, 객체지향

shlim55·2025년 11월 5일

코딩테스트

목록 보기
168/223

1. 성적 통계 계산기

문제 설명

5명의 학생 점수가 리스트로 주어집니다. 내장 함수를 사용하여 최고 점수, 최저 점수, 총점, 평균을 계산하여 출력하세요.

입력 예시:

입력 없음

출력 예시:

최고 점수: 95점
최저 점수: 78점
총점: 438점
평균: 87.6점

내가 작성한 코드문

scores = [85, 92, 78, 95, 88]
print(f"최고 점수: {max(scores)}점")
print(f"최저 점수: {min(scores)}점")
print(f"총점: {sum(scores)}점")
print(f"평균: {sum(scores)/len(scores)}점")

2. 인사 함수 만들기

문제 설명

이름을 매개변수로 받아서 "안녕하세요, {이름}님!"을 출력하는 함수 greet를 작성하세요. 그리고 3명의 이름으로 함수를 호출하세요.
입력 예시:

입력 없음

출력 예시:

안녕하세요, 철수님!
안녕하세요, 영희님!
안녕하세요, 민수님!

내가 작성한 코드문

for i in range(3):
    name = input("이름 입력: ")
    def greet(name):
        print(f"안녕하세요, {name}님!")

    greet(name)

다른사람의 풀이

def greet(name):
    print(f"안녕하세요, {name}님!")

greet("철수")
greet("영희")
greet("민수")

아무래도 이게 더 맞아보인다. 함수를 선언하고,
각각 인자 값 다르게 넣거나
아님 함수 밖에 반복문 형태로 출력하게 하든

3. 직사각형 넓이 계산

문제 설명

가로와 세로 길이를 매개변수로 받아서 직사각형의 넓이를 계산하여 반환하는 함수 calculate_area를 작성하세요.
두 개의 직사각형 넓이를 계산하여 출력하세요.

입력 예시:

입력 없음

출력 예시:

첫 번째 직사각형 넓이: 50
두 번째 직사각형 넓이: 56

(설명: 첫 번째 직사각형의 입력은 5와 10, 두 번째 직사각형의 입력은 7과 8)

내가 작성한 코드문

def calculate_area(width, height):
    return width * height;

print(f"첫 번째 직사각형의 넓이: {calculate_area(5, 10)}")
print(f"두 번째 직사각형의 넓이: {calculate_area(7, 8)}")

다른 사람의 풀이

def calculate_area(width, height):
    return width * height

area1 = calculate_area(5, 10)
area2 = calculate_area(7, 8)

print(f"첫 번째 직사각형 넓이: {area1}")
print(f"두 번째 직사각형 넓이: {area2}")

나는 함수 호출만 한거라면 여기는 객체선언만 한 느낌이다.

4. 커피 주문 함수

문제 설명

커피 종류와 사이즈를 매개변수로 받는 함수 order_coffee를 작성하세요. 사이즈의 기본값은 "Regular"로 설정하세요. 사이즈를 지정하지 않으면 기본값이 사용됩니다.

출력 예시와 같은 출력을 하는 함수를 정의하세요.

입력 예시:

# 호출 예시
order_coffee("아메리카노", "Large")
order_coffee("카페라떼")
order_coffee("카푸치노", "Small")

출력 예시:

아메리카노(Large) 주문이 완료되었습니다.
카페라떼(Regular) 주문이 완료되었습니다.
카푸치노(Small) 주문이 완료되었습니다.

내가 작성한 코드문

def order_coffee(kind, size = 'Regular'):
    c = f"{kind}({size}) 주문이 완료되었습니다."
    return c

print(order_coffee("아메키라노", "Large"))
print(order_coffee("카페라떼", "Regular"))
print(order_coffee("카푸치노", "Smal"))

다른 사람의 풀이

def order_coffee(coffee_type, size="Regular"):
    print(f"{coffee_type}({size}) 주문이 완료되었습니다.")

order_coffee("아메리카노", "Large")
order_coffee("카페라떼")
order_coffee("카푸치노", "Small")

함수 리턴값 있게하냐 리턴없이 print문 사용이냐 그 차이

5. 학생 정보 출력

문제 설명

이름, 나이, 학년을 매개변수로 받아 학생 정보를 출력하는 함수 print_student_info를 작성하세요. 키워드 인자를 사용하여 함수를 호출하세요. (순서를 바꿔보면서 호출해보세요!)

입력 예시:

입력 없음

출력 예시:

이름: 김철수, 나이: 16세, 학년: 2학년
이름: 이영희, 나이: 17세, 학년: 3학년
이름: 박민수, 나이: 15세, 학년: 1학년

내가 작성한 코드문

def print_student_info(name, age, grade):
    return f"이름: {name}, 나이: {age}세, 학년: {grade}학년"

print(print_student_info(name="김철수", age=16, grade=2))
print(print_student_info(name="이영희", age=17, grade=3))
print(print_student_info(name="박민수", age=15, grade=1))

6. 두 수의 교환

문제 설명

두 개의 숫자를 매개변수로 받아 교환된 값을 튜플로 반환하는 함수 swap_numbers를 작성하세요. 반환된 값을 언패킹하여 두 변수에 저장하고 출력하세요.

입력 예시:

# 호출 예시
a = 10
b = 20
a, b = swap_numbers(a, b)

출력 예시:

교환 전: a=10, b=20
교환 후: a=20, b=10

내가 작성한 코드문

a = 10
b = 20
print(f"교환 전: a = {a}, b = {b}")

def swap_numbers(a, b):
    tmp = a
    a = b
    b = tmp
    return a, b

a, b = swap_numbers(a,b)

print(f"교환 후: a = {a}, b = {b}") 

다른 사람의 풀이

def swap_numbers(a, b):
    return b, a

a = 10
b = 20
print(f"교환 전: a={a}, b={b}")
a, b = swap_numbers(a, b)
print(f"교환 후: a={a}, b={b}")

나는 자바에 익숙해져 알고리즘을 썼지만, 알고리즘 없이 이렇게 하는방법도 있다.

7. 학생 성적 분석

문제 설명

학생의 국어, 수학, 영어 점수를 매개변수로 받아서 총점, 평균, 최고점수, 최저점수를 모두 반환하는 함수 analyze_scores를 작성하세요. 반환된 값들을 각각 변수에 할당하여 출력하세요.

입력 예시:

# 호출 예시
total, avg, max_score, min_score = analyze_scores(85, 90, 78)

출력 예시:

총점: 253점
평균: 84.33333333333333점
최고 점수: 90점
최저 점수: 78점

내가 작성한 코드문

def analyze_scores(kor, math, eng):
    tp = (kor, math, eng)
    total = sum(tp)
    avg = total / len(tp)
    max_score = max(tp)
    min_score = min(tp)
    return total, avg, max_score, min_score

total, avg, max_score, min_score = analyze_scores(85, 90, 78)

print(f"총점: {total}점")    
print(f"평균: {avg}점")    
print(f"최고 점수: {max_score}점")    
print(f"최저 점수: {min_score}점")   

다른 사람의 풀이

def analyze_scores(korean, math, english):
    scores = [korean, math, english]
    total = sum(scores)
    avg = total / len(scores)
    max_score = max(scores)
    min_score = min(scores)
    return total, avg, max_score, min_score

total, avg, max_score, min_score = analyze_scores(85, 90, 78)

print(f"총점: {total}점")
print(f"평균: {avg}점")
print(f"최고 점수: {max_score}점")
print(f"최저 점수: {min_score}점")

튜플 변수냐 리스트냐 차이 결국 큰 차이 없음

8. 비밀번호 유효성 검사기

문제 설명

비밀번호가 유효한지 검사하는 함수 validate_password를 작성하세요. 비밀번호는 다음 조건을 모두 만족해야 합니다:

  • 길이가 8자 이상
  • 숫자가 최소 1개 이상 포함
    • 1부터 9
  • 영문자가 최소 1개 이상 포함
    • a부터 z 또는 A부터 Z

함수는 유효성 여부(True/False)와 실패 이유를 모두 반환(투플 형태)해야 합니다. 5개의 비밀번호를 검사하고 각각 결과를 출력하세요.

입력 예시:

# 호출 예시
passwords = ["abc123", "password", "Pass1234", "12345678", "MyP@ss99"]

for pwd in passwords:
    is_valid, message = validate_password(pwd)

출력 예시:

비밀번호: abc123
결과: 실패 (길이가 8자 미만입니다)

비밀번호: password
결과: 실패 (숫자가 포함되지 않았습니다)

비밀번호: Pass1234
결과: 성공

비밀번호: 12345678
결과: 실패 (영문자가 포함되지 않았습니다)

비밀번호: MyP@ss99
결과: 성공

내가 작성한 코드문

password = ["abc123", "password", "Pass1234", "12345678", "MyP@ss99"] 

def valid_password(pwd):
    if len(pwd) < 8:
          is_valid = "실패" 
          message = "(길이가 8자 미만입니다.)"
        #   tp = is_valid, message
    elif str.isalpha(pwd) == True:
          is_valid = "실패"
          message = "(숫자가 포함되지 않았습니다.)"      
        #   tp = is_valid, message    
    elif str.isdigit(pwd) == True:
          is_valid = "실패"
          message = "(영문자가 포함되지 않았습니다.)"      
        #   tp = is_valid, message
    else:
          is_valid = "성공"
          message = "" 
    return is_valid, message      

for pwd in password:
        is_valid, message = valid_password(pwd)  
        print(f"비밀번호: {pwd}")
        print(f"결과: {is_valid} {message}")

다른 사람의 풀이

def validate_password(password):
    # 길이 체크
    if len(password) < 8:
        return False, "길이가 8자 미만입니다"

    has_digit = False
    has_alpha = False
    for ch in password:
        if '0' <= ch <= '9':
            has_digit = True
        elif ('a' <= ch <= 'z') or ('A' <= ch <= 'Z'):
            has_alpha = True

    # 숫자 포함 여부
    if not has_digit:
        return False, "숫자가 포함되지 않았습니다"
    
    # 영문자 포함 여부
    if not has_alpha:
        return False, "영문자가 포함되지 않았습니다"
    
    return True, "성공"

passwords = ["abc123", "password", "Pass1234", "12345678", "MyP@ss99"]

for pwd in passwords:
    is_valid, message = validate_password(pwd)
    print(f"비밀번호: {pwd}")
    if is_valid:
        print(f"결과: {message}")
    else:
        print(f"결과: 실패 ({message})")

나는 isalpha, isdigit 함수를 썼다.

If문 안에 그냥 return 실패, 실패사유 이렇게 리턴하는 방법도 좋음

For문안에 isdigit 메서드 안쓰는 대신,
"1"<= ch <="9" 조건문도 쓰기.
마찬가지로 isalpha 메서드 대신 조건문"a"<=ch <="z" or "A"<=ch<="Z"

변수도 has_digit, has_alpha 를 만들어서 조건문에 일치안하면
False, "에러메시지" 반환시키는 것
다 조건문에 안 걸려들면 return True, "성공"

9. 문자열 변환 도구

문제 설명

문자열을 다양한 방식으로 변환하는 함수들을 구현하세요.

  1. join_with_space(words): 단어 리스트에서 각 단어를 공백으로 연결하여 하나의 문자열로 반환
  2. count_chars(text, *chars): 텍스트에서 매개 변수로 받은 여러 문자의 각 출현 횟수를 딕셔너리로 반환 (가변 인자 사용)
  • {문자:출현횟수}

입력 예시:

# 호출 예시
word_list = ["Python", "is", "fun"]
result = join_with_space(word_list)

text = "hello world programming"
print("문자 개수: ", count_chars(text, 'o', 'l', 'r'))

출력 예시:

결합된 문장: Python is fun
문자 개수: {'o': 3, 'l': 3, 'r': 2}

내가 작성한 코드문

word_list = ["Python", "is", "fun"]
def join_with_space(word_list):
    result = " ".join(word_list)# join 함수 안쓰고 시도 해보기 
    return result

text="hello world programming"

tp = ("o", "l", "r")

dic = {}
def count_chars(text, *chars):#함수 안에 반복문 써도 되긴 하고 두개 써보기 o, l, r각각 갯수세기 
    for i in range(len(chars)):
        dic[tp[i]] = text.count(tp[i])# 여기에 int가 들어감 

    # result = {} # 결과 변수
    # 코드를 구현하세요.
    return dic


# 위 정의한 함수들 호출하여 결과를 출력하세요.
print(f"결합된 문장: {join_with_space(word_list)}")
print(f"문자개수: {count_chars(text, *tp)}")# tp 언패킹 하거나 tp 변수를 없애거나 둘중 하나의 방식 

트러블 슈팅

맨밑에 언패킹 안해준 실수 하고, 이렇게 언패킹 하거나 tp 변수를 없애는 방식 있다 함

그리고 반복문에서도 chars 변수가 튜플((o,l,r),)이 들어가서 임시방편으로 chars[0]을 넣었었다. 그런데 수정 함

다른 사람의 풀이

def join_with_space(word_list):
    result = "" # 결과 변수

    for i in range(len(word_list)):
        result += word_list[i]

        if i < len(word_list) - 1:
            result += " "
    return result

def count_chars(text, *chars):
    result = {} # 결과 변수

    for char in chars:
        count = 0
        for c in text:
            if c == char:
                count += 1
        result[char] = count

    return result

# 위 정의한 함수들 호출하여 결과를 출력하세요.
word_list = ["Python", "is", "fun"]
result = join_with_space(word_list)
print(f"결합된 문장: {result}")

# 4. 문자 개수 세기 테스트
text = "hello world programming"
print(f"문자 개수: {count_chars(text, 'o', 'l', 'r')}")
## 클래스 정의 (1) Book 클래스

이것도 반복문을 돌려서 result에 추가를 한다면
마지막만 공백이 안들어가게 끔 해야 한다.
이럴려면 조건문을 넣어서 현재 인덱스 변수, 순번이 word_list보다 작은 경우
공백 넣기
아닐 경우 더해지지 않는다.

If i < len(word_list) - 1:
	result += " "
 

여기서도 .count 메서드를 안쓰고 count 변수로 세보는 방법

for char in chars:
 count = 0
 for t in text:
     if char == t:
         count += 1
 result[char] = count
 return result

언패킹 안하고 그냥 튜플을 변수로 넣는 방법도 있다.

책을 표현하는 Book 클래스를 작성하세요.

  • 속성: title(제목), author(저자), pages(페이지 수)
  • 메서드:
    • get_info(): 책의 정보를 출력
    • read(): "{제목}을(를) 읽고 있습니다." 출력

3개의 책 객체를 생성 후, 각 책의 정보를 출력하고, read() 메서드를 호출하세요.

예시 출력

=== 책 정보 ===
제목: 파이썬 기초
저자: 김코딩
페이지: 350쪽

파이썬 기초을(를) 읽고 있습니다.

=== 책 정보 ===
제목: 자료구조
저자: 이알고
페이지: 420쪽

자료구조을(를) 읽고 있습니다.

=== 책 정보 ===
제목: 웹 개발
저자: 박웹개
페이지: 280쪽

웹 개발을(를) 읽고 있습니다.

내가 작성한 코드문

# 클래스 정의와 객체 생성 및 활용 코드를 작성하세요.
class Book:
    def __init__(self, name, author, page):
        self.name = name
        self.author = author
        self.page = page

    def get_info(self):
        print("=== 책 정보 ===")
        print(f"제목: {self.name}")
        print(f"저자: {self.author}")
        print(f"페이지: {self.page}")

    def read(self):
        print(f"{self.name}을(를) 읽고 있습니다.")

book1 = Book("웹 개발", "박웹개", 280)
book2 = Book("파이썬의 기초", "김코딩", 350)
book3 = Book("자료구조", "이알고", 420)
book1.get_info()
book1.read()
book2.get_info()
book2.read()
book3.get_info()
book3.read()

클래스 정의 (2) 은행 계좌(BankAccount) 클래스

은행 계좌를 표현하는 BankAccount 클래스를 작성하세요.

  • 속성: owner(소유자), balance(잔액)
  • 메서드:
    • deposit(amount): 입금 (잔액 증가)
    • withdraw(amount): 출금 (잔액 감소, 잔액 부족 시 메시지 출력)
    • get_balance(): 현재 잔액 출력

2개의 계좌 객체를 생성하고, 입출금을 수행하세요.

예시 출력

[김철수] 50000원이 입금되었습니다.
[김철수] 30000원이 출금되었습니다.
[김철수] 현재 잔액: 120000원

[이영희] 50000원이 출금되었습니다.
[이영희] 100000원이 입금되었습니다.
[이영희] 현재 잔액: 250000원

내가 작성한 코드문

class BankAccount:
    def __init__(self, owner, balance):
        self.owner = owner
        self.balance = balance

    def deposit(self, amount):
        self.balance += amount
        print(f"[{self.owner}] {amount}원이 입금되었습니다.")
        
    def withdraw(self, amount):
        if amount > self.balance:
            print(f"[{self.owner}] 잔액이 부족합니다. (현재 잔액: {self.balance}원)")
        else:
            self.balance -= amount
            print(f"[{self.owner}] {amount}원이 출금되었습니다.")
    
    def get_balance(self):
        print(f"현재 잔액: {self.balance}")

bank1 = BankAccount("김철수", 100000)
bank2 = BankAccount("이영희", 200000)

bank1.deposit(50000)
bank1.withdraw(30000)
bank1.get_balance()

bank2.deposit(50000)
bank2.withdraw(100000)
bank2.get_balance()

클래스 정의 (3) 학생(Student) 클래스

학생을 표현하는 Student 클래스를 작성하세요.

  • 속성: name(이름), student_id(학번), scores(점수 리스트 - 국어, 수학, 영어)
  • 메서드:
    • calculate_average(): 평균 점수를 계산하여 반환
    • print_info(): 이름, 학번, 평균 점수 출력
    • is_pass(): 평균이 60점 이상이면 "합격", 미만이면 "불합격" 출력

3명의 학생 객체를 생성하고, 각 학생의 정보(print_info)와 합격 여부(is_pass)를 출력하세요.

예시 출력

=== 학생 정보 ===
이름: 김철수
학번: 2024001
평균: 87.66666666666667점
판정: 합격

=== 학생 정보 ===
이름: 이영희
학번: 2024002
평균: 92.0점
판정: 합격

=== 학생 정보 ===
이름: 박민수
학번: 2024003
평균: 55.0점
판정: 불합격

내가 작성한 코드문

class Student:
    def __init__(self, name, student_id, scores):
        self.name = name
        self.student_id = student_id
        self.scores = scores
    
    def calculate_average(self):
        return sum(self.scores) / len(self.scores)

    def print_info(self):
        print(f"이름: {self.name}") 
        print(f"학번: {self.student_id}") 
        print(f"평균: {self.calculate_average()}점")
        
    def is_pass(self):
        if self.calculate_average() >= 60:
            print("합격")
        else:
            print("불합격")    

student1 = Student("김철수", 12, [85, 90, 88])    
student2 = Student("이영희", 13, [92, 95, 89])    
student3 = Student("박민수", 45, [55, 48, 62]) 

student1.print_info()
student1.is_pass()

student2.print_info()
student2.is_pass()

student3.print_info()
student3.is_pass()

트러블 슈팅
객체 초기화시에 리스트 형태로 점수 안줌
하나의 정수로만 줌.

그리고 평균 구하는 메서드를 계속 활용하는것도 팁이다.

마지막으로 캡슐화 진행

profile
A Normal Programmer

0개의 댓글