본문 바로가기

백준

(81)
1004)어린 왕자 https://www.acmicpc.net/problem/1004 시작점에서 도착점까지 행성계를 진입/이탈 하는 최소 횟수를 구해야 한다. 되게 어려워 보이지만 잘 관찰해보면 점이 원 내부에 있는가 외부에 있는가에 따라 진입/이탈 횟수가 결정됨을 알 수 있다. 위 그림에서 왼쪽 빨간 점은 아주 큰 행성계 하나에만 포함되어 있고 오른쪽 빨간 점은 두 개의 행성계에 포함되어 있다. 각 점이 행성계에 몇 번 포함됬냐에 따라 진입/이탈 횟수를 쉽게 알 수 있다. 어떤 점이 원 안에 포함됬는 지 여부를 확인 하려면 P(x0, y0)을 C : (x-a)^2 + (y-b)^2에 대입했을 때 C(x0,y0) > r^2이면 점이 원 바깥에 있고 C(x0,y0) < r^2이면 점은 원 안에 있다. 그림처럼 두 점이 같은 ..
14910)오르막 https://www.acmicpc.net/problem/14910 수열의 각 항들이 입력으로 주어지면 수열이 비내림차순 수열인지 아닌지 판단해야 한다. 입력의 갯수가 주어지지 않기 때문에 몇 개의 수열을 입력받을 지 모른다. 질문 검색을 뒤져보니까 좋은 테크닉이 있더라. while( scanf("%d",&value) != EOF) 반복문 조건을 이렇게 해두면 입력이 끝나면 종료할 수 있다. 반복문 구조 때문에 입력받는 순간에 판단을 계속해야 한다. 이전 항과 현재 항을 비교해 내림차순인게 하나라도 있으면 그 수열은 비내림차순 수열이 아니다. 123456789101112131415161718192021#include typedef enum _BOOL { TRUE = 1, FALSE = 0}BOOL; in..
2991)사나운 개 https://www.acmicpc.net/problem/2991 개1은 시간 a동안 짖고 b동안 쉬며 개2는 시간 c동안 짖고 d동안 쉰다. 개들에게도 짖는 주기가 있다. 이 주기는 펑크없이 쭉 반복되기 때문에 배달원이 도착할 때 이 주기 안에 있을 수 밖에 없다. 배달원이 도착한 시간을 t라 할 때 주기 안에 배달원이 도착한 시점(h라 하자)은 h = t%(a+b)이다. 0
2210)숫자판 점프 https://www.acmicpc.net/problem/2210 문제에서 제시된 규칙대로 숫자판에 접근해 만들어 질 수 있는 수는 아주 많다. 또한 중복되는 수들도 많기 때문에 중복되지 않게 규칙대로 만들어지는 수들을 저장해야 한다. 우선 규칙대로 수를 만드는 방법에 대해 생각해보자. 이를 위해 4방향으로 탐색하는 재귀함수를 응용했다. count를 이용해 6번 방향탐색을 한다. 숫자판의 각 숫자에 접근해 그 숫자들을 기록해야 한다. value 값을 10을 곱한 뒤(초기값 0) 기존 원소를 기준으로 동서남북 방향의 원소에 접근해 얻은 값을value에 합산한다. 그리고 이 value를 다음 호출할 함수로 넘긴다. 예를 들어 방향탐색에 의해 순서대로 1->2->3 순으로 접근한다고 하자. value = 0에..
6679)싱기한 네 자리 숫자 https://www.acmicpc.net/problem/6679 수의 본질에 대해 조금 생각하게 해준 문제였다. 일상 생활에서 쓰는 수 표현 방법은 십진법이다. 십진법은 수라는 물리량을 10개의 숫자로 표현하는 방법이다. 16진법은 수를 표현하기 위해 숫자 16개를 사용했을 뿐이다. 몇 개의 숫자로 수를 표현하든 수의 크기는 변하지 않는다. 예를들어 십진법으로 표현된 30을 생각해보자. 30은 16진법으로 표현했을 때 1E이다. 1E를 10으로 나눈 나머지의 크기는 10진법으로 표현하든 16진법으로 표현하든 크기는 다르지 않다. 10진법으로 표현된 수의 각 자릿수를 구하기 위해 몫을 10으로 반복적으로 나눈다. 12, 16진법도 각 자릿수를 구하기 위해 12,16을 반복적으로 나눈다. 그리고 10,12..
2740)행렬 곱셈 https://www.acmicpc.net/problem/2740 행렬 곱셈할 때 인덱스만 신경쓰면 쉽게 구현할 수 있다. 3x2인 행렬 A와 2x3인 행렬 B를 곱한다고 하자.A의 1행과 B의 1열을 곱할 때 i는 A의 행을 고정하고 k는 B의 열을 고정한 상태에서 j를 움직여 각각의 원소를 매칭시키고 그 결과를 C[i,j]에 저장하면 된다. 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253#include int main() { int N,M, K; int **A, **B, **C; int temp; scanf("%d %d",&N,&M); A = (int **)malloc(siz..
2312)수 복원하기 https://www.acmicpc.net/problem/2312 어떤 수를 소인수분해하려면 그 수 이하의 소수로 나눌 수 없을 때까지 나눠봐야 한다. 에라토스테네스의 체로 100000 이하의 소수를 미리 구해놓는다. 주어진 수를 2부터 그 수까지 소수로 나눌 수 없을 때까지 나누고 나누어지는 경우 그 소수를 하나 카운팅한다. 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556#include#define MAX 100000 typedef enum _BOOL { TRUE = 1, FALSE = 0}BOOL; void initArray(int A[MAX + 1], int n)..
2667)단지 번호 붙이기 https://www.acmicpc.net/problem/2667 자료구조나 알고리즘 공부를 똑바로 안해서 자료구조, 알고리즘 활용하는 문제는 피하면서 문제를 푸는데 선택할 수 있는 문제의 폭이 점점 좁아지는 것같다. 특히 3~4문제에 한 문제 꼴로 DP문제가 나오는데 DP 공부를 안해서 DP를 걸렀더니 풀 수 있는 문제가 많지 않다. 이 문제 유형은 세 번째 풀어봐서 어렵지 않게 풀었다. 맵을 입력 받으면 차례로 읽다가 1을 만나면 인접한 영역을 방문하면서 그 수를 세고 방문한 영역을 0으로 만든다. 인접한 영역의 방문이 끝나면 수를 반환한다. 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849..