알고리즘/BOJ 1238

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

백준 2178번 미로 탐색

문제 링크입니다: https://www.acmicpc.net/problem/2178 전형적인 BFS 문제였기 때문에 큐를 이용하여 쉽게 풀 수 있는 문제였습니다.중요한 부분은 해당 칸과 이동하는 칸을 모두 방문 표시 처리해야한 다는 점입니다. #include #include #include #include //memset using namespace std; const int MAX = 100; int N, M; int maze[MAX][MAX]; bool visited[MAX][MAX]; typedef struct { int y, x, pathLength; //좌표와 현재까지의 길이 }dir; int minStep(int y, int x, int pathLength) { queue q; int resu..

알고리즘/BOJ 2018.04.29

백준 11509번 풍선 맞추기

문제 링크입니다: https://www.acmicpc.net/problem/11509 처음에 Brute Force 방식으로 풀었기 때문에 TLE가 발생했습니다. 사실 O(N^2)이기 때문에 시간 안에 풀 수 있을 줄 알았지만 문제에서 요구하는 시간 복잡도는 O(N)이였습니다.이 문제의 핵심은 더 높은 곳에서 날아오는 화살의 존재 여부를 판단하는 것이였습니다. #include #include //memset using namespace std; const int MAX = 1000000 + 1; int N; int arrowHeight[MAX]; //화살 높이 /* int balloonHeight[MAX]; //풍선 높이 bool popped[MAX]; //풍선이 터졌는지 여부 int minArrow(vo..

알고리즘/BOJ 2018.04.29

백준 1500번 최대 곱

문제 링크입니다: https://www.acmicpc.net/problem/1500 고등학교 수학을 배웠다면 상식적으로 곱하는 숫자들끼리의 차가 적을수록 곱이 커지는 것을 알고 있습니다.따라서 아래와 같이 코드를 작성했습니다. #include using namespace std; long long S, K; //곱하는 숫자들의 차가 적을수록 결과가 커진다 long long maxMultiple(void) { long long result = 1; long long multiplier = S / K; long long cnt = S - (multiplier * K); //multiplier+1을 곱하는 횟수 //multiplier 곱하는 횟수 = K - cnt for (int i = 0; i < K - c..

알고리즘/BOJ 2018.04.29