본문 바로가기

문제풀이

(25)
[C언어] 백준 4153번 직각삼각형 int main() { int a, b, c; while(scanf("%d %d %d", &a, &b, &c) && a) puts(a * a == b * b + c * c || b * b == c * c + a * a || c * c == a * a + b * b ? "right" : "wrong"); return 0; } a = b = c 0일 때 반복문을 중단하도록 하는 게 가장 문제의 의도에 맞겠으나 문제가 제시하는 인풋 요건에 따르면, 세 변 모두가 정상적인 테스트라면 양의 정수로 주어진다.따라서 프로그램이 종료되는 시점은 하나의 값이라도 0(실제로는 모든 값이 0)이 되는 시점이기 때문에 반복문의 조건은 a > 0으로 한다. 가장 큰 수가 a가 되도록 스왑을 해야하나, a, b, c값을 먼저 비..
[C언어] 1085번 직사각형에서 탈출 #include int main() { int x, y, w, h; scanf("%d %d %d %d", &x, &y, &w, &h); (x < w - x) ? "" : (x = w - x); (y < h - y) ? "" : (y = h - y); printf("%d", x < y ? x : y); return 0; } #include int main() { int x, y, w, h, min; scanf("%d %d %d %d", &x, &y, &w, &h); min = (x < w - x ? x : w - x); min = (y < h - y ? (y < min ? y : min) : (h - y < min ? h - y : min)); printf("%d", min); return 0; }
[C언어] 9020번 골드바흐의 추측 소수를 미리 구해서 배열을 만든 뒤 가장 두 소수의 차가 적은 짝수 n을 만드는 소수 두 개의 조합을 찾아야 한다. n/2에서 i를 더하거나 뺀 값이다.ns 배열에서 소수일 경우 0, 소수가 아닌 경우 1로 이미 배열을 완성했기 때문에ns[i] || ns[n-i] 두 수 모두가 소수로 0일 때 (False) 반복문을 빠져나오면 소수 i와 n-i를 쉽게 찾을 수 있다. 4 6 8 10 12 14 16 18 20 22 2 3 3 5 5 7 5 7 7 11 n/2 n/2 n/2-1 n/2 n/2-1 n/2 n/2-3 n/2-2 n/2-3 n/2 2 3 5 5 7 7 11 11 13 11 n/2 n/2 n/2+1 n/2 n/2+1 n/2 n/2+3 n/2+2 n/2+3 n/2 #include #define MA..
[C언어] 백준 4948번 베르트랑 공준 에라토스테네스의 체를 이용해 배열을 미리 채워놓고, 입력을 받을 때마다 배열을 조회하면서 해당 구간의 소수의 개수를 세어 출력한다. ※ n = 0일때는 출력을 하지 않고 프로그램을 종료시켜야 한다. #include int main() { int n, i, j, cnt; char ns[246913] = {1,1}; for (i = 2; i * i < 2 * 123456 + 1; i++) if (!ns[i]) for (j = i * i; j < 2 * 123456 + 1; j += i) ns[j] = 1; do { scanf("%d", &n); if (n) { for (i = n+1, cnt = 0; i < 2 * n + 1; i++) if (!ns[i]) cnt++; printf("%d\n", cnt); ..
[C언어] 백준 1929번 소수구하기 [풀이1] 1112KB 108MS 여태 소수 관련 문제를 풀어왔던 대로 풀어봤다. m > 1보다 크고, 2이거나 2의 배수가 아닐 때 for loop을 통해 n까지 홀수로 증가하는 m이 소수인지 아닌지를 판별해 소수일 경우에만 m을 출력한다. 조건 체크와 할당식을 너무 많이 써서 그런가 속도가 잘 나오지 않았다. 그렇다고 m을 증가할 때 조건 체크없이 m++한다면 더 오랜 시간이 걸린다. #include int main(void) { int m, n, i, isPrime; scanf("%d %d", &m, &n); while (m 1 && (m == 2 || m % 2))) { for (i=3; i * i < m + 1 && (isPrime = m %..
[C언어] 백준 11653번 소인수분해 앞선 소수 문제들을 풀었다면 무난하게 풀 수 있는 문제이다. Point n
[C언어] 백준 2581번 소수 *혼자 정리하기 위해 쓰는 글이라 가독성 주의 직전 문제를 풀었다면 별 다른 어려움 없이 풀 수 있는 문제였다. 다만 for loop을 어디까지 돌게할지에 따라 실행속도에서 차이가 난다. 메모리 1112KB, 20MS 짝수, 홀수 할 것 없이 2부터 m-1까지 루프를 돈다. #include int main(void) { int m, n, sum = 0, i, min; for (scanf("%d %d", &m, &n); m < n+1; m++) { for (i = 2; i < m && (m % i); i++); if (i == m) { sum += m; if (sum== m) min = m; } } sum ? printf("%d\n%d", sum, min) : printf("-1"); return 0; }..
[C언어] 백준 1978 소수찾기 소수인지 확인해야 할 수를 n이라고 할 때, 2부터 (n-1)까지의 수가 n의 약수인지 아닌지를 %를 통해 확인하면 된다. 풀이1 반복문의 사용이 불가피하다고 생각되어 반복을 조금이라도 줄이려고 3부터 n-1까지 홀수만을 체크했다. n = 1일때는 소수가 아니고 n = 2일때는 소수이고 n > 2일때는 3이상의 홀수의 배수인지를 루프를 통해 체크하는 방식인데, 코드를 가능한 단순화했더니 직관적이지 못하다. 실제로도 코드를 줄이려고 한 후 계속 디버그를 해야했다. #include int main(void) { int N, n, cnt = 0, i, isPrime; scanf("%d", &N); while (N--) { scanf("%d", &n); if (isPrime = n > 1 && (n % 2 ||..