99클럽 코테 스터디 11일차 TIL - 카드 뭉치

Wonjun·2024년 7월 25일
0

알고리즘 & 문제풀이

목록 보기
48/50
post-thumbnail

카드 뭉치

https://school.programmers.co.kr/learn/courses/30/lessons/159994?language=python3

  • 제출 코드
def solution(cards1, cards2, goal):
    answer = ''
    cards1_len = len(cards1)
    cards2_len = len(cards2)
    goal_len = len(goal)
    cards1_idx = 0
    cards2_idx = 0
    cnt = 0
    for i in range(goal_len):
        if cards1_len > cards1_idx and goal[i] == cards1[cards1_idx]:
            cards1_idx += 1
            cnt += 1
        if cards2_len > cards2_idx and goal[i] == cards2[cards2_idx]:
            cards2_idx += 1
            cnt += 1
    if cnt < goal_len:
        answer = 'No'
    else:
        answer = "Yes"
            
    return answer
  • goal 리스트를 1회 순회함으로써 해결할 수 있다.
  • goal 문자열을 완성할 수 있는지 확인하기 위해 cnt 변수를 두었다.
  • cards1과 cards2의 인덱스를 따로 만들어서 0부터 증가하며 goal과 같은 문자열이 있는지 확인한다.
  • goal과 같은 문자열이 있으면 그 다음 인덱스의 문자열을 비교하면 되므로 카드의 인덱스를 1 증가시켜준다. 일치함을 판단할 척도인 cnt도 1 증가시킨다.
  • goal의 길이보다 cnt가 작으면 goal을 만들 수 없다는 의미이므로 No를 반환하고 이외에는 Yes를 반환한다.
  • cards_len을 만들어서 cards_idx와 따로 비교해준 이유는 두 배열의 길이가 다르기 때문에 발생할 수 있는 index out of range 에러를 방지하기 위함이다.

회고

  • 인덱스와 길이 비교를 통해 문제를 해결했지만, 큐를 사용해서 앞에서부터 pop 하며 goal 리스트가 비었을 때를 기준으로 Yes or No를 반환해도 될 것 같다. 다만 이도 마찬가지로 cards1, cards2 큐가 비었는지를 수시로 체크해야 된다.
  • goal_len, cards_len과 같이 따로 변수를 만들어서 len을 저장해 준 이유는 조금이라도 빠른 실행 속도를 위함이다.
    • len 함수가 for문 안에 들어가게 된다면, for문을 돌 때마다 len 계산을 하게 될 것이다.
    • 그게 차이가 얼마나 되겠어?? 티끌 모아 태산이라고, 배열의 크기가 100억이 넘어간다고 생각해보자. len() 계산을 100억번 하게 된다면 실제로 시간초과가 날 수도 있을 것이다.
    • 변수를 선언하여 len()을 미리 계산하고 변수를 통해 참조하므로써 약간의 최적화를 이룰 수 있다.
profile
알고리즘

0개의 댓글