AI 부트캠프 - 8일차

Cookie Baking·2024년 10월 11일

AI 부트 캠프 TIL

목록 보기
8/42

알고리즘 풀이

문자열 내 마음대로 정렬하기 (출처 : 프로그래머스)

🧚
문자열의 접근할 특정 인덱스의 글자를 기준으로
정렬된 문자열의 배열을 출력하는 문제이다.
즉, 특정 인덱스의 글자와 함께 문자열은 같이 움직여야 한다.
단, 조건은 특정 인덱스의 글자가 겹치는 경우가 존재하는데 그 경우에는 문자열의 정렬 기준에 따른다는 것이다.

First Attempt
처음에는 딕셔너리로 접근했다.
단, key-value 값 설정에서 특정 인덱스의 글자가 겹치는 경우를 생각해야 하기 때문에
key에는 문자열을,
value에는 특정 인덱스의 글자를 두고

  • sort를 key와 value를 한번씩 해주고
  • 각각의 배열의 for문을 돌며 특정 인덱스의 글자인지를 확인한 후 answer 배열에 추가하고 추가된 문자열은 겹치지 않도록 삭제해주는 작업을 해주어야 했다.

찝찝해서 다른 사람의 풀이는 어떤가 살펴보았다.

그 중에서도 인덱스 글자를 머리글처럼 붙여서 굳이 딕셔너리를 사용하지 않고 시간 복잡도를 줄이고 코드도 훨씬 간단해지는 풀이를 발견했다.

로직또한 간단했다.

  • 머리글처럼 인덱스 글자를 부여하고
  • 인덱스 글자 + 문자열 자체를 정렬한다
  • 인덱스 글자를 뗀다

📌

# 배열 풀이
def solution(strings, n):
    
    answer = []
    sorted_solo = []
    
    for string in strings:
        sorted_solo.append(string[n])
        
    sorted_solo = sorted(sorted_solo)
    sorted_string = sorted(strings)
    
    # print(sorted_solo)
    for sorted_solo in sorted_solo:
        for one in sorted_string:
            if one[n] == sorted_solo:
                answer.append(one)
                sorted_string.remove(one)
                break
                
	return answer
# 딕셔너리 풀이
def solution(strings, n):
    alpha_dict = {}
    for string in strings:
        alpha_dict[string] = string[n]

    sorted_values = sorted(alpha_dict.values())
    sorted_keys = sorted(alpha_dict.keys())
    
    for value in sorted_values:
        for key in sorted_keys:
            if value == alpha_dict[key]:
                answer.append(key)
                sorted_keys.remove(key)
                break
                
                
        
    return answer
# Better Solution
def solution(strings, n):
    
    answer = []
    
    for string in strings:
        answer.append(string[n] + string)
        
    answer.sort()
    
    for i in range(len(answer)):
        answer[i] = answer[i][1:]
        
    return answer

붕대감기 (출처 : 프로그래머스)

🧚
문제의 길이가 꽤나 길어 어제 푼 카카오 인턴 문제와 비슷하게 해석하는데 꽤나 오래 걸렸다.
책을 읽어야 하나

무튼

조건을 정리해보겠다.


회복 로직

  • bandage 배열로부터 시전시간, 초당 회복량, 추가 회복량을 받게 되는데
    -> bandage[0], 시전 시간 = 기술이 시전되기까지 연속적으로 회복이 필요한 시간을 의미한다.
    -> bandage[1], 초당 회복량 = 공격을 받지 않는다면 +1되는 회복이다.
    -> bandage[2], 추가 회복량 = 시전 시간이 된다면 추가로 회복되는 회복량을 의미한다.
    - 제한 사항: 최대 체력인 (health)을 넘기는 것은 불가하다.

공격 받는 로직

  • attacks 배열로부터 [공격시간, 피해량]을 입력받게 되는데
    -> 공격을 당하면 회복이 불가하다.
    -> 공격을 당하면 연속 성공 시간이 0으로 초기화가 된다.
    -> 공격이 끝나면 바로 회복 로직이 시작되어야 한다.
    • 제한 사항 : 최소 목숨인 0이하로 떨어지게 된다면 -1을 리턴해야 한다.

구현 로직

  • 공격 입력을 딕셔너리로 받아 입출력을 자유로이 하고자 했다.
  • 반복문을 공격 받는 배열이 아닌 전체 타임으로 가져갔다. (예시처럼)
  • 로직을 나열해보면 제한사항만 유의한다면 전부 조건문으로 같은 depth에서 표현 가능한 부분이었다.
  • 주의해야 할 점은 체력을 더해야 하는 부분에는 항시 최대 체력을 넘기는 지 여부를 확인했어야 하며
  • 연속 회복 conunt(stck 변수)는 마지막에 +1 을 해줘 다음 순번에 반영되게 했어야 했다.

  • 제한사항을 염두해주지 않고 체크를 해주지 않아서 계속해서 테스트 통과를 못했었다.
  • 맥락과 조건 확인이 최우선임을 잊지 말아야겠다.
  • 코드를 갈아 엎는데 두려움이 없어야겠다.

📌

def solution(bandage, health, attacks):
    answer = []
    max_health = health
    
    health_time = bandage[0]
    sec_health = bandage[1]
    plus_health = bandage[2]
    
    attack_dict = {}
    for attack in attacks:
        attack_dict[attack[0]] = attack[1]
    
    
    l = attacks[-1][0]
    stck = 0
    is_attacked = False
    
    answer.append(health)
    
    for i in range(1, l+1):
        
        if i in attack_dict.keys():
            is_attacked = True
            if (health - attack_dict[i] <= 0):
                return -1
            health -= attack_dict[i]
            stck = 0
            
            
        else:
            is_attacked = True
            if health >= max_health:
                stck += 1
                continue
            elif (stck+1) >= health_time:
                
                if (health + (sec_health + plus_health) >= max_health):
                    health = max_health
                else:
                    health += (sec_health + plus_health)
                stck = 0
            else:
                if (health + sec_health >= max_health):
                    health = max_health
                else:
                    health += sec_health
                stck += 1
                    
    
    
    if health <= 0:
        return -1

    return health

마주했던 ERROR

Object of type set is not JSON serializable
: LIST 타입을 원하는 자리에 SET 상태의 컬렉션을 넣고자 할 때 나타나는 오류
-> 해결 : LIST로 SET 상태의 컬렉션을 다시 감싸야 한다.

0개의 댓글