문제풀이
-
알고리즘: 백준 1010번 다리놓기 (feat. c++)알고리즘/백준(BaekJoon) 2020. 8. 18. 19:00
백준 1010번 링크입니다. 1010번: 다리 놓기 입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 강의 서쪽과 동쪽에 있는 사이트의 개수 정수 N, M (0 < N ≤ M < 30)이 주어진다. www.acmicpc.net n개 중에 r개를 고르면 되므로 nCr을 사용하면 간단하다...고 생각했지만 아니였다. 팩토리얼을 다이나믹 프로그래밍으로 구해서 콤비네이션하려 했지만 long long 자료형을 써도 넘어가버려서 다이나믹 프로그래밍과 재귀함수를 이용하였다. nCr = n-1Cr-1 + n-1Cr 을 이용해서 recursive form을 만들어 해결하였다. #include using namespace std; int cache[30][30]; // 다이..
-
알고리즘: 백준 1018번 체스판 다시칠하기(feat. c++)알고리즘/백준(BaekJoon) 2020. 8. 18. 16:28
백준 1018번 링크입니다. 1018번: 체스판 다시 칠하기 첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다. www.acmicpc.net B로 시작하는 8 x 8 완성된 체스판을 chess1 W로 시작하는 8 x 8 완성된 체스판을 chess2 내가 입력받을 잘못된 체스판을 wrong_chess라고 하자 wrong_chess의 행과 열을 변화시켜 가면서 chess1과 chess2와 비교한다. chess1과 비교했을 때 잘못된 값의 갯수 = wrong_count1 chess2과 비교했을 때 잘못된 값의 갯수 = wrong_count2일때 두 값중에 더 작은 값을 ..
-
알고리즘: 백준 10610번 30 (feat. Python)알고리즘/백준(BaekJoon) 2020. 8. 8. 17:55
백준 10610번 링크입니다. https://www.acmicpc.net/problem/10610 10610번: 30 문제 어느 날, 미르코는 우연히 길거리에서 양수 N을 보았다. 미르코는 30이란 수를 존경하기 때문에, 그는 길거리에서 찾은 수에 포함된 숫자들을 섞어 30의 배수가 되는 가장 큰 수를 만들고 싶� www.acmicpc.net 30의 배수가 되기 위한 조건은 어떤수 N이 10의 배수이고 3의 배수인 경우이다. N이 10의 배수가 되기 위한 조건 = N안에 0이 포함되어 있으면 성립 N이 3의 배수가 되기 위한 조건 = N의 모든 자리수를 더했을 때 3의 배수이면 성립 이 두 조건만 성립하면 최대값은 N을 그냥 그대로 내림차순 정렬한 값이다. import sys input = sys.std..
-
알고리즘: 백준 2217번 로프 (feat.Python)알고리즘/백준(BaekJoon) 2020. 8. 8. 16:51
백준 2217번 링크입니다. https://www.acmicpc.net/problem/2217 2217번: 로프 N(1≤N≤100,000)개의 로프가 있다. 이 로프를 이용하여 이런 저런 물체를 들어올릴 수 있다. 각각의 로프는 그 굵기나 길이가 다르기 때문에 들 수 있는 물체의 중량이 서로 다를 수도 있다. 하지만 www.acmicpc.net 로프들이 견딜 수 있는 리스트를 만들어 오름차순으로 배열한다. 만약 10, 25, 30가 로프가 버틸 수 있는 최대중량으로 주어진다면 10 x 3 = 30 25 x 2 = 50 30 x 1 = 30 으로 최대 버틸 수 있는 중량은 50이 된다. ropes[i] * (n - i) 들로 이루어진 리스트의 최대 값을 찾으면 되는 것이다. import sys input ..
-
알고리즘: 백준 11399번 ATM (feat. Python)알고리즘/백준(BaekJoon) 2020. 8. 8. 15:19
3 1 4 3 2을 입력으로 받을 때 돈을 인출하는데 걸리는 시간의 합은 3 x 5 + 1 x 4 + 4 x 3 + 3 x 2 + 1 x 1 입니다. 직관적으로 3 1 3 4 2를 오름차순으로 배열해서 각각 5부터 1까지 곱한다면 돈을 인출하는데 걸리는 시간이 최소가 됨을 알 수 있습니다. import sys input = sys.stdin.readline n = int(input()) get_time = list(map(int, input().split())) total = 0 get_time.sort() for i in range(n): total += (n - i) * get_time[i] print(total) 5 3 1 4 3 2 32 Process finished with exit code 0