SW개발/코딩테스트

    [프로그래머스]소수 찾기 - 완전탐색

    https://programmers.co.kr/learn/courses/30/lessons/42839 코딩테스트 연습 - 소수 찾기 한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다. 각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 programmers.co.kr from itertools import permutations import math def solution(numbers): case = [] answer = 0 for i in range(len(numbers)): permu = list(map(''.join, permutations(numbers, i+1))) for j in permu: cas..

    [프로그래머스]모의고사 - 완전탐색

    https://programmers.co.kr/learn/courses/30/lessons/42840 코딩테스트 연습 - 모의고사 수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다. 1번 수포자가 찍는 programmers.co.kr def solution(answers): # 수포자가 정답을 찍는 패턴을 미리 지정해둠 person1 = [1, 2, 3, 4, 5] person2 = [2, 1, 2, 3, 2, 4, 2, 5] person3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5] # 각 수포자 별로 맞춘 정답수를 리스트화 score = [0, 0, 0] # enumerat..

    [백준]15649번 N과 M (1) - 백트래킹

    https://www.acmicpc.net/problem/15649 15649번: N과 M (1) 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해 www.acmicpc.net n, m = map(int, input().split()) visited = [False] * n arr = [] def dfs(cnt): # 수열이 m 자리수가 되면 종료 if cnt == m: print(*arr) # 리스트내의 모든 원소 출력 return for i in range(n): if visited[i]: # 이미 사용한 수라면, 방문했다면 continue arr.append(i ..

    [백준]1065번 한수 - 완전 탐색

    https://www.acmicpc.net/problem/1065 n = int(input()) han = 0 for i in range(1, n + 1): if i < 100: # 두자리수는 모두 등차수열, 즉 한수임 han += 1 else: # 세자리수라면 check = list(map(int, str(i))) # 리스트에 각 숫자를 저장 if check[1] - check[0] == check[2] - check[1]: # 각 자리의 차이가 같다면, 한수라면 han += 1 print(han) 코드 설명 두자리수까지는 모두 등차수열을 이룬다 따라서 100 미만은 전부 카운트를 해준다. 세자리수가 될때는 숫자를 분해하기 위해 문자열로 바꾼 값을 다시 Int 로 바꾸면서 리스트에 저장한다. 세자리수가..

    [백준]1436번 영화감독 숌 - 완전 탐색

    https://www.acmicpc.net/problem/1436 1436번: 영화감독 숌 666은 종말을 나타내는 수라고 한다. 따라서, 많은 블록버스터 영화에서는 666이 들어간 제목을 많이 사용한다. 영화감독 숌은 세상의 종말 이라는 시리즈 영화의 감독이다. 조지 루카스는 스타워 www.acmicpc.net n = int(input()) cnt = 0 check = 666 while True: if '666' in str(check): cnt += 1 if cnt == n: print(check) break check += 1 코드 설명 가장 작은 수는 666이 되기 때문에 초기값을 666으로 한 cehck 변수를 설정하여 준다. check 값을 1씩 증가시켜가면서 666이라는 값이 들어있을 경우에..

    [백준]1018번 체스판 다시 칠하기 - 완전 탐색

    https://www.acmicpc.net/problem/1018 1018번: 체스판 다시 칠하기 첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다. www.acmicpc.net n, m = map(int, input().split()) chess = [[0] * m for i in range(n)] for i in range(n): chess[i] = list(input()) change = 32 # 가장 최대로 많이 바꾸는 경우 for i in range(n): for j in range(m): if i + 8

    [백준]7568번 덩치 - 완전 탐색

    n = int(input()) person = [[0] * 2 for i in range(n)] answer = [1] * n # 순위 카운트 for i in range(n): person[i][0], person[i][1] = map(int, input().split()) for i in range(n): for j in range(n): if person[i][0] < person[j][0] and person[i][1] < person[j][1]: # 자신보다 키 몸무게 클 경우에만 answer[i] += 1 # 카운트를 함 for i in range(n): print(answer[i] , end=' ') # 출력 코드 설명 몸무게와 키를 저장하기 위한 person, 순위를 매기기 위한 answer..

    [백준]2231번 분해합 - 완전 탐색

    n = int(input()) for i in range(1, n + 1): a = list(str(i)) if i + sum(map(int, a)) == n: print(i) break if i == n: print(0) 코드 설명 반복문은 1부터 n 까지 진행한다. 입력을 받을때 숫자를 분해시켜 저장하기 위해 str() 로 변환후 list() 함수를 이용한다. 만약 본래의 숫자 + 분해시켜 저장한 숫자의 합이 n 과 같다면 그 수를 출력시키고 종료한다. 마지막 반복인 i == n 이 될 경우에는 생성자가 없으므로 0을 출력한다. Point : 숫자를 분해하는 작업을 위해 list 형으로의 변환이 필요하다. 또한 1부터 반복되기에 조건을 만족하면 그것이 바로 가장 작은 생성자가 된다.

    [백준]2798번 블랙잭 - 완전 탐색

    n, m = map(int, input().split()) num = list(map(int, input().split())) length = len(num) ans = 0 # 3중 포문을 통하여 차례로 탐색 for i in range(length - 2): for j in range(i + 1, length - 1): for x in range(j + 1, length): if num[i] + num[j] + num[x] > m: # 3개를 더한 값이 크다면 넘어감 continue else: # m 보다 크지 않다면 저장된 값과 새로 더한 값중 큰것을 선택 ans = max(ans, num[i] + num[j] + num[x]) print(ans) 코드 설명 모든 경우를 탐색하는 완전 탐색의 문제이므로..

    [백준]12865번 평범한 배낭 - DP

    n, k = map(int, input().split()) weight = [[0] * 2 for i in range(n + 1)] # 1부터 인덱스를 사용하기 위해 dp = [[0] * (k + 1) for i in range(n + 1)] # 가방의 크기 * 갯수 for i in range(1, n + 1): weight[i][0], weight[i][1] = map(int, input().split()) for i in range(1, n + 1): for j in range(1, k + 1): if j - weight[i][0] >= 0: # 가방의 크기 - 물건의 크기 >= 0 -> 즉 가방에 넘치지 않게 담을 수 있는가? # 이전의 값(i-1)과 물건을 담기전+물건의 가치 중 큰 것 선택 dp..