티스토리 뷰
1. 문제 선정
객체 지향 프로그래밍을 잘 사용하지 않는 문제 해결 상황에서 어떤 문제를 해결할 수 있을지 생각해 보았다. 최근에 뮤지컬 리타에서 재미있는 장면을 클립으로 딴 부분을 인상 깊게 봤었는데, 이 장면을 조금 응용해 문제 상황으로 만들면 재미있을 것 같았다.
2. 문제 설계
6명이서 인생을 건 도박을 하고 있다. 경찰이 오지 않기를 기대하면서 이들은 영혼을 다한 묵찌빠를 무슨 리그전으로 하고 있다. “나는 대학시절 묵찌빠를 전공했단 사아실 네놈을 이겨 눈물 콧물 싹 다 빼주마” “나는 묵찌빠로 유학까지 다녀왔단 사아실 네놈을 이겨 가문의 이름 높이리” 수많은 공방이 오간 후 최종적으로 누구의 눈물 콧물이 싹 다 빠졌는지, 누구의 가문 이름이 높아졌는지를 알아보자. 도박은 이긴 사람이 진 사람에게 돈을 지급하는 형식이고, 성 정체성이 자유로운 요즘 묵찌빠를 하던 중 갑작스럽게 성 정체성이 바뀔 수 있다.
입력
각 줄에 사람의 이름, 가진 돈, 성별, 나이가 입력된다. 그 다음 줄에 돈이 오간 횟수가 입력되고, 그 다음 줄부터 “serj -> daron 5000000” 같은 형식으로 돈이 오간 대상과 오간 돈이 입력된다. 이후 특정 인물의 성 정체성이 바뀐 경우 바뀐 사람의 수가 입력되고, 그 다음 줄부터 이름이 입력된다.
출력
최종적으로 가장 돈이 적은 사람의 이름, 돈, 성별, 나이와 가장 돈이 많은 사람의 이름, 가진 돈, 성별, 나이를 출력한다.
예제 입력
serj 5000000 male 56
daron 1000000 male 48
shavo 2000000 male 50
john 2500000 male 51
will 500000 male 29
amy 700000 female 42
5
serj -> daron 5000
amy -> john 200000
shavo -> serj 100
will -> serj 500000
serj -> will 1
1
daron
예제 출력
최고의 플레이: serj 5495099 male 56
졌잘싸: will 1 male 29
3. 개념 설명
객체지향
컴퓨터 프로그램을 여러 독립적인 부품들의 조합, 즉 객체들의 유기적인 협력과 결합으로 파악하는 것이다.
장점: 프로그램을 보다 유연하고 변경이 용이하게 만들 수 있다. 코드의 변경을 최소화하고 유지보수하는 데 유리하다. 반복적인 코드를 최소화하고, 코드를 간결하게 표현할 수 있다. 보안성이 증가한다. 클래스라는 개념은 언어에 정의되지 않은 새로운 데이터 형식을 프로그래머가 임의로 정할 수 있도록 해 준다.
단점: 객체를 설계할 때부터 하는 추상화에 의해 난이도가 어려워진다. 구조를 잘 추상화하기 위해서는 관련 지식이 뛰어나야 한다. 캡슐화와 격리 구조에 의해 어쩔 수 없이 함수 호출이나 포인터 연산이 추가로 발생하는데, 여기서 절차지향 프로그래밍에 비해서는 시간이 오래 걸린다. 이런 특성 때문인지 ps 문제풀이에서는 거의 사용되지 않고, 일반적으로는 게임 개발이나 프로그램 개발에 주로 사용된다.
객체 지향의 4가지 특징으로 추상화, 상속, 다형성, 캡슐화가 있다. 객체는 모든 대상을 말한다. 객체 지향 프로그래밍에선 각 객체를 추상화시켜 속성과 기능으로 분류하고, 이를 변수와 함수로 정의한다.
객체 지향 프로그래밍의 특징 중 추상화는 객체의 공통적 속성과 기능을 추출하여 정의하는 것이다.
상속은 기존의 클래스를 재활용하여 새로운 클래스를 작성하는 것을 말한다. 상위 클래스의 속성과 기능들을 하위 클래스에서 그대로 받아 사용하거나 오버라이딩으로 선택적으로 재정의해 사용할 수 있다.
다형성은 어떤 객체의 속성이나 기능이 그 맥락에 따라 다른 역할을 수행할 수 있는 객체 지향의 특성을 의미한다. 예를 들어 메서드 오버라이딩과 메소드 오버로딩이 있다. 여기서 같은 이름의 메소드가 상황에 따라 다른 역할을 수행하는 경우도 있다.
마지막으로 캡슐화는 서로 연관된 속성과 기능을 하나의 캡슐로 만들어 데이터를 외부로부터 보호하는 것을 의미한다. 이를 정보 은닉이라고 하는데, 프로그램의 세부적인 구현을 외부로 드러나지 않게 특정 모듈 내로 감출 수 있다.
객체지향은 많은 언어에서 제공하는데, 예를 들어 파이썬의 클래스, 자바 그 자체, C++, Objective-C 등에서 사용할 수 있다.
파이썬에서 객체지향은 클래스로 구현할 수 있다. 클래스를 선언할 때는
class a:
pass
와 같이 선언하고, 여기 안에 def __init__(self, a, b, c,....)으로 속성을 추가하거나, 함수를 선언해 메소드를 생성할 수 있다. 클래스의 메소드 안에서만 변경할 수 있는 비공개 속성은 self.속성값 대신 self.__속성값으로 표현한다. 비공개 속성을 메소드 밖에서 변경하려고 하면 AttributeError가 발생한다.
4. 문제 풀이 전략
먼저 도박을 하는 사람의 정보를 생성하는 gambler 클래스를 생성한다. 여기에 속성으로 사람들의 이름, 가진 돈, 성별, 나이를 가진다. 입력된 6명의 도박사의 정보를 변수에 저장하였다. 그 후 사람들 사이에 돈이 오가는 것을 코드로 구현하고, 성별이 바뀐 경우를 코드로 구현하고, 마지막으로 가장 돈이 많은 사람과 적은 사람을 찾아 출력하도록 하였다.
5. 해결 과정과 시행착오
class gambler:
def __init__(self, name, money, gender, age):
self.name = name
self.money = money
self.gender = gender
self.age = age
def trans(self):
if self.gender == "male":
self.gender = "female"
else:
self.gender = "male"
def lose_money(self, amount):
self.money -= amount
def add_money(self, amount):
self.money += amount
사람의 정보를 저장하는 클래스이다. 각 속성이 이름, 돈, 성별, 나이를 나타낸다. trans 메소드는 성별을 바꾸고, lose_money와 add_money 메소드는 각각 돈을 차감하고 추가한다.
a = []
for i in range(6):
a.append(input().split())
gambler_1 = gambler(a[0][0], int(a[0][1]), a[0][2],int(a[0][3]))
gambler_2 = gambler(a[1][0], int(a[1][1]), a[1][2],int(a[1][3]))
gambler_3 = gambler(a[2][0], int(a[2][1]), a[2][2],int(a[2][3]))
gambler_4 = gambler(a[3][0], int(a[3][1]), a[3][2],int(a[3][3]))
gambler_5 = gambler(a[4][0], int(a[4][1]), a[4][2],int(a[4][3]))
gambler_6 = gambler(a[5][0], int(a[5][1]), a[5][2],int(a[5][3]))
gamblers = [gambler_1,gambler_2,gambler_3,gambler_4,gambler_5,gambler_6]
각 사람의 정보를 입력받은 후, 이를 각각 클래스로 나타낸다. 1번째 인덱스와 3번째 인덱스는 각각 돈과 나이로 정수이므로 정수형으로 저장한다. 이후 이들을 리스트로 묶어 변수로 저장한다.
i = int(input())
for j in range(i):
money_give = input().split()
giver_name = money_give[0]
for person in gamblers:
if person.name == giver_name:
giver = person
reciever_name = money_give[2]
for person in gamblers:
if person.name == reciever_name:
reciever = person
giver.lose_money(int(money_give[-1]))
reciever.add_money(int(money_give[-1]))
돈이 이동하는 횟수를 변수에 저장하고, 이 횟수만큼 반복하여 돈을 이동시키고, 사람마다 속성을 변화시킨다.
i = int(input())
if i > 0:
for j in range(i):
transer = input()
for person in gamblers:
if person.name == transer:
person.trans()
다시 성별이 바뀐 횟수를 입력받고, 해당하는 인물의 성격을 바꾼다.
moneys = []
for person in gamblers:
moneys.append(person.money)
max_money = max(moneys)
min_money = min(moneys)
for person in gamblers:
if person.money == max_money:
print("최고의 플레이:",person.name, str(person.money), person.gender, str(person.age))
elif person.money == min_money:
print("졌잘싸:",person.name, str(person.money), person.gender, str(person.age))
마지막으로 가장 돈이 많은 사람의 정보와 가장 돈이 없는 사람의 정보를 출력한다.
예제 입력을 입력하면
위 사진처럼 알맞은 값이 출력된다. 다른 값을 입력해도 알맞은 값이 출력되는 것을 알 수 있다.
객체 지향만 잘 이해하고 있다면 간단히 풀 수 있는 문제로 따로 오류를 고치는 데 많은 시간이 걸리진 않았다.
6. 느낀 점
객체지향 프로그래밍이 어떤 상황에서 사용되는지를 깊게 이해할 수 있었고, 거기에 흥미를 느꼈다. 기회가 된다면 자바를 공부해 보고 싶어졌고, 정보를 자신이 원하는 형태로 저장하기에 유용한 방법인 것 같았다.
이 문제에서는 클래스에서 상속이나 다중 상속을 활용하지 않았지만, 더 많고 다양한 객체가 사용되는 코드에서는 충분히 사용되니 더 많은 경험을 쌓는 것이 좋을 것 같다. 객체 지향 프로그래밍을 어려움 없이 할 수 있도록 알맞은 문제 상황을 제시하는 것에 어려움이 있었다.
'코딩' 카테고리의 다른 글
[정보융합탐구 과제] 파이썬을 이용한 끝말잇기 제작(7월) (0) | 2024.07.10 |
---|---|
[AP프로그래밍 7월 과제] 문제 설계 및 프로그래밍 (0) | 2024.06.19 |
[Python] 백준 2065번 "나룻배" (0) | 2024.05.27 |
[Python] 백준 1106번 "호텔" (0) | 2024.03.16 |
[Python] 백준 1655 풀이 (0) | 2024.03.15 |
- Total
- Today
- Yesterday
- 디오
- 린킨파크
- 데이브그롤
- 헤비메탈
- 락밴드
- 밴드정보
- 록
- 정보
- 하드록
- 앨리스인체인스
- 슬립낫
- 프로그래밍
- JSON
- 메탈밴드
- 하드락
- 파이썬
- 파리올림픽 개막식
- 기타
- 락
- 헤미메탈
- 뉴메탈
- 앨범
- 메탈
- 스토너락
- 밴드
- 댄치그
- 코딩
- 노엘내한
- 메탈리카
- 세르지탄키안
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |