2/9 Coding Test Preperation

김태준·2023년 2월 9일
0

Coding Test - Programmers

목록 보기
12/29

문제 풀이

숫자 카드 나누기

from math import gcd

def solution(arrayA, arrayB):
    a = arrayA[0]
    b = arrayB[0]
    for i in arrayA:    
        a = gcd(a, i)
    for i in arrayB:
        b = gcd(b, i)
    
    for i in arrayB:
        if i % a == 0:
            a = 0
            break
    for i in arrayA:
        if i % b == 0:
            b = 0
            break
    return max(a, b)
    return answer

< 풀이 과정 >
두 배열의 최대공약수를 구한 이후 각 배열의 최대공약수가 상대 리스트 내 값 중 하나라도 나눌 수 있다면 0을 리턴해주기 위해 값을 0으로 처리하고 break 조건 걸어주기
양쪽 모두 결과를 진행하기 위해 for문으로 양 배열을 순회한 후 나눌 수 있는 값이 있다면 0처리해주는 것이 핵심!

혼자 놀기의 달인

def solution(cards):
    answer = []
    for i in range(len(cards)):
        group = []
        while cards[i] not in group:
            group.append(cards[i])
            i = cards[i] - 1
        if sorted(group) not in answer:
            answer.append(sorted(group))
        else:
            answer.append([])
    answer.sort(key = lambda x: len(x))
    return len(answer[-2]) * len(answer[-1])

< 풀이 과정 >
문제가 길어보이지만, 실제로 이해만 한다면 구현은 크게 어렵지 않은 문제.
1. cards 리스트 내 for문으로 모든 인덱스를 순회하는데, 0번 인덱스부터 선택하여 0번 인덱스에 존재하는 cards 리스트값을 다음 인덱스로 선택하며 그룹을 형성해준다.
2. 그룹은 똑같은 숫자가 더 이상 안들어갈때까지 반복해준다.
3. 정답 리스트에 정렬한 그룹이 없으면 추가해준다. (정렬을 안하는 순간 순서가 바뀌어도 입력되는 경우가 있으므로)
4. 정렬한 그룹이 있다면, 이는 그룹 형성이 이미 된 것을 의미하므로 빈 리스트를 추가해준다. 원래 continue를 적용하여 제출하였으나 2번 테케에서 런타임에러가 뜨는 걸 보니 전부 빈 리스트인 듯 합니다.
5. 이후 answer 2중 리스트를 크기 순으로 오름차순 정렬하여 젤 뒤에 있는 리스트 2개의 길이를 곱하여 결과 리턴한다.

profile
To be a DataScientist

0개의 댓글