[자료구조] Chpater02. 자료구조 문제풀이(리스트, 튜플, 딕셔너리)

황성미·2023년 7월 23일
0
post-thumbnail
post-custom-banner

✍🏻 21일 공부 이야기.

지금까지 배운 리스트, 튜플, 딕셔너리 문제 풀이를 공부했다!



리스트

다음은 공원 입장료이다. 1일 총 입장객이 100명이라고 할 때, 1일 전체 입장 요금을 구하는 프로그램을 완성해라. 단, 입장 고객의 나이는 난수를 이용해라.

영유아(0-7세) : 무료, 어린이(8-13세) : 200원, 청소년(14-19세) : 300원, 성인(20-64세) : 500원, 어르신(65세-) : 무료

import random

def wonformat(money):
  return format(money, ',')

visitors = []

#관람객들의 나이 
for n in range(100):
  visitors.append(random.randint(0,100))

group1 = 0
group2 = 0
group3 = 0
group4 = 0
group5 = 0

#관람객들의 나이를 그룹별로 카운트
for age in visitors:
  if age >= 0 and age <= 7:
    group1 += 1
  elif age >= 8 and age <= 13:
    group2 += 1
  elif age >= 14 and age <= 19:
    group3 += 1
  elif age >= 20 and age <= 64:
    group4 += 1
  else:
    group5 += 1

#카운트한 개수만큼 입장료 계산
group1Price = 0 * group1
group2Price = 200 * group2
group3Price = 300 * group3
group4Price = 500 * group4
group5Price = 0 * group5
totalPrice = group1Price + group2Price + group3Price + group4Price + group5Price

#출력
print('+++++++++++++++++++++++++++++')
print(f'영유아\t : {group1}명\t : {wonformat(group1Price)}원')
print(f'어린이\t : {group2}명\t : {wonformat(group2Price)}원')
print(f'청소년\t : {group3}명\t : {wonformat(group3Price)}원')
print(f'성인\t : {group4}명\t : {wonformat(group4Price)}원')
print(f'어르신\t : {group5}명\t : {wonformat(group5Price)}원')
print('+++++++++++++++++++++++++++++')
print(f'1일 요금 총 합계 : {wonformat(totalPrice)}')
print('+++++++++++++++++++++++++++++')

💻출력
+++++++++++++++++++++++++++++
영유아 : 4명 : 0원
어린이 : 10명 : 2,000원
청소년 : 2명 : 600원
성인 : 46명 : 23,000원
어르신 : 38명 : 0원
+++++++++++++++++++++++++++++
1일 요금 총 합계 : 25,600
+++++++++++++++++++++++++++++



튜플

tuple1 = (1,3,2,6,12,5,7,8), tuple2 = (0,5,2,9,8,6,17,3) 의 합집합과 교칩합을 출력하는 프로그램을 완성해라.
💡 튜플은 아이템 수정이 안되므로 리스트로 변환 후, 다시 튜플로 변환 시키자!
💡 리스트의 정렬 .sort()와 sorted()에는 차이가 있다.

tuple1 = (1,3,2,6,12,5,7,8) 
tuple2 = (0,5,2,9,8,6,17,3)

union = list(tuple1) #합집합
intersection = list() #교집합

for n in tuple2:
  if n not in union: #tuple1 안에 안 들어있으면
    union.append(n)  #추가해주고
  else: #이미 들어가있으면
    intersection.append(n) #그것은 교집합이다
    ##만약 tuple2에 (0,5,2,2,...)와 같이 공통된 원소가 있으면 
    ##위 코드는 2가 중복되서 들어간다.
    ##그것을 막아주려면, 아래와 같은 코드를 실행시키면 된다:)
    # if n not in intersection:
    #   intersection.append(n)

'''
앞서 리스트의 정렬 방법인 리스트이름.sort() 에 대해 소개했었다.
그래서 당연히 .sort()를 이용해 정렬을 했는데 
'NoneType' object is not iterable 에러가 발생했었다.
강의에서는 그냥 sorted()를 이용해 바로 출력을 해버려서..
이것저것 시도해본 결과, 
.sort() 와 sorted() 모두 사용 가능한 방법을 정리해두었다 :)
'''

##먼저, 정렬이 안된 합집힙과 교집합을 확인할 수 있다.
# print(union)
# print(intersection)

'''1. .sort()를 이용하는 방법이 왜 에러가 발생했는가? '''
## .sort()는 반환값 없이 원래 리스트를 정렬해주기 때문에
## 다음과 같은 코드를 실행하면
## 'NoneType' object is not iterable 과 같은 에러를 볼 수 있다.
# union = union.sort()
# intersection = intersection.sort()
# print(union)        #None이 출력됨
# print(intersection) #None이 출력됨

##물론 이 코드 또한 .sort()는 반환값이 없으므로 에러가 뜬다.
# union = tuple(union.sort())
# intersection = tuple(intersection.sort())

'''2. sorted()는 에러 없이 잘 되는가? '''
## sorted()는 정렬한 리스트를 반환해주므로
## 코드를 실행하면 에러 없이 정렬된 리스트들을 확인할 수 있다.
union = tuple(sorted(union))
intersection = tuple(sorted(intersection))

'''3. 그렇다면 .sort()는 못 쓰는 것인가? 아니다.'''
## .sort()도 사용할 수 있는데 다음과 같은 코드를 실행시키면 된다.
# union.sort()
# intersection.sort()
'''위 코드를 통해 원래 리스트를 먼저 정렬해준 후 출력하면 된다!'''
# union = tuple(union)
# intersection = tuple(intersection)

print(f'합집합 : {union}')
print(f'교집합 : {intersection}')

💻출력
합집합 : (0, 1, 2, 3, 5, 6, 7, 8, 9, 12, 17)
교집합 : (2, 3, 5, 6, 8)



딕셔너리

다음 문구를 공백으로 구분하여 리스트에 저장한 후, 인덱스와 단어를 이용해서 딕셔너리에 저장하는 프로그램을 완성해라.

💡 문자열을 잘라주는 split() 함수

article = '파이썬은 1991년에 발표된 인터프리터 방식의 프로그래밍 언어이다.'

##.split() : 공백을 구분자로 나누어 리스트를 생성함
##.split('구분자') : 구분자를 적어주면 구분자로 나눠
article_list = article.split()

article_dic = {}

for word in article_list:
  article_dic[article_list.index(word)] = word

#또는 아래와 같이 enumerate()를 이용할 수도 있다
# for idx , word in enumerate(article_list):
#   article_dic[idx] = word

print(article_dic)

💻출력
{0: '파이썬은', 1: '1991년에', 2: '발표된', 3: '인터프리터', 4: '방식의', 5: '프로그래밍', 6: '언어이다.'}

문자열들을 잘라서 감정 분석을 한다던가, 비속어들을 다른 언어로 바꾼다거나, 여러 딥러닝에도 사용하는 함수일 것 같아 정리해보았다.





백준

백준에서 가볍게 리스트, 튜플, 딕셔너리로 풀 수 있을만한 문제를 몇 개 풀어보았다.






오늘의 주저리

오늘은 리스트, 튜플, 딕셔너리 문제를 풀던 중 기억에 남는 문제들을 정리해보았다.

리스트에서는 정렬을 .sort() 로 배웠었는데 해당 함수로는 에러가 떴었었다. 강의에서는 바로 sorted()함수를 사용해서 무엇이 문제가 되는 것인지 몰랐는데, 둘의 차이점에 대해 공부해보니 어느정도 감을 잡게 되었다. 공부한 내용을 다시 정리하고, 이전에 올렸던 글도 수정했다. 예상하지 못했던 부분에서 에러가 뜨면 머리가 아파지는건 당연하지만 그만큼 또 배울점이 생기기도 한다. 그리고 이렇게 내가 몸소 부딪히며 찾아보고, 코드를 수정하는 것이 제일 기억에 오래 남는다.

빨리 끝날 것 같았던 오늘의 강의였는데, 생각보다 시간이 조금 흘렀었다. 내가 찾고자하는 정보를 발견할 때까지.. 구글링을 멈추지 않는 탓일지도 모르겠다ㅎㅎ...
그래도 문제를 푸는데에 호기심이 발동해, 오늘은 이전에 잠깐 스터디를 했었던 백준을 다시 들어가봤다. 그리고 자료구조에 관한 문제 몇 가지를 풀어보기도 했다. 백준과 같은 코딩 테스트를 풀 때면.. 문제의 알고리즘을 파악하는 것도 중요하지만, <어떤 알고리즘이 메모리도 적고 시간도 적게 돌아갈 수 있을까>도 중요했다.
그래서 입력을 받을 때 시간초과가 될 수 있는 input() 대신 sys.stdin.readline() 을 이용하기도 하고, 공백을 이용해 여러 개를 입력 받을줄도 알아야 하는 등 배워야할 것들이 많았다.

예전 파이썬을 막 배우기 시작했던 시절 백준 스터디를 했을 때에는 '이 방법을 많이 쓰니깐~ 나도 써야지!', '이걸 이용하라고 그랬었어' 라고 생각하며 사용했었지만, 지금은 <왜 그것을 사용해야하는지>, <그것보다 더 좋은 방법은 어떤 것이 있을지>와 같이 다양한 고민을 해보며 문제를 풀어보고 싶다.




몇가지 찾았던 사이트들 나중에 참고할 수도 있으니 올려둬야징~

✍🏻파이썬 입력 받기(sys.stdin.readline)

✍🏻파이썬으로 정수 입력 받기

profile
데이터 분석가(가 되고픈) 황성미입니다!
post-custom-banner

0개의 댓글