목록C언어 (9)
언유상씨의 건전한 취미생활

소스코드는 다음과 같다. 크게 중요한 부분은 다음과 같다. 1. 입력 받기 과제 제출 기한 후 교내 커뮤니티에 올라온 내용을 보면 입력 받는게 가장 여려웠다는 말이 많았다. insert a b를 어떻게 받고, 어떻게 처리할 것인가? 방법은 scanf의 특성을 이용해서 입력을 받으면 된다. scanf는 " "를 기준으로 끊기에, insert a b는 각각 "insert", "a", "b"로 입력되게 된다. 이를 이용하면, scanf("%s", &order); if (strcmp(order, "insert") == 0) // strcmp 함수를 이용해서 원하는 명령인지를 판별한다. scanf("%d %d", &index, &data); // index와 data를 받아준다. 2. 원소 추가, 삭제 단일 연결..

문제 이름 : 소수 찾기 문제 번호 : 1978 사용 언어 : C 문제 유형 : 완전 탐색 문제는 다음과 같다. 빈 배열을 만든 뒤 제시된 원소를 넣고 소수의 개수를 세면 된다. 이때 소수를 판별하는 방법으로는 두가지 방법을 같이 쓸 것이다. 1. 숫자가 2 또는 3인가? 2. 숫자 보다 작은 수들중 나눈 값의 나머지가 0인 수가 있는가? 2번 조건을 조금만 더 생각해보면 다음과 같은 결론에 도달할 수 있다. 소수가 아닌수는, 제곱근의 값을 중심으로 앞 뒤에 나누는 수가 존재한다는 것. 예를 들어보면 다음과 같다. 36 의 약수 - 1 2 3 4 6 9 12 18 36 제곱근인 6을 전후의 값을 곱한다는 것을 알 수 있다. 따라서 1부터 제곱근 값 사이에서 원래 수를 나눌 수 있는 수가 없다면, 그 수는..

문제 이름 : 홀수 문제 번호 : 2576 사용 언어 : C 문제 유형 : 완전탐색 문제는 다음과 같다. 입력값들을 전부 배열에 담아서, 배열의 원소를 완전 탐색하며 문제를 해결하면 된다. 코드는 다음과 같다. #include int main() { int arr[7]; int sum = 0, min =100; for (int i = 0; i

문제 이름 : 더하기 사이클 문제 번호 : 1110 사용 언어 : C 문제 유형 : 구현 문제는 다음과 같다. 십의 자리와 일의 자리를 분리하는 부분만 신경쓴다면 상대적으로 간단한 문제다. 평소에 잘 쓰이지 않는 do - while 문을 사용해서 코드를 작성해 보았는데, 충분히 다른 방식으로도 짤 수 있을것이다. 코드는 다음과 같다. #define _CRT_SECURE_NO_WARNINGS #include int main() { int n; int l1, l2, r2; int cnt = 0; scanf("%d", &n); int k = n; do{ l1 = n / 10; // 앞자리 계산 l2 = n % 10; // 뒷자리 계산 r2 = (l1 + l2) % 10; n = (l2 * 10) + r2; c..

문제 이름 : 저항 문제 번호 : 1076 사용 언어 : C 문제 유형 : 구현 문제는 다음과 같다. 이 문제의 핵심 아이디어는 각 입력값을 문제가 원하는 대로 처리하기 위해 배열과, 조건문을 사용한다는 것이다. n이라는 변수가 들어온다고 했을때, 첫 번째로 입력받는 값은 10의 자리숫자이고, 두번째로 받은 숫자는 일의 자리 숫자이므로 조건문을 통해 몇번째로 들어온 숫자인지 확인하고, 그에 맞는 값을 이용하면 된다. 마지막에 곱해줘야 하는 값은 배열을 통해 인덱스로 접근한다. 따라서 코드는 다음과 같다. #define _CRT_SECURE_NO_WARNINGS #include #include int main() { int gb[11] = { 1, 10, 100, 1000, 10000, 100000, 10..

문제 이름 : 방 번호 문제 번호 : 1475 사용 언어 : C 문제 유형 : 구현 문제는 다음과 같다. 이 문제에서의 핵심 아이디어는, 6과 9는 서로 뒤집어서 사용할 수 있다는 것이다. 6과 9의 개수에 +1 을 하여 반으로 나누어 주면, 그것이 6, 9를 이용할때 필요한 세트수이다. 나머지 숫자들은 서로 뒤집어서 사용할 수 없으므로 숫자의 개수 = 필요한 세트수 가 된다. 이들중 가장 큰 세트 수를 구하면 된다. 따라서 다음과 같은 코드가 나온다. #include int main() { int n, arr[10] = { 0, }; scanf("%d", &n); while (n != 0) { arr[n % 10]++; n /= 10; } int temp = (arr[6] + arr[9] + 1) / ..

문제 이름 : 앵그리 창영 문제 번호 : 3034 사용 언어 : C 문제 유형 : 구현 문제는 다음과 같다. 문제를 풀어보도록 하자. 이번 문제 풀이에서 중요한 아이디어는, 상자 바닥에 대각선으로 들어가도 인정해 준다는 것이다. 계산을 쉽게하기 위해 math.h의 sqrt() 함수를 사용하도록 하자.(제곱근값을 반환하는 함수이다.) 따라서 다음과 같은 코드가 나온다. #define _CRT_SECURE_NO_WARNINGS #include #include int main() { int n, w, h, s; scanf("%d", &n); scanf("%d", &w); scanf("%d", &h); for (int i = 0; i < n; i++){ scanf("%d", &s); if (s

문제 이름 : 색종이 문제 번호 : 2563 사용 언어 : C 문제 유형 : 구현 문제는 다음과 같다. 문제를 풀어보도록 하자. 이 문제를 풀 때 있어서의 핵심 아이디어는, 0으로 꽉 채운 배열에 색종이가 올려진 부분들을 1로 바꾸어 준뒤 1의 개수를 세면 된다! 따라서 코드는 다음과 같다. #define _CRT_SECURE_NO_WARNINGS #include int main() { int pan[100][100] = { 0, }; #0으로 채워진 2차원 배열 int n, r, h; int cnt = 0; scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%d %d", &r, &h); for (int m = 100 - (h + 10);..