Python 코딩테스트-완전탐색

Brute Force

<프로그래머스 고득점kit>

<모의고사>

def solution(answers):
    count_1=0	#1번학생의 점수
    count_2=0	#2번학생의 점수
    count_3=0	#3번학생의 점수
    #
    array_1=[1,2,3,4,5]	#1번학생의 패턴	
    array_2=[2,1,2,3,2,4,2,5]	#2번학생의 패턴
    array_3=[3,3,1,1,2,2,4,4,5,5]	#3번학생의 패턴
    #
    length_1=len(array_1)
    length_2=len(array_2)
    length_3=len(array_3)
    #
    idx_1=0		#1번학생의 정답과 비교할 인덱스
    idx_2=0		#2번학생의 정답과 비교할 인덱스
    idx_3=0		#3번학생의 정답과 비교할 인덱스
    #
    for v in answers:
        if(array_1[idx_1%length_1]==v):	#%length_1은 정답패턴끝까지갈때 처음부터 다시 반복을 위한 연산
            count_1+=1
        if(array_2[idx_2%length_2]==v):
            count_2+=1
        if(array_3[idx_3%length_3]==v):
            count_3+=1
        idx_1+=1
        idx_2+=1
        idx_3+=1
    result=[count_1,count_2,count_3]  #학생들의 점수결과리스트
    max_score=max(result)	#최고점수추출
    student_result=[]	
    for i,v in enumerate(result):
        if(max_score==v):
            student_result.append(i+1) 	#최고점수와 같다면 학생의 번호를 모두 추출
    student_result.sort()
    return student_result

<해설>

각학생의 정답패턴의 길이가 다르기때문에 문제를 순회시에 각자의 정답패턴을 처음부터 다시 반복하게할 인덱스들을 각각 다르게 설계 후 각 학생의 점수를 모으면 최고점만 뽑고 그것과 같은 학생들은 모두 추출

<소수찾기>

from itertools import permutations	#순열을 뽑기위한 라이브러리
def is_prime_number(x):	#소수판별 함수
  if(x==1 or x==0):
    return False
  for i in range(2, int(x/2)+1):
  	# x가 해당 수로 나누어떨어지면
    if x % i == 0:
    	return False
  return True
#
def solution(numbers):      
    list_string=list(numbers)  #permutations는 리스트형을 인자로가지기 때문에 변환    "011"=>['0', '1', '1']
    tuple_result=[]
    for i in range(len(numbers)):
      tuple_result+=list(permutations(list_string, i+1))
	#[('0',), ('1',), ('1',), ('0', '1'), ('0', '1'), ('1', '0'), ('1', '1'), ('1', '0'), ('1', '1'), ('0', '1', '1'), ('0', '1', '1'), ('1', '0', '1'), ('1', '1', '0'), ('1', '0', '1'), ('1', '1', '0')]
    result=[]
    for i in tuple_result:	#i는 차례로('0',), ('1',), ('1',), ('0', '1'), ('0', '1')....
      word=''
      for c in i:	
        word+=c	
      result.append(word)	#최종 result안에는 '0', '1', '1', '01', '01', '10', '11', '10', '11', '011', '011', '101', '110', '101', '110'
    for i,v in enumerate(result):
      result[i]=int(v)	#각 리스트원소를 정수로 변환
#
	#정수변환 마친 result에는 [0, 1, 1, 1, 1, 10, 11, 10, 11, 11, 11, 101, 110, 101, 110]
    result=list(set(result))
    #중복제거 마친 result에는 [0, 1, 101, 10, 11, 110]
    # print(result)
    count=0	//소수의 갯수
    for i in result:
      if(is_prime_number(i)):
        count+=1
    return count

<해설>

'011'이라는 문자열이 주어질 때 각원소로 중복없이 모든 조합을 구할줄 알고 그 모든 수들을 소수인지 판별 후 갯수를 세어간다

<카펫>

def middle_length(row,col):	#가로,세로가 주어지면 가운데 길이구하는 함수
  return ((row-2)*(col-2))
#
def row_col(brown):	#brown이 어지면 모든 가로,세로 조합들을 구하는 공식
  result=[]
  for r in range(3,brown):
    for c in range(3,r+1):
      if((r*2)+(c*2)-4==brown):
        result.append([r,c])
  return result
#
def solution(brown, yellow):
    result=row_col(brown)	#brown이 24일 경우->[[7, 7], [8, 6], [9, 5], [10, 4], [11, 3]]
    for r,c in result:
      if(middle_length(r,c)==yellow):	#조합으로 나온 yellow값들과 같아면 추출!
        return [r,c]

<해설>

brown이 주어질때 가로,세로로 나올수 있는 모든 조합을 구하며 그 조합들로 yellow값을 만드는 공식으로 나온 결과가 정답에 주어진 yellow와 같으면 반환

좋은 웹페이지 즐겨찾기