개인 실습: 2022-07-15~2022-07-17

정지호·2022년 7월 16일
0

개인 실습 진행

목록 보기
3/41

  1. 부트스트랩 실습 : file:///C:/javascript/index.html

.

  1. 소수 만들기 문제
    :주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다. 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때, nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때 소수가 되는 경우의 개수를 return 하도록 solution 함수를 완성해주세요.
    : nums에 들어있는 숫자의 개수는 3개 이상 50개 이하입니다.
    : nums의 각 원소는 1 이상 1,000 이하의 자연수이며, 중복된 숫자가 들어있지 않습니다.
from itertools import *

def solution(nums):        
    answer = 0
    sum = 0
    A = list(combinations(nums,3)) #조합 사용. 그리고 리스트화. 각 조합이 리스트의 요소가 됨.
    for i in range(len(A)):
        for k in range(3):
            sum = sum + A[i][k]
        for n in range(2,sum): 
            if (sum % n) == 0:
                break              #소수가 아닌게 판명되면 반복문 빠져나와 다른 경우의 수 탐색
            elif (sum % n) !=0:
                if(n==sum-1): #소수임이 판명되면,
                    answer = answer + 1 # 경우의 수가 하나 증가한다.
                    break
                continue #소수임을 판별하려면 1과 본인을 제외한 모든 수로 나누어 보아야 하므로 끝날 때 까지 진행
        sum = 0
        
    return answer
  • 우선 일일히 모든 경우의 수를 쓸 순 없다고 생각하여 itertools 에서 *를 import 해왔다.
    이를 통해 순열과 조합을 쓸 수 있고, 나는 여기서 조합을 썼다. 그리고 이중 for문을 통해, 각 조합에 포함된 세 수들을 모두 더하고, 이 합이 소수가 아닌지를 판별했다. 소수가 아니면 소수 판별 반복문에서 탈출시켰고, 소수임을 확인하기 위해서는 2부터 본인-1 까지 나누어 봐야 했으므로 이는 continue로 계속 진행시켰다. 본인-1의 수로도 나누어 떨어지지 않는다면, 그떄가 소수이므로 이 경우에는 경우의 수를 1 추가 시키고 break를 걸었다. 새로운 조합을 시도하기 전에는 sum을 초기화 시켰다.

.

  1. 폰켓몬 문제
    :총 N 마리의 폰켓몬 중에서 N/2마리를 가져감.
    폰켓몬은 종류에 따라 번호를 붙여 구분. 따라서 같은 종류의 폰켓몬은 같은 번호를 가지고 있다. 예를 들어 총 4마리의 폰켓몬이 있고, 각 폰켓몬의 종류 번호가 [3번, 1번, 2번, 3번]이라면 이는 3번 폰켓몬 두 마리, 1번 폰켓몬 한 마리, 2번 폰켓몬 한 마리가 있음을 나타낸다.
    이때, 당신은 최대한 다양한 종류의 폰켓몬을 가지길 원하기 때문에, 최대한 많은 종류의 폰켓몬을 포함해서 N/2마리를 선택하려 한다.
    N마리 폰켓몬의 종류 번호가 담긴 배열 nums가 매개변수로 주어질 때, N/2마리의 폰켓몬을 선택하는 방법 중, 가장 많은 종류의 폰켓몬을 선택하는 방법을 찾아, 그때의 폰켓몬 종류 번호의 개수를 return 하도록 solution 함수를 완성해라.
def solution(nums):
    answer = 0
    A = []
    
    for i in nums:
        if i not in A:
            A.append(i)
    
    if len(A) <= len(nums)/2:
        answer = len(A)  # 전체에서 절반을 가져 갈 수 있다 하더라도 종류가 한정됨.
        return answer
    else:
        answer = len(nums)/2 # 종류가 전체의 절반이 넘더라도 가져갈 수 있는 수는 결국 전체의 절반임
        return answer
  • 생각해보니 굉장히 간단한 문제였다. 우선 nums에서 중복된 번호를 제외한, 그러니까 포켓몬 번호가 각 하나씩만 있는 리스트를 만든다.
    만약 그 리스트에 있는 폰켓몬 수가 전체 폰켓몬 수의 절반보다 작거나 같다면, 가져갈 수 있는 폰켓몬 최대 종류의 수는 만든 리스트에 있는 폰켓몬 수가 될 수 밖에 없다.
    만약 그 리스트에 있는 폰켓몬 수가 전체 폰켓몬 수의 절반보다 크다면, 가져갈 수 있는 폰켓몬 최대 종류의 수는 전체 폰켓몬 수의 절반만 될 수 있다.

.

  1. 예상 대진표 문제
    :△△ 게임대회가 개최되었습니다. 이 대회는 N명이 참가하고, 토너먼트 형식으로 진행됩니다. N명의 참가자는 각각 1부터 N번을 차례대로 배정받습니다. 그리고, 1번↔2번, 3번↔4번, ... , N-1번↔N번의 참가자끼리 게임을 진행합니다. 각 게임에서 이긴 사람은 다음 라운드에 진출할 수 있습니다. 이때, 다음 라운드에 진출할 참가자의 번호는 다시 1번부터 N/2번을 차례대로 배정받습니다. 만약 1번↔2번 끼리 겨루는 게임에서 2번이 승리했다면 다음 라운드에서 1번을 부여받고, 3번↔4번에서 겨루는 게임에서 3번이 승리했다면 다음 라운드에서 2번을 부여받게 됩니다. 게임은 최종 한 명이 남을 때까지 진행됩니다.

    이때, 처음 라운드에서 A번을 가진 참가자는 경쟁자로 생각하는 B번 참가자와 몇 번째 라운드에서 만나는지 궁금해졌습니다. 게임 참가자 수 N, 참가자 번호 A, 경쟁자 번호 B가 함수 solution의 매개변수로 주어질 때, 처음 라운드에서 A번을 가진 참가자는 경쟁자로 생각하는 B번 참가자와 몇 번째 라운드에서 만나는지 return 하는 solution 함수를 완성해 주세요. 단, A번 참가자와 B번 참가자는 서로 붙게 되기 전까지 항상 이긴다고 가정합니다.

    N : 2^1 이상 2^20 이하인 자연수 (2의 지수 승으로 주어지므로 부전승은 발생하지 않습니다.)
    A, B : N 이하인 자연수 (단, A ≠ B 입니다.)

def solution(n,a,b):
    answer = 0
    
    while n >= 2:
        
        if (b%2 == 0)&(a == b-1) | (b%2 == 1)&(a == b+1): # 서로 만났을 때
            answer = answer +1
            return answer
        elif n == 2: # 특수 경우
            answer = answer +1
            return answer
        else: # 서로 아직은 만나지 않을 때
            answer = answer + 1
            n=n/2
            a = a//2 + a%2
            b = b//2 + b%2
  • 이 문제는 조원의 도움을 받았다. 초기에는 N을 2로 나누어 가고 a와 b가 분리될 경우, 그때의 경우의 수를 각각 고려해가자고 했는데 너무 복잡하고 한계가 있었다. 하지만 조원이 제시한 방법은 훨씬 쉬웠다.
    n이 2인 경우는 특수한 경우, 즉 1라운드가 답이 된다.
    서로 만날 때가 되었다는 것은 a,b가 1차이로 붙어있다는 것이다. 그래서 b가 홀수일때 차가 1인 경우 or b가 짝수일때 차가 1인 경우 일 때, 그때 붙게 된다.
    평소에 만나지 않을 때는 n을 2로 나누어 주고, a와 b도 '2로 나눈 몫+2로 나눈 나머지' 최신화 시켜준다.

.

  1. 피보나치 수열
# 피보나치 수열 재귀함수 방식

def Fibo(n):
    if n==0:
        return 0
    elif n==1:
        return 1
    else:
        return Fibo(n-1) + Fibo(n-2)

Fibo(4)

.

# 피보나치 수열 iterative 방식(while) 

def fibo():
    a, b = 0, 1
    while True:
        a, b = b, a + b
        yield a
        
f = fibo()
next(f)

.

# 피보나치 수열 iterative 방식(for)

def fibo(n):
    
    a = 0
    b = 1
    if n <0:
        return -1
    elif n == 0: 
        return 0
    elif n == 1:
        return 1
    else:
        for i in range(1, n):
            a, b = b, b + a
    
    return b
    
fibo(10)
profile
정지호

0개의 댓글