여기는 은행인가 생선가게인가
1. 챕터의 목표
비교 연산
: 비교 연산을 할 수 있습니다.
내장 함수
: 내장 함수의 종류를 알고 활용할 수 있습니다.
리스트
: 리스트의 구조를 알고 활용할 수 있습니다.
2. 스토리
라이캣은 병원을 짓는 것도 좋지만 돈을 버는 것만이 캣네생선
의 목표가 될 수 없다고 생각했어요. 라이캣은 기업의 목표가 모두가 함께 가치 생산을 해내고, 무엇보다 직원들의 행복이 목적이라 생각했습니다.
밤늦게까지, 주말까지 일하면서 그런 행복감을 느낄 수 있다고 생각하지 않았습니다. 그렇기에 더욱 많은 여유를 확보하기 위해 노력했어요.
이를 위해 생산성의 향상이 필요했습니다. 어떻게 하면 생산성을 높일 수 있을까요? 더 적은 시간에 더 많이 생산하고 보다 많이 휴식을 확보할 수 있을까요?
"시스템이다냥! 시스템을 바꾸면서 함께 성장해야 한다냥!”
전체 시스템을 다 바꾸기에는 회사의 규모가 너무 커졌기 때문에 작은 부분부터 바꿔가기로 했습니다.
가장 먼저 물고기가 가장 덜 팔리는 요일은 쉬도록 하고, 방문이 많은 요일에는 이벤트를 열게 하여 더 많은 수익금을 얻을 수 있게 하였어요.
라이캣을 도와 (주)캣네생선의 시스템을 구축하세요!
2.1 임무
각 칸은 월, 화, 수, 목, 금요일에 판매된 물고기 금액을 나타냅니다. 다만 금요일은 아직 물고기를 판매하지 못해 물고기로만 남아있습니다. 골드 바는 10만 노드, fish-3는 3000노드입니다.
- 요일별 판매된 골드 바를 모두 줍고 리스트에 담으세요.
- 월, 화, 수, 목, 금에서 가장 적게 판매된 금액은 얼마인가요? min를 사용하여 가장 적은 금액을 터미널에 출력하세요.
- 가장 많이 판매된 요일은 어떤 요일인지 터미널에 출력하세요. 이날에는 이벤트를 엽니다.
- 가장 적게 판매된 요일은 어떤 요일인지 터미널에 출력하세요. 이날은 쉽니다.
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]
우선 type
과 dir
함수를 사용하여 어떤 메서드를 사용할 수 있는지 살펴보도록 하겠습니다.
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
라고 검색을 해도 됩니다. 살펴보는 것만으로도 도움이 많이 되니 꼭 한 번 방문해 보세요.
여기서 우리는 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