자료구조_Tuple() 문제풀이

jaam._.mini·2023년 11월 19일
0

📒Python 기초 수학

목록 보기
39/46
post-custom-banner

그동안 열심히 학습한 Tuple() 예제를 풀어보자!



(1) 합, 평균


Q >
1,2,3학년 성적은 다음과 같다. 졸업할 때 4.0 이상의 학점을 받기 위해 4학년 1,2학기 최소 학점을 구해보자

  • 전체 리스트 조회 방법 : for A in 리스트문: for()을 이용하면 됨
scores = (3.7, 4.2), (2.9, 4.3), (4.1, 4.2)
total =0

for s1 in scores:
    for s2 in s1:
        total =+ s2

total = round(total, 1)
avg = round((total / 6), 1)
print(f'3학년 총학점 : {total}')
print(f'3학년 평균 : {avg}')


grade4TargetScore = round((4.0 * 8 - total), 1)
print(f'4학년 목표 총학점 : {grade4TargetScore}')

minScore = round((grade4TargetScore / 2),1)
print(f'4학년 한학기 최소학점: {minScore}')

scores = list(scores)
scores.append((minScore, minScore))

scores  = tuple(scores)
print(f'scores : {scores}')

3학년 총학점 : 4.2
3학년 평균 : 0.7
4학년 목표 총학점 : 27.8
4학년 한학기 최소학점: 13.9
scores : ((3.7, 4.2), (2.9, 4.3), (4.1, 4.2), (13.9, 13.9))




(2) 합집합, 교집합


Q >
2개의 튜플을 이용해서 합집합과 교집합을 출력해보자
단, 중복되지 않게

■ for() 이용

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

tempHap = list(tuple1)
tempGyo = list()

for n in tuple2: # 데이터 조회
    if n not in tempHap: # n이 tempHap(=tuple1)에 있는 숫자 1개씩 비교했을때 없다면
        tempHap.append(n) # 합집합에 추가
    else:
        tempGyo.append(n) # 있으면, 교집합 이니까 추가.

tempHap = tuple(sorted(tempHap)) # 오름차순으로 정렬
tempGyo = tuple(sorted(tempGyo))

print(f'합집합(중복 X)\t : {(tempHap)}')
print(f'교집합(중복 X)\t : {(tempGyo)}')

합집합(중복 X)	 : (0, 1, 2, 3, 5, 6, 7, 8, 9, 12, 17)
교집합(중복 X)	 : (2, 3, 5, 6, 8)

■ while() 이용

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

tempGyo = list()
tempHap = tuple1 + tuple2
tempHap = list(tempHap)

#중복된 데이터 제거 단계
idx = 0 #변수 설정
while True: # 반복해라

    if idx >= len(tempHap): # 길이보다 크거나 같으면 더이상 반복할 값이 없으므로
        break # 빠져나온다

    if tempHap.count(tempHap[idx]) >= 2: #인덱스 갯수가 2개 이상이라면 중복이므로
        tempGyo.append(tempHap[idx]) # 공통된 숫자(교집합) 추가
        tempHap.remove(tempHap[idx]) # 합집합에는 중복 숫자 제거
        continue

    idx += 1

print(f'tempHap : {tempHap}')
print(f'tempGyo : {tempGyo}')
print('-'*25)
print(f'tempHap : {tuple(sorted(tempHap))}')
print(f'tempGyo : {tuple(sorted(tempGyo))}')

tempHap : [1, 12, 7, 0, 5, 2, 9, 8, 6, 17, 3]
tempGyo : [3, 2, 6, 5, 8]
-------------------------
tempHap : (0, 1, 2, 3, 5, 6, 7, 8, 9, 12, 17)
tempGyo : (2, 3, 5, 6, 8)




(3) slice()


Q >
아이템을 슬라이싱해보자

numbers = (8.7,9.0,9.1,8.6,9.3,7.9,8.1,8.3)

print(f'인덱스 0~3 : {numbers[0:4]}') #3까지 구하고 싶다면 +1로 입력

print(f'인덱스 2~4 : {numbers[2:5]}')

print(f'인덱스 3~끝까지 : {numbers[3:]}')

print(f'인덱스 2 ~ -2 : {numbers[2:-1]}') #뒤에서 2번까지 구하고 싶다면 -1로 입력

print(f'0~끝까지, 3단계 씩 : {numbers[::3]}')

Q > 최소/최대

print(f'최소값 : {min(numbers)}')
print(f'최대값 : {max(numbers)}')

Q > 원하는 숫자의 idx 값

print(f'최소값 idx : {numbers.index(min(numbers))}')
print(f'8.6 idx : {numbers.index(8.6)}')




(4) 시험점수 별 학점 출력


Q >
점수 입력 후 각 점수별 학점 출력

korScore = int(input('국어 점수 입력 : '))
engScore = int(input('영어 점수 입력 : '))
matScore = int(input('수학 점수 입력 : '))
sciScore = int(input('과학 점수 입력 : '))
hisScore = int(input('국사 점수 입력 : '))

# 짝을 지을거라 Dictionary{} 이용
scores = (
    {'kor' : korScore},
    {'eng' : engScore},
    {'mat' : matScore},
    {'sci' : sciScore},
    {'his' : hisScore}
)

for item in scores:
    for key in item.keys():
        if item[key] >= 90:
            item[key] = 'A'
        elif item[key] >= 80:
            item[key] = 'B'
        elif item[key] >= 70:
            item[key] = 'C'
        elif item[key] >= 60:
            item[key] = 'D'
        else:
            item[key] = 'F'

print(scores)

국어 점수 입력 : 91
영어 점수 입력 : 81
수학 점수 입력 : 71
과학 점수 입력 : 61
국사 점수 입력 : 51
({'kor': 'A'}, {'eng': 'B'}, {'mat': 'C'}, {'sci': 'D'}, {'his': 'F'})




(5) while(), if()


Q >
튜플의 과이리 개수에 대해서 오름차순, 내림차순 정렬


# 튜플 선언
fruits = ({'수박':8}, {'포도':13}, {'참외':12}, {'사과':17}, {'자두':19}, {'자몽':15})

# 튜플은 변경이 안되니까, list()로 변경
fruits = list(fruits)

#자리바꿈을 위해서 idx를 알아야 함
cIdx = 0 #현재 인덱스
nIdx = 0 #다음 인덱스
eIdx = len(fruits)-1  #끝의 인덱스 (= 전체 길이 -1)

flag = True
while flag:
    # 인덱스를 이용해서 value 값을 뽑아내야 함
    curIdx = fruits[cIdx] # 현재 기준이 되는 인덱스
    nexIdx = fruits[nIdx] # 비교하게 되는 인덱스

    curDicCnt = list(curIdx.values())[0] # 해당 딕셔너리의 과일의 갯수(value값)
    nextDicCnt = list(nexIdx.values())[0] # 해당 딕셔너리의 과일의 갯수(value값)

    if nextDicCnt < curDicCnt : # 다음 value가 현재 value 보다 작다면
        # 오름차순이기 때문에 순서를 바꿔야 한다.
        # ex. 참외(nextDicCnt)를 현재 자리(cIdx)인 포도에 넣어야한다, .참외를 잘라서 (pop(nIdx))
        fruits.insert(cIdx, fruits.pop(nIdx))
        nIdx = cIdx + 1 # 반복을 초기화
        continue

    nIdx += 1
    if nIdx > eIdx: #다음수가 끝수 보다 크면
        cIdx += 1 #현재수는 다음수로 넘어와 +1자리에
        nIdx = cIdx + 1 #다음수는 현재수보다 항상 +1 크게 존재한다

        if cIdx == 5: # 5번까지 반복이 완료되면
            flag = False # 끝내라

# list -> tuple
print(tuple(fruits))

({'수박': 8}, {'참외': 12}, {'포도': 13}, {'자몽': 15}, {'사과': 17}, {'자두': 19})




(6) 합, 평균, 편차


Q >
학급별 학생수, 총인원, 평균, 편차

⭐dic.items( )
items( )메소드를 이용하여 {key:value}쌍을 튜플로 묶어 리스트와 비슷한 자료형으로 만들어서 리턴할 수 있다.

studentCnt = (
    {'cls01' : 18},
    {'cls02' : 21},
    {'cls03' : 20},
    {'cls04' : 19},
    {'cls05' : 22},
    {'cls06' : 20},
    {'cls07' : 23},
    {'cls08' : 17},
)

totalCnt = 0
minStdCnt = 0; minCls = '' #학생수, 학급수(문자니까 ''로 초기화)
maxStdCnt = 0; maxCls = ''
deviation = [] # 편차

for idx, dic in enumerate(studentCnt): # 인덱스, 딕셔너리 뽑을 수 있음
    for k, v in dic.items(): #dic에서 키, 밸류의 아이템들을 구해야 함
        totalCnt = totalCnt + v # 반복하면서 밸류(학생수)를 모두 더하면 전체 학생수가 됨

        if minStdCnt == 0 or minStdCnt > v:  #0으로 처음 시작하거나  학생수가 크다면
            minStdCnt = v  # 더 작은 밸류가 미니멈이 됨
            minCls = k  # 적은 학급은 밸류의 짝인 키가 됨

        if maxStdCnt < v: # 학생수보다 작다면
            maxStdCnt = v # 더 큰 밸류가 맥스가 됨
            maxCls = k # 많은 학급은 밸류의 짝인 키가 됨

print(f'전체 학생수 : {totalCnt}')

avgCnt = totalCnt / len(studentCnt)
print(f' 평균 학생수 : {avgCnt}')

print(f'학생수가 가장 적은 학급 : {minCls}({minStdCnt})')
print(f'학생수가 가장 많은 학급 : {maxCls}({maxStdCnt})')

#학급별 편차 구하기
for idx, dic in enumerate(studentCnt):
    for k, v in dic.items():
        deviation.append(v - avgCnt)

print(f'학급별 학생 편차 : {deviation}')

전체 학생수 : 160
 평균 학생수 : 20.0
학생수가 가장 적은 학급 : cls08(17)
학생수가 가장 많은 학급 : cls07(23)
학급별 학생 편차 : [-2.0, 1.0, 0.0, -1.0, 2.0, 0.0, 3.0, -3.0]

출처/참고 : 제로베이스 데이터 스쿨
profile
비전공자의 데이터 공부법
post-custom-banner

0개의 댓글