브루트 포스
장점 - 모든 경우의 수를 확인하기에 정답률이 100%에 가깝다.
단점 - 모든 경우의 수를 확인하기에 시간복잡도가 별로다.
1. 최소 직사각형
접근방법
1.
모든 크기의 명함을 담을 수 있는 것중 가장 작은 지갑을 만들어야 한다.
2.
모든 숫자들을 두 가지 담을 배열을 만든다
a.
high : 크기가 상대적으로 큰 숫자들을 담은 배열
b.
low : 크기가 상대적으로 작은 숫자들을 담은 배열
3.
high 배열에서 가장 큰 값 * low배열 에서 가장 큰 값을 곱한 값이 원하는 값이다.
def solution(sizes):
high = []
low = []
for size in sizes:
if size[0] > size[1]:
high.append(size[0])
low.append(size[1])
else:
high.append(size[1])
low.append(size[0])
return max(high) * max(low)
Python
복사
2. 모의고사
접근방법
1.
3명의 수포자들이 찍은 규칙을 배열에 담는다.
2.
3명의 수포자들의 순서대로 몇개를 맞추었는지에 대한 score 배열을 만든다
3.
answer에 있는 답과 수포자들이 찍은 답을 비교한다
a.
enumerate : 배열의 인덱스와 값을 동시에 꺼낼 때 사용 ([1,3,2,4,2])
b. 수포자가 찍은 번호는 규칙적이여서 배열에 담아놨다. 하지만, 시험지 문제 수가 학생들의 배열의 길이를 넘어갈 수 있다. 그래서 problem%len(one)을 통해 x번째 문제가 학생의 배열의 길이를 넘더라도 나머지값을 활용하여 같은 값을 반복확인하도록 한다.
c. score의 세 학생의 정답 수를 추가한다.
4.
score배열에서 최고점을 맞은 사람(들)의 (인덱스+1) answer 배열에 넣는다.
a.
정답자가 두 명 이상일 수도 있어서 배열을 만들었다.
def solution(answers):
score = [0,0,0]
one = [1,2,3,4,5]
two = [2,1,2,3,2,4,2,5]
three = [3,3,1,1,2,2,4,4,5,5]
for problem, answer in enumerate(answers):
# print(problem, answer)
if answer == one[problem%len(one)]:
score[0] += 1
if answer == two[problem%len(two)]:
score[1] += 1
if answer == three[problem%len(three)]:
score[2] += 1
# print(score[0], score[1], score[2])
answer = []
for i in range(len(score)):
if score[i] == max(score):
answer.append(i+1)
return answer
Python
복사
3. 소수찾기
사용한 라이브러리
순열(permutations)
1.
중복을 허용하지 않음
2.
순서를 고려해 경우의 수를 나열함( list로 리턴한다)
3.
permutations(사용할 객체, n) —> 사용할 객체에서 n개씩 뽑은 경우의수를 튜플로 생성
접근방법
1.
소수찾는 함수를 생성하기
2.
순열을 통해 각 숫자들의 합쳐질 경우의 수를 모두 구하기
from itertools import permutations
def solution(numbers):
answer = []
for i in range(1, len(numbers)+1):
# 순열을 통해 list 생성
lst = list(permutations(numbers, i))
# print(lst)
#lst안에 값들은 튜플로 되어 있음 [('1',), ('7',)] / [('1', '7'), ('7', '1')]
for j in range(len(lst)):
# 문자열로 합쳐준 후에 int로 변환
num = int("".join(lst[j]))
# print(f"lst[j]={lst[j]})
if is_prime(num):
answer.append(num)
# 중복제거
answer = list(set(answer))
return len(answer)
# 소수판별
def is_prime(n):
if n == 0 or n == 1:
return False
# 시간복잡도를 조금이라도 올리기 위해 n**0.5 까지만 반복
for i in range(2, int(n**0.5)+1):
if n % i == 0:
return False
return True
Python
복사