250x250
vg-rlo
vg-rlo
vg-rlo
전체 방문자
오늘
어제
  • CATEGORY (114)
    • 일상과 기록 (12)
    • REVIEW (11)
    • DATA (20)
      • ML and DL (6)
      • NLP (2)
      • Growth hacking (2)
      • Note (10)
    • CODE (46)
      • Algorithm and Data Structur.. (2)
      • Coding Test (34)
      • DB (2)
      • Python (6)
      • Linux (2)
      • Github (0)
    • Portfolio (6)
      • Pratice and Tutorials (2)
      • Toy Projects (2)
      • Competitions (2)
      • Data Analysis (0)
    • ISSUE (17)
    • 🛠... (0)

블로그 메뉴

  • Github

인기 글

티스토리

hELLO · Designed By 정상우.
vg-rlo

vg-rlo

CODE/Coding Test

[Programmers] DFS/BFS - 타겟넘버

2021. 7. 2. 19:49
프로그래머스 타겟 넘버: https://programmers.co.kr/learn/courses/30/lessons/43165
 

코딩테스트 연습 - 타겟 넘버

n개의 음이 아닌 정수가 있습니다. 이 수를 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수 있습니다. -1+1+1+1+1 = 3 +1-1+1+1+

programmers.co.kr

문제 설명

n개의 음이 아닌 정수가 있습니다. 이 수를 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수 있습니다.

-1+1+1+1+1 = 3 +1-1+1+1+1 = 3 +1+1-1+1+1 = 3 +1+1+1-1+1 = 3 +1+1+1+1-1 = 3

사용할 수 있는 숫자가 담긴 배열 numbers, 타겟 넘버 target이 매개변수로 주어질 때 숫자를 적절히 더하고 빼서 타겟 넘버를 만드는 방법의 수를 return 하도록 solution 함수를 작성해주세요.

제한사항

  • 주어지는 숫자의 개수는 2개 이상 20개 이하입니다.
  • 각 숫자는 1 이상 50 이하인 자연수입니다.
  • 타겟 넘버는 1 이상 1000 이하인 자연수입니다.

입출력 예

numbers target return
[1, 1, 1, 1, 1] 3 5

 

알고리즘

탐색의 종류 

완전 탐색법 

깊이우선 탐색법(DFS)

너비우선 탐색법(BFS)

 

제출 코드 - 완전 탐색

# Reference: https://jellysong.tistory.com/68
# My Blog: https://vg-rlo.tistory.com/119

from itertools import product

def solution(numbers, target):
    '''
    완전탐색법
    cases: 덧셈/뺄셈 부호의 전체 케이스 
    count: number와 같은 결과가 덧셈 결과로 나오는 경우의 수
    '''
    cases = []
    for _ in range(len(numbers)):
        cases.append([-1, 1])
    cases = list(product(*cases))
    # print(cases)
    
    count = 0
    for case in cases:
        s = 0
        for i in range(len(numbers)):
            s += case[i] * numbers[i]
        if s == target:
            count += 1
    return count

if __name__ == '__main__':
    nums = [[1,1,1,1,1], [1,1,1]]
    tgt = [3, 1] 
    # answer = 5, 3
    for inp in zip(nums, tgt):
        print(solution(inp[0], inp[1]))

 

실행 결과 - 완전 탐색

테스트 1 〉 통과 (2249.45ms, 234MB)
테스트 2 〉 통과 (2060.21ms, 234MB)
테스트 3 〉 통과 (2.00ms, 10.3MB)
테스트 4 〉 통과 (5.98ms, 10.7MB)
테스트 5 〉 통과 (54.66ms, 15.5MB)
테스트 6 〉 통과 (3.29ms, 10MB)
테스트 7 〉 통과 (1.19ms, 10.3MB)
테스트 8 〉 통과 (12.79ms, 11.2MB)
저작자표시 (새창열림)
    'CODE/Coding Test' 카테고리의 다른 글
    • [Programmers] 완전 탐색 - 카펫
    • [Programmers] 완전 탐색 - 소수 찾기
    • [Programmers] 스택/큐 - 다리를 지나는 트럭
    • [Programmers] 탐욕법(Greedy) - 큰 수 만들기
    vg-rlo
    vg-rlo
    🛠블로그 공사중.. Keep going! 🤔 (Profile - Dinotaeng®)

    티스토리툴바