알고리즘
-
알고리즘: 백준 11057번 오르막 수 (feat. c++)알고리즘/백준(BaekJoon) 2020. 8. 24. 11:45
백준 11057 링크입니다. 11057번: 오르막 수 오르막 수는 수의 자리가 오름차순을 이루는 수를 말한다. 이때, 인접한 수가 같아도 오름차순으로 친다. 예를 들어, 2234와 3678, 11119는 오르막 수이지만, 2232, 3676, 91111은 오르막 수가 아니다. 수� www.acmicpc.net 다이나믹 프로그래밍을 이용하면 쉽지만 어떤 구조를 이용하면 좋을지가 가장 어렵다. dp를 이차원리스트로 해서 dp[i][j] = 길이가 i인 끝자리수가 j인 오르막 수 라고 하면 쉽게 해결할 수 있다. (끝자리수를 기준으로 나누는게 포인트) i는 1 ~ 1000 j는 0 ~ 9까지 가능하다 예를 들어 dp[2][3]을 구한다고 하면 dp[2][3] = dp[1][2] + dp[1][1] + dp[1..
-
알고리즘: 백준 11052번 카드 구매하기(feat.c++)알고리즘/백준(BaekJoon) 2020. 8. 23. 18:13
백준 11052번 링크입니다. 11052번: 카드 구매하기 첫째 줄에 민규가 구매하려고 하는 카드의 개수 N이 주어진다. (1 ≤ N ≤ 1,000) 둘째 줄에는 Pi가 P1부터 PN까지 순서대로 주어진다. (1 ≤ Pi ≤ 10,000) www.acmicpc.net 다이나믹 프로그래밍을 이용하면 쉽게 해결할 수 있다. 우선 코딩하기 전에 dp[n]을 말로 정의하는 게 중요하다. dp[n] = n개의 카드를 구매했을 때 최댓값 라고 하자 dp[n]을 구하기 위해서는 다음과 같은 과정을 거친다. (편의상 k번째 dp[n]을 dpk[n]라고 하자) dp1[n] = dp[n - 1] + packs[1] dp2[n] = dp[n - 2] + packs[2] dp3[n] = dp[n - 3] + packs[3] ..
-
알고리즘: 백준 1697번 숨바꼭질 (feat. c++)알고리즘/백준(BaekJoon) 2020. 8. 23. 14:40
백준 1697번 링크입니다. 1697번: 숨바꼭질 문제 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 www.acmicpc.net bfs를 이용하면 문제가 생각보다 쉽게 풀린다. 최대 가능 인풋이 100000이기 때문에 시간복잡도가 최대 n^2 까지 가능하다고 생각하였다. 최단거리 문제이기도 해서 bfs를 선택하였다. #include #include using namespace std; int visit[100001]; bool check(int x) { //check 함수가 중요한듯! if (x 100001) ret..
-
메모: 파이썬 알고리즘 1차 강의 메모메모 및 기타 2020. 8. 20. 21:09
1. 문자열 역으로 출력하기 s = input() print(s[::-1]) 2. 시간복잡도 O(root(n)) 으로 소수판별하기 import math x = int(input()) answer = False if x % 2 == 0 and x != 2: answer = False else: for i in range(2, int(math.sqrt(x)) + 2): if x % i == 0: answer = False break else: answer = True print(answer) 3. 최대값구하기 3 4 1 7 9 2 2 7 9 6 1 9 5 7 3 9 # -*- coding: utf-8 -*- # UTF-8 encoding when using korean n = int(input()) numb..
-
알고리즘: 백준 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일때 두 값중에 더 작은 값을 ..
-
알고리즘: 백준 1037번 약수(feat. c++)알고리즘/백준(BaekJoon) 2020. 8. 18. 14:35
백준 1037번 링크입니다. 1037번: 약수 첫째 줄에 N의 진짜 약수의 개수가 주어진다. 이 개수는 50보다 작거나 같은 자연수이다. 둘째 줄에는 N의 진짜 약수가 주어진다. 1,000,000보다 작거나 같고, 2보다 크거나 같은 자연수이고, 중복되� www.acmicpc.net 방법 1 #include using namespace std; int main() { int n; int x; int max = -1; int min = 1000000; cin >> n; for (int i = 0; i > x; if (max x) { min = x; } } int answer = min * max; cout n; for (int..
-
알고리즘: 백준 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..