첫 번째 시도

  • IndexError: list index out of range 직면
  • cards1 또는 cards2가 빈 리스트인 경우에 cards1[0]처럼 참조하면 오류가 나기 때문임
  • cards1[0]과 같이 참조하기 전에 길이를 먼저 체크하도록 변경해야 함
def solution(cards1, cards2, goal):
    answer = "Yes"
    while(len(cards1) or len(cards2)):
        if len(goal) == 0:
            break
        elif cards1[0] == goal[0] and len(cards1) > 0:
            cards1.pop(0)
            goal.pop(0)
        elif cards2[0] == goal[0] and len(cards2) > 0:
            cards2.pop(0)
            goal.pop(0)
        else:
            answer = "No"
            break
            
    return answer

 

 

정답

  • 리스트를 참조하기 전에 길이를 먼저 체크하도록 변경
def solution(cards1, cards2, goal):
    answer = "Yes"
    while(len(cards1) or len(cards2)):
        if len(goal) == 0:
            break
        elif len(cards1) > 0 and cards1[0] == goal[0]:
            cards1.pop(0)
            goal.pop(0)
        elif len(cards2) > 0 and cards2[0] == goal[0]:
            cards2.pop(0)
            goal.pop(0)
        else:
            answer = "No"
            break
            
    return answer

 

'Algorithm' 카테고리의 다른 글

모의고사 / 프로그래머스  (0) 2025.02.28
과일장수 / 프로그래머스  (0) 2025.02.27
2016년 / 프로그래머스  (0) 2025.02.21
명예의 전당 (1) / 프로그래머스  (0) 2025.02.17
콜라 문제 / 프로그래머스  (0) 2025.02.16

 

정답

  • 시작하는 날을 기준으로 요일 배열을 나열
  • 경과일을 기준으로 요일을 적용해야 하므로 (배열은 0부터 시작하니까) 경과일에 -1을 빼줘야 함
def solution(a, b):
    # 2016년 각 월의 일 수
    month = [0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]  

    # 2016년 1월 1일은 금요일 (FRI)
    week = ["FRI", "SAT", "SUN", "MON", "TUE", "WED", "THU"]
    
    # 1월 1일은 금요일, 1월 1일을 입력했다면 1월 1일로부터 경과일은 0일임
    elapsed_date = sum(month[:a]) + b - 1
    
    return week[elapsed_date % 7]

 

정답

  • 프로그램 시작 초기 k일 까지는 명예의 전당에서 가장 작은 값을 ans에 추가
  • k일 이후에는 명예의 전당의 가장 작은 수보다 등록되는 점수가 더 크다면 가장 작은 수를 제외하고 새 점수를 명예의 전당에 등록한 후 명예의 전당 최솟값을 ans에 추가
def solution(k, score):
    best = score[:k]
    m = []
    ans = []
    new_score = score[k:]
    # 프로그램 시작 이후 초기 k일
    for i in best:
        m.append(i)
        m.sort(reverse=True) # 내림차순 정렬
        ans.append(m[-1])

    # k일 이후
    for i in new_score:
        best.sort(reverse=True) # 내림차순 정렬 100.10,1 ...
        if best[-1] < i:
            best.pop()
            best.append(i)
            best.sort(reverse=True)
            ans.append(best[-1])
        else:
            ans.append(best[-1])
    
    return ans

 

첫번째 풀이

  • 나머지를 담는 dum 변수
  • 나머지와 n을 더했을 때 a보다 크다면 다시 콜라로 교환하고 반복문 종료
  • 나머지와 n을 더했을 때 a보다 크다면 다시 콜라로 교환한 후에 다시 반복문을 돌아야 하는 경우가 있을 수도 있으므로 틀림
def solution(a, b, n):
    ans = 0
    dum = 0

    while True:
        if n < a:
            if n + dum >= a:
                n = n + dum
                cola = n // a
                ans += cola * b
                break
            else:
                break
        cola = n // a
        dum = dum + (n % a)
        ans += cola * b
        n = n // a * b
    return ans

 

 

정답

  • 나머지를 담는 변수 제거
  • 이렇게 짜면 나머지를 포함해서 교환을 하고, 이어서 또 교환을 진행 할 수 있을 때 계속 진행할 수 있음
def solution(a, b, n):
    ans = 0
    while True:
        if n < a:
            break;
        ans += (n // a) * b
        n = (n // a) * b + (n % a) 
        
    return ans

 

정답

  • 리스트 역순으로 조회하는 법 : 조회할 리스트[::-1] (시작값, 끝값, 증가값)
  • 음식을 반으로 나눈 리스트를 생성해서 처음부터 끝까지 조회 후 0 입력
  • 0을 입력한 후에 반으로 나눈 리스트를 역순으로 조회
def solution(food):
    ans = ""
    half = []
    idx = 1

    for i in food[1:]:
        half.append(i//2)

    for i in half:
        for j in range(i):
            ans += str(idx)
        idx = idx + 1

    ans += str(0)

    idx = idx - 1
    for i in half[::-1]:
        for j in range(i):
            ans += str(idx)
        idx = idx - 1
        
    return ans

 

정답

  • 딕셔너리를 이용해서 알파벳과 해당 위치를 기록
  • 만약 동일한 알파벳이 이미 딕셔너리에 있다면 현재 위치로 갱신
def solution(s):
    ans = []
    dic = {}
    idx = 0
    #문자열 처음부터 순환
    for i in s:
    #문자열이 딕셔너리에 없는 경우
        if i not in dic.keys():
            dic[i] = idx
            ans.append(-1)
            idx += 1
    #문자열이 딕셔너리에 있는 경우
        else:
            ans.append(idx - dic[i])
            dic[i] = idx
            idx += 1
    return ans

 

정답

  • 중복을 제거하기 위해서 set 사용
  • set은 순서가 없기 때문에 정렬을 할 수 없음
  • list를 set으로 변경하면 기존의 순서를 유지하지 않음!
  • 그렇기에 set으로 중복 값을 제거해 준 다음 -> 순서 보장이 안되서 오름차순 유지가 안됨 -> 다시 리스트로 변환 후 정렬
def solution(numbers):
    answer = []
    num = list(numbers)
    for i in range(0, len(num)):
        for j in range(i+1, len(num)):
            answer.append(num[i]+num[j])
    answer.sort()
    set_answer = set(answer)
    answer = list(set_answer)
    answer.sort()
    return answer

 

정답

  • 리스트의 얕은 복사 = 값 복사를 하는 방법
    • copy_list = list(origin_list)
    • copy_list = origin_list[:]
    • copy_list = origin_list.copy()
def solution(array, commands):
    answer = []
    for i in commands:
        copy_list = list(array)
        slice_list = copy_list[i[0]-1:i[1]]
        slice_list.sort()
        answer.append(slice_list[i[2]-1])
    return answer

+ Recent posts