본문 바로가기

전체 글

(105)
10610번: 30 아래의 블로그에서 배수판정법에 대한 정보를 참고해서 코드를 작성했다. https://freshrimpsushi.tistory.com/21 3의 배수판정법과 9의 배수판정법의 증명 각 자리 숫자를 모두 더해 3의 배수면 3의 배수, 9의 배수면 9의 배수 예를 들어 8142는 8142=3*2714로 3의 배수고, 실제로 8+1+4+2=15는 3의 배수다. 1945125는 1945125=9*216125로 9의 배수고, 실제로 1+9+4+5+1.. freshrimpsushi.tistory.com #include #include #include int main(void) { std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); std::string val; s..
9613번: GCD 합 GCD는 최대 공약수를 의미한다. 유클리드 호제법을 이용해 간단하게 문제를 풀 수 있다. (합의 크기가 int범위를 넘어갈 수 있는 것에 주의) #include void swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp; } int main(void) { std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); int testCase; std::cin >> testCase; int len; int val[101] = { 0 }; for(int i = 0; i > len; for(int j = 0; j > val[j]; } long long sum = 0; for(int k = 0; k
9446번: 텀 프로젝트 보기보다 까다로운 문제다. (너무 지저분해서 내 코드를 완벽히 설명하기가 힘들 거 같다...) 처음에는 쌍을 찾기위해서 check 배열을 선언해서 각 testCase마다 초기화했었다. 하지만 시간이 한참 초과되는 걸 보고 check 배열을 초기화하는 대신 각 testCase마다 특정 수를 이용해서 하나의 check 배열을 재활용할 수 있도록 했다. DFS 함수에서 정답을 찾으면 skip 배열에 해당 testCase에 해당하는 특정 수를 부여해주고 이후 탐색한 순서 역순으로 되돌아가면서 해당하는 수의 skip 배열에 testCase에 해당하는 특정 수를 부여하고 sum을 +1 한다. DFS함수가 종료되면 쌍을 갖춘 학생들의 합인 sum과 총 학생 수인 len의 차이를 출력한다. #include #inclu..
9019번: DSLR 시간초과를 해결하는게 상당히 까다로운 문제다. string 사용을 최소화하여 BFS로 탐색한다면 정답에 도달할 수 있을 거다. #include #include #include #include #include int check[10000] = { 0 }; int main(void) { std::ios_base::sync_with_stdio(0); std::cin.tie(0); int testCase; std::cin >> testCase; int val, reach; std::queue mQ; for (int i = 0; i > val >> reach; while (!mQ.empty()) { mQ.pop(); } memset(check, false, sizeof(check)); mQ.push({ "", v..
7576번: 토마토 BFS를 이용해서 쉽게 풀 수 있는 문제. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 #include #include #include typedef struct { int y, x; } dif; dif dir[4] = { {1, 0}, {-1, 0}, {0, 1}, {0, -1} }; int check[1001][1001] = { 0 }; int map[1001][1001] = { 0 }; int main(void) { std::ios_base::sy..
6588번: 골드바흐의 추측 시간초과를 해결하는게 관건인 문제다. 우선은 에라토스테네스의 체를 이용해 홀수 소수를 구한다. 이후 가장 큰 b - a를 구하기위해 범위내의 가장 작은 홀수 소수(front)와 가장 큰 홀수 소수(end)부터 시작하여 더한 값이 주어진 값보다 크다면 end를 한칸 줄이고 주어진 값보다 작다면 front를 한칸 늘린다. 이런식으로 front값이 end값보다 작을 때까지 반복하면 답이 구해진다. 단! 1000000이라는 넓은 범위로 인해 탐색하는데 상당히 소요되므로 lower_bound를 통해 주어진 값보다 큰 인덱스를 구해서 end값에 넣어준다. #include #include #include int check[1000001] = { 0 }; int main(void) { std::ios_base::syn..
4949번: 균형잡힌 세상 스택구조를 이용해 문제를 풀었다. 일반 문자는 무시하고 괄호가 나올 때마다 조건을 걸었는데, 순서대로 문자를 순회하다 닫히는 괄호가 나왔을 때 스택의 탑이 동일한 쌍{ ( (, ) ), ( [, ] ), ( {, } )}이 아니라면 no를 출력할 수 있도록 했다. 마지막까지 정상적으로 열고 닫는게 완료되면 yes가 출력된다. #include #include int main(void) { std::ios_base::sync_with_stdio(0); std::cin.tie(0); char str[110] = { NULL }; while (true) { std::cin.getline(str, 110, '\n'); if (str[0] == '.') { break; } std::stack mS; for(int ..
3108번: 로고 (5, 5) ~ (8, 8)인 직사각형과 (6, 6) ~ (7, 7)인 직사각형이 있을 때 붙어있는지 구분하기가 힘들다. 그래서 각 좌표값에 *2를 해서 문제를 풀기 수월하도록 만들었다. 답을 구하기 위해서 DFS를 이용해 겹쳐진 직사각형이 몇개인지 구하고, 기준 좌표에 직사각형이 존재한다면 -1을 해서 답을 도출해냈다. #include typedef struct { int y, x; } dif; dif dir[4] = { {1, 0}, {-1, 0}, {0, 1}, {0, -1} }; int map[2001][2001] = { 0 }; int check[2001][2001] = { 0 }; void swap(int *a, int *b) { int temp = *a; *a = *b; *b = *a; } ..