알고리즘/BOJ 1231

백준 1057번 토너먼트

문제 링크입니다: https://www.acmicpc.net/problem/1057 간단한 수학 문제였습니다.라운드가 올라갈때마다 자신의 번호는 (자신의 번호 + 1)/2가 됩니다.따라서 두 경쟁자 모두 2로 나누었을 때 똑같은 위치에 있다면 해당 라운드에서 경쟁하게 됩니다. #include using namespace std; int N; int competitor1, competitor2; int getRound(void) { int round = 1; while (N) { //서로 인접해있다면 break if ((competitor1 + 1) / 2 == (competitor2 + 1) / 2) break; //라운드가 올라갈수록 idx는 반이 된다 competitor1 = (competitor1 ..

알고리즘/BOJ 2018.05.07

백준 10835번 카드게임

문제 링크입니다: https://www.acmicpc.net/problem/10835 재귀함수를 이용하여 간단하게 풀 수 있는 DP 문제였습니다.조건에서 오른쪽 더미에 있는 카드가 왼쪽 더미에 있는 카드보다 작을 경우 오른쪽 더미에 있는 카드만큼 점수를 더하라고 했으므로 재귀에서 조건을 다음과 같이 두 가지 경우의 수로 나누었습니다. 1. 오른쪽 더미에 있는 카드가 왼쪽 더미에 있는 카드보다 작을 경우a) 오른쪽 카드만큼 더하고 오른쪽 더미 인덱스를 늘린다b) 왼쪽 카드 인덱스를 늘린다c) 왼쪽, 오른쪽 모두 카드 인덱스를 늘린다2. 그 외a) 왼쪽 카드 인덱스를 늘린다b) 왼쪽, 오른쪽 모두 카드 인덱스를 늘린다 #include #include #include //memset using namespac..

알고리즘/BOJ 2018.05.07

백준 10989번 수 정렬하기 3

문제 링크입니다: https://www.acmicpc.net/problem/10989 페이스북 생활코딩 그룹에서 질문이 올라왔길래 한번 풀어봤습니다.알고리즘은 완벽했지만 cin과 cout이 무거워서 시간초과가 발생했었습니다.따라서 printf과 scanf를 사용했더니 AC가 나왔습니다... #include using namespace std; const int MAX = 10000 + 1; int N; int arr[MAX]; void ascendingOrder(void) { //누적 합 for (int i = 1; i < MAX; i++) arr[i] += arr[i - 1]; for (int i = 1; i < MAX; i++) { //arr[i]-arr[i-1]은 i가 입력된 횟수 int idx =..

알고리즘/BOJ 2018.05.07

백준 2602번 돌다리 건너기

문제 링크입니다: https://www.acmicpc.net/problem/2602 처음에 조건을 너무 어렵게 생각해서 틀렸던 문제였습니다.문자열의 길이는 '\n'까지 고려한다는 것을 숙지하고 있다면 기저사례를 쉽게 떠올릴 수 있습니다.Top-Down 방식으로 재귀함수를 작성했기 때문에 쉽게 코드를 해석할 수 있을 것 같습니다.(개인적으로 Bottom-Up 방식은 해석하기 너무 어렵기 때문에 Top-Down 방식을 선호합니다.) #include #include #include //memset using namespace std; const int MAX = 100 + 1; const int SCROLLMAX = 20; string scroll; //마법의 두루마리 string bridge[2]; int ..

알고리즘/BOJ 2018.05.06

백준 1958번 LCS 3

문제 링크입니다: https://www.acmicpc.net/problem/1958 http://jaimemin.tistory.com/383과 비슷한 문제였습니다.LCS 2는 공통문자열까지 출력을 해야했기 때문에 어떻게 본다면 LCS 3보다 더 어려운 문제라고 할 수 있습니다.LCS 3은 아래와 같이 7가지 경우의 수를 고려하면 쉽게 풀 수 있는 문제였습니다. 1. s1만 인덱스 증가할 경우2. s2만 인덱스 증가할 경우3. s3만 인덱스 증가할 경우4. s1과 s2만 인덱스 증가할 경우5. s1과 s3만 인덱스 증가할 경우6. s2와 s3만 인덱스 증가할 경우7. s1[idx1], s2[idx2], s3[idx3] 모두 같은 문자이기 때문에 전부 인덱스 증가할 경우 #include #include #i..

알고리즘/BOJ 2018.05.06

백준 1076번 저항

문제 링크입니다: https://www.acmicpc.net/problem/1076 간단한 수학 문제였습니다.조심해야할 점은 int형 범위를 초과할 수 있기 때문에 결과를 long long 변수로 선언해야 한다는 것입니다. #include #include using namespace std; int colorValue[3]; string color[3]; pair resistance[10]; enum{black=0, brown, red, orange, yellow, green, blue, violet, grey, white}; void Initialize(void) { long long multiple = 1; for (int i = 0; i < 10; i++) { resistance[i].first =..

알고리즘/BOJ 2018.05.06

백준 1509번 팰린드롬 분할

문제 링크입니다: https://www.acmicpc.net/problem/1509 http://jaimemin.tistory.com/453에서 최소 분할 개수를 판별하는 함수만 추가하면 되는 문제였습니다.최소 분할 개수를 판별하기 위해서는 0번째 인덱스를 비워놓아야 했기 때문에 문자열을 입력 받은 다음에 한칸씩 뒤로 밀어서 저장했습니다. #include #include #include #include //memset using namespace std; const int MAX = 2500 + 1; const int INF = 98754321; string str; char S[MAX]; int cache[MAX][MAX]; int minResult[MAX]; int palindrome(int star..

알고리즘/BOJ 2018.05.06

백준 14501번 퇴사

문제 링크입니다: https://www.acmicpc.net/problem/14501 알고리즘은 간단합니다. 해당 일에 배정된 상담을 택하거나 해당 일에 배정된 상담을 택하지 않는 경우의 수만 파악하면 됩니다.해당 일에 배정된 상담을 택할 경우 해당 상담에 배정된 금액 또한 더해주고 DP를 통해 최대 이익을 찾으면 되는 문제였습니다. #include #include #include //memset using namespace std; const int MAX = 15 + 1; const int INF = 987654321; int N; pair input[MAX]; int cache[MAX]; int maxProfit(int day) { //기저 사례: 상담 진행하는 일 수가 N을 초과하면 안 된다 if..

알고리즘/BOJ 2018.05.06