[012] 자료구조 문제풀이 / 자료구조 with python

이연희·2023년 8월 20일

자료구조 이론이 끝나고 이틀에 걸쳐서 연습문제를 풀었다.
기본적인 함수야 배워서 어떻게 할 수 있겠다 싶겠는데, 반복문을 자유자재로 사용하는 게 많이 아쉽다. 솔직히 미흡하다.
강사님 코드를 따라치면서 어떻게 이렇게 간결하게 나오지?
저번 주말에 했던 감탄을 오늘 다시 하다니ㅠㅠㅠㅠㅠㅠㅠ

Q1. 4개의 숫자 중 서로 다른 숫자 2개를 선택해서 만들 수 있는 모든 경우의 수 출력하는 프로그램 만들기

→ 풀이

numbers = [4, 6, 7, 9]
result = []
result2 = []

for number1 in numbers:
    for number2 in numbers:
        if result not in numbers:
            result.append([number1,number2])
print(f'result: {result}')

for num1, num2 in result:
    if num1 != num2:
        result2.append([num1,num2])

print(f'result2: {result2}')

리스트 변수를 처음에 result 하나만 만들었는데 처음 for문 안에서는 같은 숫자를 배제하는 과정을 넣지 못했다.
결국에는 result2에 리스트를 하나 더 할당해서 다른 숫자들의 조합을 넣는 반복문을 한번 더 실행해야만 했다.
코드가 너무 길어졌다...

→ 해답

# 해답1
numbers = [4,6,7,9]
result = []

for n1 in numbers:
    for n2 in numbers:
        if n1 == n2:
            continue

        result.append([n1,n2])

print(f'result: {result}')
print(f'length of result: {len(result)}')

# 해답2
import math
pernutation = math.factorial(len(numbers)) / math.factorial(len(numbers) - 2)
print(f'pernutation: {int(pernutation)}')

for문에 대한 압박감으로 간단하게 math모듈 이용해서 공식으로 대입해서 풀 수 있다는 사실도 간과했다.
강사님이 가볍게 짚고 넘어가실 때 아차싶었다.

나는 같은 숫자 조합을 빼느라고 경우의 수도 못 구하고 말았다. 사실 아직 continue를 for문에서 잘 사용하지를 못한다.

.
.
.
.
.

Q2. 튜플의 과일 개수에 대해서 오름차순 및 내림차순으로 정렬하기.

튜플의 아이템을 수정하기 못 한다는 생각에 사로잡혀서, 튜플 안에있는 value를 따로 빼서 정렬한다음 다시 딕셔너리인 채로 튜플을 집어넣으려고 하고 별짓을 다했다.
당연히 엉망진창이었고, 심지어는 어쨌든 제대로 답도 구하지 못했다.

→ 해답

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

currentIdx = 0; nextIdx = 1;
lastIndex = len(fruits) -1

flag = True
while flag:
    currentDic = fruits[currentIdx]
    nextDic = fruits[nextIdx]

    curDicCnt = list(currentDic.values())[0]
    nextDicCnt = list(nextDic.values())[0]

    if nextDicCnt < curDicCnt:
        fruits.insert(currentIdx, fruits.pop(nextIdx)) 
        nextIdx = currentIdx + 1
        continue

    nextIdx += 1
    if nextIdx > lastIndex:
        currentIdx += 1
        nextIdx = currentIdx + 1

        if currentIdx == 5:
            flag = False

print(f'오름차순 정렬: {tuple(fruits)}')

반복문을 이용해서 현재 인덱스의 값과 다음 인덱스의 값을 비교해서, 값이 더 작으면 잘라내서 앞쪽 인덱스에 insert하는 코드이다. 내림차순은 첫번째 if문에서 현재과일 개수보다 다음 과일 개수가 클 때, 둘의 순서를 바꾸면 자연스럽게 재정렬할 수 있다.

.
.
.

가장 아쉬운 코드랑 가장 정답을 구하지 못한 문제를 가져왔는데, 이것 말고도 여러 문제를 풀면서 앞서 배운 enumberate()함수를 이용하는 것도 미흡하고, while문을 너무 써먹지 못 하는 점도 아쉽다. 공부 열심히 하자...

profile
안녕하세요, 데이터 공부를 하고 있습니다.

0개의 댓글