알고리즘/BOJ 1234

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

백준 1476번 날짜 계산

문제 링크입니다: https://www.acmicpc.net/problem/1476 Year-E는 15의 배수이고, Year-S는 28의 배수이고, Year-M은 19의 배수이므로 이 모든 조건을 만족하는 년도가 답입니다. #include using namespace std; int E, S, M; int calculateYear(void) { //Year - E = 15*x //Year - S = 28*y //Year - M = 19*z int result; int year = 1; while (1) { if ((year - E) % 15 == 0 && (year - S) % 28 == 0 && (year - M) % 19 == 0) { result = year; break; } year++; } re..

알고리즘/BOJ 2018.05.06

백준 1038번 감소하는 수

문제 링크입니다: https://www.acmicpc.net/problem/1038 분류는 DP 문제라고 되어있지만 간단하게 큐를 이용하여 풀었습니다.기존에 감소하는 수라고 판별된 숫자를 큐에 집어넣어 마지막 자리숫자보다 작은 숫자들을 붙여나가는 방식으로 나열했습니다. #include #include using namespace std; const int MAX = 1000000; int N; int idx = 9; //1~9는 이미 감소수라고 여김 queue q; long long descending[MAX + 1]; void preCalculate(void) { while (idx > N; //1~9는 이미 감소하는 수 for (int i = 1; i

알고리즘/BOJ 2018.05.05

백준 2010번 플러그

문제 링크입니다: https://www.acmicpc.net/problem/2010 기존에 사용 가능한 플러그 중 하나는 다음 멀티탭을 꽂을 때 사용된다는 것을 인지하고 있다면 쉽게 풀 수 있는 문제였습니다. #include using namespace std; const int MAX = 500000; int N; int multitap[MAX]; int maxComputer(void) { int result = multitap[0]; //첫 멀티탭은 다른 멀티탭이 안 꽂아져있으므로 모든 플러그 사용 가능 for (int i = 1; i < N; i++) { result -= 1; //기존 멀티탭 플러그 중 하나에 다음 멀티탭을 꽂아야하므로 result += multitap[i]; //다음 멀티탭 플러..

알고리즘/BOJ 2018.05.05

백준 1094번 막대기

문제 링크입니다: https://www.acmicpc.net/problem/1094 결국 문제에서 요구하는 것은 주어진 X를 이진수로 변환했을 때 1의 개수였습니다.따라서 이진수로 변환 후 1의 갯수를 세면 쉽게 풀 수 있는 문제였습니다. #include #include using namespace std; int X; int numOfDivide(void) { int N = 64; int result = 0; int idx = 0; //이진수로 변환 while (X) { if (N > X) //N이 X보다 큰 경우 N을 2로 나누고 승수를 낮춘다 { N /= 2; idx++; continue; } result++; //2의 (6-idx)승이 1인 경우 센다 X -= pow(2.0, 6 - idx); }..

알고리즘/BOJ 2018.05.05

백준 1475번 방 번호

문제 링크입니다: https://www.acmicpc.net/problem/1475 6과 9는 서로 뒤집어서 사용가능하다는 조건과 0이 입력 되었을 경우 1을 반환해야하는 기저사례를 숙지하고 있다면 쉽게 풀 수 있는 문제였습니다. #include #include using namespace std; int N; int plasticNum[10]; int numOfSet(void) { //기저 사례 if (N == 0) return 1; int result = 0; while (N) { int idx = N % 10; //사용할 수 있는 숫자가 갖고 있는 세트에 없을 경우 if (!plasticNum[idx]) { //6과 9는 뒤집어서 사용 가능 if (idx == 6 && plasticNum[9] !=..

알고리즘/BOJ 2018.05.05

백준 1037번 약수

문제 링크입니다: https://www.acmicpc.net/problem/1037 "첫번째 약수 * 마지막 약수 = 구해야하는 숫자"가 핵심이였습니다. #include #include #include using namespace std; const int MAX = 50; int numOfDivisor; vector divisor; int getNumber(void) { sort(divisor.begin(), divisor.end()); //오름차순으로 정렬 int number = divisor[0] * divisor[numOfDivisor-1]; //첫번째 약수 * 마지막 약수 return number; } int main(void) { cin >> numOfDivisor; for (int i = 0..

알고리즘/BOJ 2018.05.04

백준 1004번 어린 왕자

문제 링크입니다: https://www.acmicpc.net/problem/1004 터렛 문제(http://jaimemin.tistory.com/513?category=988050)와 같이 기하학 문제였기 때문에 점과 점 사이의 거리 공식을 또 사용하였습니다.핵심은 시작점과 도착점의 위치였습니다.시작점과 도착점이 모두 주어진 행성 내/외에 있다면 굳이 지나가지 않아도 됩니다.하지만 시작점이 행성 내부에 있고 도착점이 행성 외부에 있거나 시작점이 행성 외부에 있고 도착점이 행성 외부에 있다면 반드시 지나가야합니다. #include #include using namespace std; int x, y, x2, y2; //시작점, 도착점 int cx, cy, r; //주어진 행성계의 중점, 반지름 double..

알고리즘/BOJ 2018.05.01