본문 바로가기

backjoon/여러가지8

백준 1427 소트인사이드 c언어 https://www.acmicpc.net/problem/1427 1427번: 소트인사이드 첫째 줄에 정렬하려고 하는 수 N이 주어진다. N은 1,000,000,000보다 작거나 같은 자연수이다. www.acmicpc.net 1. 버블정렬이 생각났지만 비효율적인 정렬 방식이며 qsort정렬도 배웠기 때문에 이걸 이용하기로 결정 2. 기존 내가 알던 qsort정렬은 오름차순만 알고 있었는데 compare함수에 부호만 반대로 하면 내림차순이라 쉽게 만듬 3. 처음 배열을 result[] = {0}; 이렇게 선언하니까 세그먼트 오류가 떴다. 4. 그래서 어차피 숫자가 11자리가 최대이기 떄문에 result[11] = {0}; 로 바꿔 선언해주니 맞게 되었다. 나의코드) #include #include int .. 2023. 2. 3.
백준 1934 최소공배수 c언어 https://www.acmicpc.net/problem/1934 1934번: 최소공배수 두 자연수 A와 B에 대해서, A의 배수이면서 B의 배수인 자연수를 A와 B의 공배수라고 한다. 이런 공배수 중에서 가장 작은 수를 최소공배수라고 한다. 예를 들어, 6과 15의 공배수는 30, 60, 90등이 있 www.acmicpc.net 1. 최소공배수를 구할때 유클리드 호제법을 이용해서 최대공약수를 우선 구해준다. 2. 최소공배수는 숫자1 * 숫자2 를 한값에 최대공약수를 나누어주면 최소공배수가 되는걸 이용해 해결한다. #include intEuclidean(int A, int B) { inttemp; if (A < B) { temp = A; A = B; B = temp; } if (B == 0) return.. 2023. 1. 29.
유클리드 호제법 c언어 구현하기 두 정수의 최대 공약수를 구하는 알고리즘 두 수 중에서 큰 수를 a, 작은 수를 b라고 하고 a를 b로 나눈다. a가 b로 나누어떨어지면 두 수의 최대공약수는 b이다. a가 b로 나누어떨어지지 않으면 a를 b로 나눈 나머지와 b에 대하여 1번부터 다시 반복한다. #include intEuclidean(int a, int b) { if (b == 0) return (a); else return (Euclidean(b, a%b)); } intmain() { inta = 10; intb = 4; printf("%d", Euclidean(10, 4)); return (0); } 10과 4 의 최대 공약수 = 2 가 출력된다. 위의 방법으로 최대 공약수를 구하면 최소공배수 = (a * b) / 최대공약수 2023. 1. 29.
qsort함수 stdlib.h void qsort (void *base, size_t nel, size_t width, int (*compare)(const void *, const void *) base = 정렬하고자 하는 배열의 포인터 nel = 배열의 각 원소들의 총 수 width = 배열에서 원소 하나의 크기 (*compare) = 비교를 수행할 함수 포인터 비교함수는 -1, 0, 1 중 하나 반환해야한다. 오름차순 비교함수만든 예제코드) intcompare(const void *first, const void *second) { if (*(int*)first > *(int*)second) return (1); else if (*(int*)first < *(int*)second) return (-1); else.. 2023. 1. 28.
백준 1037 약수 c언어 https://www.acmicpc.net/problem/1037 1037번: 약수 첫째 줄에 N의 진짜 약수의 개수가 주어진다. 이 개수는 50보다 작거나 같은 자연수이다. 둘째 줄에는 N의 진짜 약수가 주어진다. 1,000,000보다 작거나 같고, 2보다 크거나 같은 자연수이고, 중복되 www.acmicpc.net 1. 약수가 모두 주어졌을때 (최소약수)*(최대약수) = N 이라는 전략을 이용해서 해결한다. 2. 우선 배열이 오름차순으로 정렬시켜야하므로 qsort함수를 이용했다. 3. 정렬된 배열에 최소약수와 최대약수를 곱해 구하고자하는 숫자를 찾는다. 나의코드) #include #include intcompare(const void *first, const void *second) { if (*(i.. 2023. 1. 28.
백준 5086 c언어 https://www.acmicpc.net/problem/5086 5086번: 배수와 약수 각 테스트 케이스마다 첫 번째 숫자가 두 번째 숫자의 약수라면 factor를, 배수라면 multiple을, 둘 다 아니라면 neither를 출력한다. www.acmicpc.net 1. else if 로 A == 0 && B == 0 일때 break ; 라는 조건을 넣어서 런타임 에러가 떴다. 2. 0 0 이 위의 if 조건에 포함될수 있으니까 계속 while문이 돌아가서 런타임 에러가 떴던것이라 생각 3. 다른 if문으로 조건을 다시 넣어서 코드를 짜니 정답이 되었다. 나의답안) #include intmain() { intA, B; while (1) { scanf("%d %d", &A, &B); if (A == 0.. 2023. 1. 27.
백준 2556번 최대값 c언어 https://www.acmicpc.net/problem/2566 2566번: 최댓값 첫째 줄에 최댓값을 출력하고, 둘째 줄에 최댓값이 위치한 행 번호와 열 번호를 빈칸을 사이에 두고 차례로 출력한다. 최댓값이 두 개 이상인 경우 그 중 한 곳의 위치를 출력한다. www.acmicpc.net 전략) 1. 버블정렬이나 다른 정렬을 통해 제일 큰 숫자를 정렬 시키는 방법을 이용할려고 했는데 숫자의 위치를 출력해야되서 쓰지 않았다. 2. 어차피 최대값이 정해져있는 문제이기 때문에 최대값을 이중배열에 하나하나 비교해서 찾아가는 방법을 쓰기로 결정 다른생각) - 만약에 최대값이 정해져 있지 않다면 result[0][0]을 기준으로 계속 비교해가면서 어디 변수에다가 최대값을 비교할때마다 저장해서 최대값을 찾아갔을것.. 2023. 1. 23.
백준 2738번 행렬 덧셈 c언어 https://www.acmicpc.net/problem/2738 2738번: 행렬 덧셈 첫째 줄에 행렬의 크기 N 과 M이 주어진다. 둘째 줄부터 N개의 줄에 행렬 A의 원소 M개가 차례대로 주어진다. 이어서 N개의 줄에 행렬 B의 원소 M개가 차례대로 주어진다. N과 M은 100보다 작거나 같 www.acmicpc.net 1. 이중배열을 두개 만들어서 더하고 싶지 않아서 하나로 만들어서 더하는 방식을 사용했다. 2. 더할때 j + M 을 했는데 결과가 더해지지 않아 생각해보니 i만 + N해줘야된다는 걸 알게되었다. 3. j + M 을 더했을 떄는 j의 값이 이중배열의 가로 범위를 넘는다. 따라서 답이 제대로 나오지 않았다 나의코드) #include intmain() { intN, M; inti, j;.. 2023. 1. 22.
728x90