WeniVooks

검색

위니브 월드(선생님용)

여기는 은행인가 생선가게인가

1. 챕터의 목표

비교 연산: 비교 연산을 할 수 있습니다.

내장 함수: 내장 함수의 종류를 알고 활용할 수 있습니다.

리스트: 리스트의 구조를 알고 활용할 수 있습니다.

2. 스토리

라이캣은 병원을 짓는 것도 좋지만 돈을 버는 것만이 캣네생선의 목표가 될 수 없다고 생각했어요. 라이캣은 기업의 목표가 모두가 함께 가치 생산을 해내고, 무엇보다 직원들의 행복이 목적이라 생각했습니다.

밤늦게까지, 주말까지 일하면서 그런 행복감을 느낄 수 있다고 생각하지 않았습니다. 그렇기에 더욱 많은 여유를 확보하기 위해 노력했어요.

이를 위해 생산성의 향상이 필요했습니다. 어떻게 하면 생산성을 높일 수 있을까요? 더 적은 시간에 더 많이 생산하고 보다 많이 휴식을 확보할 수 있을까요?

"시스템이다냥! 시스템을 바꾸면서 함께 성장해야 한다냥!”

전체 시스템을 다 바꾸기에는 회사의 규모가 너무 커졌기 때문에 작은 부분부터 바꿔가기로 했습니다.

가장 먼저 물고기가 가장 덜 팔리는 요일은 쉬도록 하고, 방문이 많은 요일에는 이벤트를 열게 하여 더 많은 수익금을 얻을 수 있게 하였어요.

라이캣을 도와 (주)캣네생선의 시스템을 구축하세요!

2.1 임무

각 칸은 월, 화, 수, 목, 금요일에 판매된 물고기 금액을 나타냅니다. 다만 금요일은 아직 물고기를 판매하지 못해 물고기로만 남아있습니다. 골드 바는 10만 노드, fish-3는 3000노드입니다.

  1. 요일별 판매된 골드 바를 모두 줍고 리스트에 담으세요.
  2. 월, 화, 수, 목, 금에서 가장 적게 판매된 금액은 얼마인가요? min를 사용하여 가장 적은 금액을 터미널에 출력하세요.
  3. 가장 많이 판매된 요일은 어떤 요일인지 터미널에 출력하세요. 이날에는 이벤트를 엽니다.
  4. 가장 적게 판매된 요일은 어떤 요일인지 터미널에 출력하세요. 이날은 쉽니다.
2.1.1 출력
가장 적은 금액: 30000
이벤트 요일: 월요일
쉬는 날: 금요일
가장 적은 금액: 30000
이벤트 요일: 월요일
쉬는 날: 금요일
2.2 사용 코드

아래 코드들을 조합하여 문제를 풀어주세요.

mission_start()
mission_end()
l.append()
l.index()
max(1, 2, 3)
min(1, 2, 3)
sum([1, 2, 3])
move()
repeat(2, move)
pick()
print('hello world!')
item()
item()['fish-3']
item()['goldbar']
10 + 10
10 * 3
10 > 20
30 < 10
10 >= 5
3 == 3
3 != 5
5 <= 10
 
mission_start()
mission_end()
l.append()
l.index()
max(1, 2, 3)
min(1, 2, 3)
sum([1, 2, 3])
move()
repeat(2, move)
pick()
print('hello world!')
item()
item()['fish-3']
item()['goldbar']
10 + 10
10 * 3
10 > 20
30 < 10
10 >= 5
3 == 3
3 != 5
5 <= 10
 

3. 문제 풀이

3.1 리스트 자료형(list)

리스트는 순서가 있으면서도 수정이 가능한 자료형입니다.

l = [10, 20, 30]
l[0] = 1000
l # [1000, 20, 30]
l = [10, 20, 30]
l[0] = 1000
l # [1000, 20, 30]

문자열 자료형처럼 인덱스를 사용하여 인덱싱할 수 있으며 인덱싱한 것에 다른 값을 넣는 것도 가능합니다. 위 예제에서는 0번째를 인덱싱하여 1000을 삽입하고 있어요. 기존에 있던 10이 리스트에서 없어지고 1000이 들어가게 됩니다.

리스트는 순서가 있기 때문에 아래와 같이 슬라이싱도 가능합니다.

l = [10, 20, 30, 40, 50, 60, 70]
l[2:4] # [30, 40]
l = [10, 20, 30, 40, 50, 60, 70]
l[2:4] # [30, 40]

우선 typedir함수를 사용하여 어떤 메서드를 사용할 수 있는지 살펴보도록 하겠습니다.

l = [10, 20, 30]
print(type(l))
print(dir(l))
l = [10, 20, 30]
print(type(l))
print(dir(l))

아래는 출력 결과입니다.

<class 'list'>
['__add__', '__class__', '__class_getitem__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getstate__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
<class 'list'>
['__add__', '__class__', '__class_getitem__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getstate__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

자료형의 이름은 list(리스트)라는 것을 알 수 있습니다. 문자열 자료형처럼 매직 메서드와 일반 메서드가 있습니다. 자주 사용되는 메서드를 살펴보겠습니다.

  • append: 맨 뒤에 값을 추가합니다.
    l = [10, 20, 30, 40, 50]
    l.append(60) # [10, 20, 30, 40, 50, 60]
    l = [10, 20, 30, 40, 50]
    l.append(60) # [10, 20, 30, 40, 50, 60]
  • count: 원하는 값의 개수를 출력합니다. 문자열의 count와 동일하게 사용할 수 있습니다.
    l = [10, 20, 30, 40, 10]
    l.count(10) # 10의 개수가 2개, 2개를 출력합니다.
    l = [10, 20, 30, 40, 10]
    l.count(10) # 10의 개수가 2개, 2개를 출력합니다.
  • index: 원하는 값의 위치를 출력합니다. 문자열의 index와 동일하게 사용할 수 있습니다.
    l = [10, 20, 30, 40, 50]
    l.index(30) # 30의 위치는 2번째, 2를 출력합니다.
    l = [10, 20, 30, 40, 50]
    l.index(30) # 30의 위치는 2번째, 2를 출력합니다.
  • insert: 원하는 위치에 원하는 값을 삽입합니다.
    l = [10, 20, 30, 40, 50]
    l.insert(2, 1000) # 2번째 위치에 1000을 삽입합니다.
    l # [10, 20, 1000, 30, 40, 50]
    l = [10, 20, 30, 40, 50]
    l.insert(2, 1000) # 2번째 위치에 1000을 삽입합니다.
    l # [10, 20, 1000, 30, 40, 50]
  • pop: 맨 뒤에 있는 값을 하나 꺼냅니다.
    l = [10, 20, 30, 40, 50]
    l.pop() # 50
    l # [10, 20, 30, 40]
    l = [10, 20, 30, 40, 50]
    l.pop() # 50
    l # [10, 20, 30, 40]
  • remove: 원하는 값을 삭제합니다.
    l = [10, 20, 30, 40, 50]
    l.remove(30) # 30 값을 삭제합니다.
    l # [10, 20, 40, 50]
    l = [10, 20, 30, 40, 50]
    l.remove(30) # 30 값을 삭제합니다.
    l # [10, 20, 40, 50]
  • reverse: 역순으로 만듭니다.
    l = [10, 20, 30, 40, 50]
    l.reverse()
    l # [50, 40, 30, 20, 10]
    l = [10, 20, 30, 40, 50]
    l.reverse()
    l # [50, 40, 30, 20, 10]
  • sort: 오름차순으로 정렬합니다.
    l = [20, 30, 10, 40, 50]
    l.sort()
    l # [10, 20, 30, 40, 50]
    l = [20, 30, 10, 40, 50]
    l.sort()
    l # [10, 20, 30, 40, 50]
3.2 내장함수

이번에는 내장 함수에 대해 알아보도록 하겠습니다. 내장 함수는 우리가 선언하지 않고도 사용했던 함수를 말합니다. 예를 들어 print, dir, type 등은 모두 내장 함수입니다. 아래 공식 홈페이지에서 내장 함수 목록을 볼 수 있습니다. google에서 python built-in functions라고 검색을 해도 됩니다. 살펴보는 것만으로도 도움이 많이 되니 꼭 한 번 방문해 보세요.

Built-in Functions

여기서 우리는 min, max, sum을 살펴볼 것입니다. 함수명 그대로 최솟값, 최댓값, 합을 출력하는 함수입니다.

l = [10, 20, 30, 40, 50]
print(min(l)) # 10
print(max(l)) # 50
print(sum(l)) # 150
l = [10, 20, 30, 40, 50]
print(min(l)) # 10
print(max(l)) # 50
print(sum(l)) # 150

3.3 문제풀이
Before After

판매금의 리스트와 요일 리스트를 만든 다음 움직이면서 주운 아이템을 판매금에 맨 마지막에 추가하고, 주운 아이템을 초기화하는 코드를 작성합니다.

mission_start()
 
판매금 = []
요일 = ['월', '화', '수', '목', '금', '토', '일']
 
repeat(2, pick)
판매금.append(item()['goldbar']*100000)
item()['goldbar'] = 0
 
move()
 
mission_end()
mission_start()
 
판매금 = []
요일 = ['월', '화', '수', '목', '금', '토', '일']
 
repeat(2, pick)
판매금.append(item()['goldbar']*100000)
item()['goldbar'] = 0
 
move()
 
mission_end()

가장 먼저 지금 발아래 있는 아이템 2개를 줍습니다. 그리고 판매금에는 주운 아이템의 개수와 주운 아이템의 값을 곱하여 총 얼마인지 계산하여 넣습니다. 이렇게 하는 이유는 주운 아이템의 종류가 모두 goldbar가 아니기 때문에 그렇습니다. 값으로 환산해서 넣어야 min, max, sum을 사용할 수 있습니다.

이 코드로 월, 화, 수, 목, 금에 판매 금액을 모두 알아냅니다.

mission_start()
 
판매금 = []
요일 = ['월', '화', '수', '목', '금', '토', '일']
 
repeat(2, pick)
판매금.append(item()['goldbar']*100000)
item()['goldbar'] = 0
move()
 
repeat(2, pick)
판매금.append(item()['goldbar']*100000)
item()['goldbar'] = 0
move()
 
repeat(5, pick)
판매금.append(item()['goldbar']*100000)
item()['goldbar'] = 0
move()
 
repeat(1, pick)
판매금.append(item()['goldbar']*100000)
item()['goldbar'] = 0
move()
 
repeat(15, pick)
판매금.append(item()['fish-3']*3000)
item()['fish-3'] = 0
 
mission_end()
mission_start()
 
판매금 = []
요일 = ['월', '화', '수', '목', '금', '토', '일']
 
repeat(2, pick)
판매금.append(item()['goldbar']*100000)
item()['goldbar'] = 0
move()
 
repeat(2, pick)
판매금.append(item()['goldbar']*100000)
item()['goldbar'] = 0
move()
 
repeat(5, pick)
판매금.append(item()['goldbar']*100000)
item()['goldbar'] = 0
move()
 
repeat(1, pick)
판매금.append(item()['goldbar']*100000)
item()['goldbar'] = 0
move()
 
repeat(15, pick)
판매금.append(item()['fish-3']*3000)
item()['fish-3'] = 0
 
mission_end()

이제 아래와 같이 판매금을 출력해 보세요.

판매금
판매금

이 판매금에서 가장 적은 금액은 아래와 같이 출력할 수 있습니다.

print(f'가장 적은 금액: {min(판매금)}')
print(f'가장 적은 금액: {min(판매금)}')

그리고 이벤트 요일과 쉬는 날은 단지 판매금 리스트만으로는 출력할 수 없고 요일 리스트를 활용해야 합니다.

print(f'이벤트 요일: {요일[판매금.index(max(판매금))]}')
print(f'쉬는 날: {요일[판매금.index(min(판매금))]}')
print(f'이벤트 요일: {요일[판매금.index(max(판매금))]}')
print(f'쉬는 날: {요일[판매금.index(min(판매금))]}')

위 예제는 판매금에서 index()로 가장 높은 값이 어느 위치에 있는지 찾은 다음, 해당 인덱스를 이용하여 요일 리스트에서 인덱싱하고 있습니다. 최종 출력은 요일 리스트에서 출력한다는 점을 기억해 주세요.

이 코드에서 직접적으로 사용되진 않았지만 이 챕터에서 비교 연산을 진행하고 가도록 하겠습니다. 비교 연산은 2개의 값을 비교하는 연산입니다. 결과값은 TrueFalse로 나타냅니다.

x = 10
y = 3
print(x > y) # x가 y보다 큰가? True
print(x >= y) # x가 y보다 크거나 같은가? True
print(x < y) # x가 y보다 작은가? False
print(x <= y) # x가 y보다 작거나 같은가? False
print(x == y) # x가 y와 같은가? False
print(x != y) # x가 y와 다른가? True
x = 10
y = 3
print(x > y) # x가 y보다 큰가? True
print(x >= y) # x가 y보다 크거나 같은가? True
print(x < y) # x가 y보다 작은가? False
print(x <= y) # x가 y보다 작거나 같은가? False
print(x == y) # x가 y와 같은가? False
print(x != y) # x가 y와 다른가? True

이렇게 True, False로 나타내어지는 값을 부울 값(Boolean)이라고 합니다.

x = True
print(type(x)) # <class 'bool'>
x = True
print(type(x)) # <class 'bool'>

이 문제에서는 아래와 같이 비교해 볼 수 있습니다.

판매금[0] > 판매금[1]
판매금[0] > 판매금[1]

4. 정답 코드

mission_start()
 
판매금 = []
요일 = ['월', '화', '수', '목', '금', '토', '일']
 
repeat(2, pick)
판매금.append(item()['goldbar']*100000)
item()['goldbar'] = 0
move()
 
repeat(2, pick)
판매금.append(item()['goldbar']*100000)
item()['goldbar'] = 0
move()
 
repeat(5, pick)
판매금.append(item()['goldbar']*100000)
item()['goldbar'] = 0
move()
 
repeat(1, pick)
판매금.append(item()['goldbar']*100000)
item()['goldbar'] = 0
move()
 
repeat(15, pick)
판매금.append(item()['fish-3']*3000)
item()['fish-3'] = 0
 
print(f'가장 적은 금액: {min(판매금)}')
print(f'이벤트 요일: {요일[판매금.index(max(판매금))]}')
print(f'쉬는 날: {요일[판매금.index(min(판매금))]}')
 
mission_end()
mission_start()
 
판매금 = []
요일 = ['월', '화', '수', '목', '금', '토', '일']
 
repeat(2, pick)
판매금.append(item()['goldbar']*100000)
item()['goldbar'] = 0
move()
 
repeat(2, pick)
판매금.append(item()['goldbar']*100000)
item()['goldbar'] = 0
move()
 
repeat(5, pick)
판매금.append(item()['goldbar']*100000)
item()['goldbar'] = 0
move()
 
repeat(1, pick)
판매금.append(item()['goldbar']*100000)
item()['goldbar'] = 0
move()
 
repeat(15, pick)
판매금.append(item()['fish-3']*3000)
item()['fish-3'] = 0
 
print(f'가장 적은 금액: {min(판매금)}')
print(f'이벤트 요일: {요일[판매금.index(max(판매금))]}')
print(f'쉬는 날: {요일[판매금.index(min(판매금))]}')
 
mission_end()
2.5 직원의 승진2.7 무료 밥차