알고리즘/BOJ 1231

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

백준 1002번 터렛

문제 링크입니다: https://www.acmicpc.net/problem/1002 기하학 알고리즘 문제였습니다.크게는 2가지 경우의 수, 작게는 7가지 경우의 수를 고려하면 되는 문제였습니다.2차원 평면에서 점과 점 사이의 거리 공식은 워낙 유명하기 때문에 설명을 생략하겠습니다. 1. 한 원의 중심이 다른 원 안에 있는 경우a) 동일 원인 경우b) 접점이 없는 경우(작은 반지름 + 두 중심 사이의 거리 큰 반지름)2. 각 원의 중심이 다른 원 안에 없는 경우a) 접점이 없는 경우(작은 반지름 + 큰 반지름 < 두 중심 사이의 거리)b) 접점이 하나..

알고리즘/BOJ 2018.05.01

백준 14926번 Not Equal

문제 링크입니다: https://www.acmicpc.net/problem/14926 "한 줄 표기법에 최소로 필요한 "!="의 개수인 C(N, 2)는 Vertex가 N개인 완전 그래프의 Edge의 개수와 동일함을 고려해 보라." 힌트를 보고 아래와 같이 코드를 짰습니다.이미 방문한 간선은 다시 지나가지 않고 해당 정점에서 더 이상 이을 간선이 없다면 이전 정점으로 돌아와 간선을 이어가도록 했습니다! *N은 홀수일 때만 가능합니다! #include using namespace std; const int MAX = 500 + 1; int N;//힌트: 한 줄 표기법에 최소로 필요한 "!="의 개수인 C(N,2)는//Vertex가 N개인 완전 그래프의 Edge의 개수와 동일함int edges[MAX][MAX..

알고리즘/BOJ 2018.05.01

백준 1085번 직사각형에서 탈출

문제 링크입니다: https://www.acmicpc.net/problem/1085 기분 전환 겸 오랜만에 수학 카테고리 문제를 풀었는데 정말 쉬운 문제였습니다. #include #include using namespace std; int x, y; //현 위치 int w, h; //오른쪽 위 꼭지점 int minStepToBoundary(void) { int step = 0; //우선 위 아래 확인 step = min(w - x, x); //왼쪽 오른쪽 확인 step = min(step, min(h - y, y)); return step; } int main(void) { cin >> x >> y; cin >> w >> h; cout

알고리즘/BOJ 2018.04.30