목록C (37)
궤도
문제 풀이 원소가 3개니까 원소가 {1개, 2개, 3개}인 부분 집합에 대해 각각 계산을 하면 된다. 원소가 3개라서 그냥 대충대충 작성했는데 원소가 이것보다 많아지면 백트래킹으로 원소를 뽑아서 계산하는 함수를 만들어야겠다. 평범하게 노가다 한 코드라 보는데 어려움은 없을 것이다. 소스코드 #include int main() { int arr[3]; int k, cnt = 0; for (int i = 0; i < 3; i++) scanf_s("%d", &arr[i]); scanf_s("%d", &k); for (int i = 0; i < 3; i++) { if (arr[i] == k) cnt++; } for (int i = 0; i < 2; i++) { for (int j = i + 1; j < 3; j..
문제 풀이 뭐 이딴 문제가 있지 싶었던 문제였다. 문자열로 받는 척하지만 전부다 int로 바꿔서 쓰고 출력도 좀 깔끔하지 못하다. 세상에 이런 문제가 있을 수도 있다는걸 깨닫기 위해 적는다. 소스코드 #define _CRT_SECURE_NO_WARNINGS #include int main() { char input; int y[2], m[2], d[2]; int index = 0, back; char s; while (true) { scanf("%c", &input); if (index
문제 풀이 반올림과 버림을 하는 문제이다. 그냥 원래 수에서 아래 2자리를 잘라두고, 잘라둔 수가 50이상이면 올려주고 아니면 그대로 두면 된다. 자릿수별로 숫자를 자르는 문제를 많이 풀었다면 어려움이 없을 것이다. 소스코드 #include int main() { int n; int arr[100]; scanf_s("%d", &n); for (int i = 0; i 4) printf("%d %d\n", arr[i] + 100, arr[i]); else ..
문제 풀이 어렵다. 큐를 이용하라는데 c++도 아닌 마당에 큐를 하나하나 구현하고 싶진 않아서 그냥 내맘대로 구현했다. 그리고 이게 더 편한 것 같다. 큐로 구현하려면 내가 쓴 논리 구조랑 아주 다른 방법으로 해야할 듯하다. factory 구조체를 만들었다. 이 구조체에는 공정별 소요 시간과 선행되어야 하는 공정이 있는지 있다면 그 선행 공정의 개수와 그 종류를 저장하고 마지막으로 해당 공정이 완료된 공정인지 확인하는 bool 변수를 넣었다. 먼저 공정별 소요 시간을 저장하며 선행 공정의 수인 b_num을 0으로 초기화 하고 isDone도 false로 초기화한다. 그리고 나서 선행공정의 관계를 입력받아 저장한다. 이 부분 코드가 좀 복잡해보일 수 있지만 어려운 부분은 아니다. 마지막으로 목표 공정 번호를..
문제 풀이 모든 경우의 수를 다 따져야 한다. 일단 P는 아무리 커봤자 N, M 중 작은 것보다 커질 수 없으니 N, M 중 작은 것을 찾는다. 이게 그 경우의 수들이다. 1. N이 P로 나누어 떨어짐 1. (M-2)가 P로 나누어 떨어짐 2. (M-1)이 P로 나누어 떨어짐 && (N-2)가 P로 나누어 떨어짐 2. (N-1)이 P로 나누어 떨어짐 1. (M-1)이 P로 나누어 떨어짐 2. (M-2)가 P로 나누어 떨어짐 && M이 P로 나누어 떨어짐 3. (N-2)가 P로 나누어 떨어짐 1. M이 P로 나누어 떨어짐 이걸 전부 떠올린다면 조건에 맞춰 코드를 작성하면 끝이니 쉽겠지만, 이걸 이렇게 전부 떠올리는게 힘들어서 문제다. 소스코드 #define _CRT_SECURE_NO_WARNINGS #in..
문제 풀이 9개의 숫자 중 합쳐서 100이 되는 7개의 숫자를 찾는 문제이다. 달리 말하면 해당 숫자를 뺀 총합이 100이 되는 숫자 2개를 찾는 문제다. 일단 9개 숫자의 총합을 구하고 그 결과에서 100을 뺀다. 그 결과를 n이라고 치면, 이제 합쳐서 n이 되는 숫자 2개를 찾으면 된다. 숫자가 여러개였으면 백트래킹을 사용했겠지만, 2개라서 그냥 for loop 2개로 했다. 찾은 즉시 break로 빠져나오고 남은 수를 출력한다. 소스코드 #define _CRT_SECURE_NO_WARNINGS #include int main() { int arr[9]; int obj_num = 0; int x, y; for (int i = 0; i < 9; i++) { scanf("%d", &arr[i]); obj..
문제 풀이 하나의 문자열을 다른 문자열로 바꾼다고 생각하지 말고, 두 문자열을 모두 제 3의 문자열로 바꿔버린다고 생각하면 쉬워진다. 제 3의 문자열은 바로 알파벳을 사전순으로 정렬한 모습이다. sort_arr 함수에서 각각의 문자열을 사전순으로 정렬한다. 각각의 문자열에 대문자가 있기도 하니 일단 대문자들을 전부 소문자로 바꿔준다. 아스키 코드를 참고했다. 가공을 끝낸 뒤 삽입 정렬을 했다. 왜 맨날 삽입 정렬만 하냐면 유일하게 외운 정렬 코드가 저거라서... 마지막으로 사전순 정렬한 각 문자열을 서로 비교해주면 끝난다. 소스코드 #define _CRT_SECURE_NO_WARNINGS #include #include void sort_arr(char* str, int length) { for (int..
문제 풀이 이 문제로 글을 쓰는 이유는 단순히 이게 문자열 문제이기 때문이다. 문자열은 아직도 괜히 어려운 느낌이 없잖아 있다. 어려운 문제는 아니다. 그냥 input을 받을 배열과 메모를 저장할 배열 2개를 만들고, input의 문자를 하나하나 탐색하다가 하이픈(-)을 발견하면 그 다음 문자를 메모 배열에 넣어주면 된다. 소스코드 #define _CRT_SECURE_NO_WARNINGS #include #include int main() { char input[101]; char arr[101]; int cnt = 0; scanf("%s", &input); int length = strlen(input); arr[cnt++] = input[0]; //첫 단어 넣고 for (int i = 1; i < l..