세용용용용 2023. 9. 29. 17:20

코딩테스트 연습 - 숫자 카드 나누기 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

나의 첫번쨰 코드(공약수를 비교해주며 풀었다)

def yasu(num, lenth):
    answer = []
    for i in range(1, lenth+1):
        if num%i == 0:
            answer.append(i)
           
    return answer

def solution(arrayA, arrayB):
    answer = 0
    lenth = min(arrayA)

    A_yasu = {}
    for i in arrayA:
        for j in yasu(i,lenth):
            if j not in A_yasu:
                A_yasu[j] = 1
            else:
                A_yasu[j] += 1
   

    lenth = min(arrayB)
    B_yasu = {}
    for i in arrayB:
        for j in yasu(i,lenth):
            if j not in B_yasu:
                B_yasu[j] = 1
            else:
                B_yasu[j] += 1
   
    A_same_yasu = []
    for i in A_yasu.items():
        if i[1] == len(arrayA):
            A_same_yasu.append(i[0])

    B_same_yasu = []
    for i in B_yasu.items():
        if i[1] == len(arrayB):
            B_same_yasu.append(i[0])

    for i in A_same_yasu:
        if i not in B_yasu:
            answer = max(i, answer)
    for i in B_same_yasu:
        if i not in A_yasu:
            answer = max(i, answer)
    #print(answer)
    #print(A_same_yasu)
    #print(B_same_yasu)
    #print(A_yasu)
    #print(B_yasu)
   
    return answer
solution(   [10, 17], [5,20])

이런 이런

 

 

수정된 코드

# 약수 구하는 함수
def yasu(num):
    answer = []
    for i in range(1, int(num**(1/2))+1):
        if num%i == 0:
            answer.append(i)
            if i**2 != num:
                answer.append(num//i)
    return answer[1:]


def solution(arrayA, arrayB):
    answer = 0
    # 젤 작은 수의 약수를 구함
    a_yasu = yasu(min(arrayA))
    b_yasu = yasu(min(arrayB))
    #print(a_yasu)
    #print(b_yasu)

    # 공약수를 뽑아 낸다
    gcp_list = []
    for i in a_yasu:
        check = 0
        for j in arrayA:
            if check == 1:
                break
            if j%i != 0:
                check = 1
        if check == 0:
            gcp_list.append(i)

    # 반대편 리스트와 나누어서 나누어 떨어지지 않으면
    # answer를 조건에 따라 변경
    for i in gcp_list:
        check = 0
        for j in arrayB:
            if check == 1:
                break
            if j%i == 0:
                check = 1
        if check == 0:
            answer = max(answer, i)

   
    # 위의 경우 반대 케이스로 한번 더 돌려주기
    gcp_list1 = []
    for i in b_yasu:
        check = 0
        for j in arrayB:
            if check == 1:
                break
            if j%i != 0:
                check = 1
        if check == 0:
            gcp_list1.append(i)

    for i in gcp_list1:
        check = 0
        for j in arrayA:
            if check == 1:
                break
            if j%i == 0:
                check = 1
        if check == 0:
            answer = max(answer, i)

    #print(gcp_list1)

    #print(answer)
    return answer
solution([14, 35, 119], [18, 30, 102])