1. 모의고사
풀이 전략)
각각의 수포자들이 찍는 방식이 패턴이 정해져 있으므로 이 패턴을 하나의 배열로 만든 뒤 일정 수만큼 반복하면 된다.
풀이에 필요한 수학적 원리)
일정한 패턴을 가진 배열(List)의 길이 = n일 때, List[a] = List[a%n] // n만큼 반복되므로 나눴을 때 나머지들은 모두 같은 수를 갖는다.
def solution(answers):
# 수포자들의 답안 패턴이 존재함 : 배열로 구성
# 각각의 배열을 순회하면서 답안 배열과 같으면 점수 배열 +1
# 점수 배열 중 가장 높은 점수를 받은 인덱스만 출력(+1)
supo = [[1,2,3,4,5,],[2,1,2,3,2,4,2,5],[3,3,1,1,2,2,4,4,5,5]]
right = [0,0,0]
answer = []
for i in range(len(supo)):
for j in range(len(answers)):
n = len(supo[i])
if answers[j] == supo[i][j%n]:
right[i] += 1
for idx, score in enumerate(right):
if score == max(right):
answer.append(idx+1)
return answer
2. 소수 찾기
풀이 전략)
문자열의 각 요소를 순열로 구성하고, 소수를 판별하는 함수를 사용한다.
풀이에 필요한 수학적 원리)
각각의 조합을 만들되 순서에 따라 다른 값을 가지므로 순열 함수를 사용해야 한다.
from itertools import permutations
def is_prime_number(x):
if x<2 :
return False
for i in range(2,x):
if x % i == 0:
return False
return True
def solution(numbers):
# 문자열을 하나씩 쪼개서 새로운 배열에 저장
# 각각의 숫자로 조합하여 문자열 만들기(순열)
# 숫자에 조건을 부여하여 조합(소수 조건)
# 될 때마다 숫자 변수에 +1하여 숫자 변수 출력
answer = 0
num = []
for i in range(1,len(numbers)+1):
num.append(list(set(map(''.join, permutations(list(numbers),i)))))
per = list(set(map(int, set(sum(num, [])))))
for p in per:
if is_prime_number(p) == True :
answer += 1
return answer
3. 카펫
풀이 전략)
타일의 총 개수를 약수로 분리한 뒤, 가로 길이가 세로 길이보다 길거나 같다는 조건과
테두리 한 줄은 갈색이라는 조건을 사용하여 알맞은 약수를 추출한다.
풀이에 필요한 수학적 원리)
- 갈색과 노란색의 타일 개수 합이 격자의 곲과 같다.
- 노란색 개수 = (가로 길이-2)*(세로 길이-2)
def getMyDivisor(n,brown,yellow):
list = []
row = 0
col = 0
for i in range(2, n+1):
if n % i == 0 and (n // i) >= i:
row = n // i
col = i
if yellow == (row-2)*(col-2):
list.append(row)
list.append(col)
break
return list
def solution(brown, yellow):
total = brown + yellow
return getMyDivisor(total,brown,yellow)