알고리즘/BOJ 1235

백준 1016번 제곱 ㄴㄴ 수

문제 링크입니다: https://www.acmicpc.net/problem/1016 처음에는 vector를 이용하여 풀었는데 중복된 제곱수를 추가하는 바람에 틀렸습니다.그래서 algorithm 헤더 파일을 추가하여 find 함수를 이용하여 중복된 제곱수를 방지했더니 시간 초과가 발생했습니다.따라서 언제나처럼 배열을 이용하여 풀었는데 한가지 유의사항은 인덱스를 0부터 시작하기 위해 arr[quotient*square - minNum]에 제곱수임을 표시해야한다는 점입니다. #include //#include //#include using namespace std; const int MAXSQRT = 1000000 + 1; long long minNum, maxNum; long long arr[MAXSQRT]..

알고리즘/BOJ 2018.05.09

백준 1026번 보물

문제 링크입니다: https://www.acmicpc.net/problem/1026 A를 내림차순으로 정렬하고 B를 오름차순으로 정렬한 뒤 각 인덱스마다 곱한 결과가 최소값입니다. #include #include #include using namespace std; int N; vector A, B; bool cmp(int num1, int num2) { return num1 > num2; } int minResult(void) { //A를 내림차순으로 정렬 sort(A.begin(), A.end(), cmp); //B를 오름차순으로 정렬 sort(B.begin(), B.end()); int result = 0; for (int i = 0; i < N; i++) result += (A[i] * B[i])..

알고리즘/BOJ 2018.05.09

백준 1967번 트리의 지름

문제 링크입니다: https://www.acmicpc.net/problem/1967 처음에는 DP로 접근하여 cache, graph는 MAX*MAX 크기로 잡고 visited는 MAX 크기로 잡으니 메모리 에러가 발생했습니다. #include #include #include //memset using namespace std; const int MAX = 10000 + 1; int N; int graph[MAX][MAX]; bool visited[MAX]; int cache[MAX][MAX]; int getDiameter(int start, int node) { int &result = cache[start][node]; if (result != -1) return result; result = 0; f..

알고리즘/BOJ 2018.05.09

백준 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