자료구조, Linked List

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.


Linked List

자료구조, 알고리즘 문제 풀어보기(프린터 작업 스케줄링)

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.


문제 4: 프린터 작업 스케줄링

목표

프린터 작업들이 우선순위를 가지고 있을 때, 특정 작업이 언제 인쇄될지 구하세요.

def printer_queue(priorities, location):
    """
    priorities: 각 작업의 우선순위 리스트
    location: 확인하고 싶은 작업의 인덱스
    반환: 해당 작업이 몇 번째로 인쇄되는지 (1부터 시작)
    """
    # 여기에 코드를 작성하세요
    pass

# 테스트
print(printer_queue([2, 1, 3, 2], 2))  # 3번째 작업(우선순위 3)이 언제 인쇄되는지
print(printer_queue([1, 1, 9, 1, 1, 1], 0))  # 첫 번째 작업이 언제 인쇄되는지

def printer_queue(priorities, location):
    # (우선순위, 원래_인덱스) 형태로 큐 생성
    queue = [(p, i) for i, p in enumerate(priorities)]

    # 인쇄된 작업 수
    count = 0

    # 큐가 빌 때까지 반복
    while queue:
        # 현재 작업 가져오기
        current = queue.pop(0)

        # 현재 작업보다 우선순위가 높은 작업이 있는지 확인
        if any(current[0] < q[0] for q in queue):
            # 우선순위가 높은 작업이 있으면 현재 작업을 큐의 맨 뒤로 이동
            queue.append(current)
        else:
            # 우선순위가 가장 높으면 인쇄하고 카운트 증가
            count += 1

            # 현재 작업이 우리가 찾던 작업인지 확인
            if current[1] == location:
                return count

    # 이 부분은 실행되지 않아야 함 (큐에서 해당 작업을 반드시 찾아야 함)
    return -1

# 테스트
print(printer_queue([2, 1, 3, 2], 2))  # 1
print(printer_queue([1, 1, 9, 1, 1, 1], 0))  # 5

자료구조, 알고리즘 문제 풀어보기(고대 유물 감정하기)

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.



문제 3: 고대 유물 감정하기

테마/상황:

당신은 박물관의 유물 감정사입니다. 새로 발굴된 유물 목록이 딕셔너리 리스트 형태로 도착했습니다. 각 유물은 {‘이름’: ‘…’, ‘가치’: …, ‘국가’: ‘…’} 형태로 되어있습니다. 특정 국가의 유물만 골라내고, 그 가치의 평균을 계산해야 합니다.

미션:

유물 데이터(리스트)와 국가 이름(문자열)을 입력받아, 해당 국가의 유물들의 평균 가치를 계산하는 함수 evaluate_artifacts를 작성하세요.

규칙:

  • 주어진 국가의 유물이 하나도 없다면, 0을 반환해야 합니다.
  • 평균 가치는 소수점 이하는 버리고 정수로 반환합니다.

예시:

  • 입력:
artifacts = [
    {'이름': '청동검', '가치': 500, '국가': '한국'},
    {'이름': '파라오 마스크', '가치': 2500, '국가': '이집트'},
    {'이름': '직지심체요절', '가치': 3000, '국가': '한국'},
    {'이름': '로제타석', '가치': 2000, '국가': '이집트'},
    {'이름': '원반 던지는 사람', '가치': 1500, '국가': '그리스'}
]
country = '한국'
  • 출력: 1750
    • 한국 유물은 ‘청동검’(500)과 ‘직지심체요절’(3000)입니다.
    • 가치의 합은 3500이고, 개수는 2개입니다.
    • 평균은 3500 / 2 = 1750 입니다.

<1. 내가 푼 풀이>

def evaluate_artifacts(artifacts, country):
    country_value = []
    for artifact in artifacts:
        if artifact['국가'] == country:
            country_value.append(artifact['가치'])
            
    if country_value:
        return int(sum(country_value) / len(country_value))
    else:
        return 0


evaluate_artifacts(artifacts, '한국')

<2. 교육 내 답변>

def evl_art(artifacts, country):
    country_value = []

    for artifact in artifacts:
        if artifact['국가'] == country:
            country_value.append(artifact["가치"])

    #평균
    avg_cont = sum(country_value)/len(country_value)
    return int(avg_cont)

자료구조, 알고리즘 문제 풀어보기(중세 시대의 세금 계산기)

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.


문제 2: 중세 시대의 세금 계산기

테마/상황:

당신은 중세 왕국의 세금 징수관입니다. 왕국의 재정을 위해 각 영지민의 소득에 따라 정해진 세율로 세금을 계산해야 합니다. 세율은 소득 구간에 따라 달라집니다.

미션:

영지민의 소득(gold)을 입력받아 내야 할 세금을 계산하는 프로그램을 작성하세요.

세율 규칙:

  • 소득이 10골드 이하: 세금 없음
  • 소득이 10골드 초과, 50골드 이하: 소득의 10%
  • 소득이 50골드 초과, 100골드 이하: 소득의 20%
  • 소득이 100골드 초과: 소득의 30%
  • 세금은 정수로 계산하며, 소수점 이하는 버립니다.

예시:

  • 입력: 75
  • 출력: 15 (75 * 0.2 = 15)
  • 입력: 120
  • 출력: 36 (120 * 0.3 = 36)

def count_duty(gold):
    # gold = 영지민의 소득
    if gold <= 10:
        return "세금 안내도 됩니다"
    elif gold > 10 and gold <= 50:
        return f"너의 세금: {int(gold * 0.1)}"
    elif gold > 50 and gold <= 100:
        return f"너의 세금: {int(gold * 0.2)}"
    elif gold > 100:
        return f"너의 세금: {int(gold * 0.3)}"

# count_duty(75)
count_duty(120)

자료구조, 알고리즘 문제 풀어보기(우주선 긴급 암호 해독)

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.


문제 1: 우주선 긴급 암호 해독

테마/상황:

당신은 우주 탐사선 ‘노바-1’의 통신 장교입니다. 그런데 외계 신호의 공격으로 인해 동료들과의 통신 암호가 뒤죽박죽이 되어버렸습니다! 암호를 원래대로 복구하여 긴급 메시지를 해독해야 합니다. 암호는 단어의 순서가 거꾸로 뒤집혔고, 특정 글자가 다른 글자로 바뀌었습니다.

미션:

주어진 암호 문장을 해독하는 함수 decode_message를 작성하세요.

해독 규칙:

  1. 문장을 단어 단위로 분리한 후, 단어의 순서를 거꾸로 뒤집습니다.
  2. 각 단어에서 ‘!’는 ‘a’로, ‘@’는 ‘e’로, ‘#’는 ‘i’로, ‘$’는 ‘o’로, ‘%’는 ‘u’로 바꾸세요.
  3. 해독된 단어들을 다시 하나의 문장으로 합쳐 반환합니다.

예시:

  • 입력: "w@lc$m@! t$ pyth$n #s h@ll$!"
  • 출력: "hello is python to welcome"

<1. 내가 푼 풀이>

def decode_message(sentence):
    for i in sentence:
        if i == '@':
            sentence = sentence.replace('@', 'e')
        elif i == '#':
            sentence = sentence.replace('#', 'i')
        elif i == '$':
            sentence = sentence.replace('$', 'o')
        elif i == '%':
            sentence = sentence.replace('%', 'u')

    # sentence를 ,구분자로 나누고 []배열안에 넣기
    sentence = sentence.split()  
    # 역순으로 넣은 후 배열에서 스트링으로
    return ' '.join(sentence[::-1])  

decode_message("w@lc$m@! t$ pyth$n #s h@ll$!")

<2. 교육 내 답변>

def decode_message(encoded_str):
     # 1. 암호를 단어 단위로 분리합니다.
    words = encoded_str.split(' ')
    # 2. 단어의 순서를 거꾸로 뒤집습니다.
    words.reverse()

    decoded_words = []
    print(decoded_words)
    for word in words:
        # 3. 각 단어의 특수문자를 알파벳으로 바꿉니다.(메서드 체이닝 활용)
        temp_word = word.replace('@', 'e').replace('#', 'i').replace('$', 'o').replace('%', 'u')
        decoded_words.append(temp_word)

    # 4. 해독된 단어들을 다시 하나의 문장으로 합칩니다.
    return " ".join(decoded_words)

 # 예시 실행
encoded_message = "w@lc$m@! t$ pyth$n #s h@ll$!"
decoded_message = decode_message(encoded_message)
print(f"암호: {encoded_message}")
print(f"해독: {decoded_message}")