⚙️ 알고리즘/기타 문제 & 풀이 12

[C] 조합, 순열, 중복조합, 중복순열

조합, 순열, 중복조합, 중복순열은 모두 n 개의 item에서 m개를 뽑고자 하는 경우이다. 즉, 4가지 경우 함수의 모양이 조금 다를 뿐 큰 틀은 같다. 조합(combination) : 순서와 상관없다. (0 1 2 와 2 1 0 은 같은 수로 여긴다) 순열(permutation) : 순서에 상관있다. (0 1 2 와 2 1 0 은 다른 수로 여긴다) 중복조합 : 조합이되 중복된 수가 나올 수 있다. 즉, 같은 item을 여러번 뽑을 수 있다. 중복순열: 순열이되 중복된 수가 가능하다. 즉, 같은 item을 여러번 뽑을 수 있다. 문제의 해결 순서 m개를 뽑을 공간을 미리 할당한다. (bucket) m을 뽑을 함수 (pick 함수)의 모양은 ' pick(item 정보, bucket 정보, k(앞으로 뽑..

[C] 퀵정렬을 이용한 몇 번째 작은수

10개의 난수(100보다 작은)를 발생시키고 몇 번째 작은 수를 찾을 것인가를 입력받은 후 그 수를 출력하는 프로그램을 작성하라. 입력 : Enter the number of numbers : 10 몇번째로 작은 수 : 4 출력 : 894 250 65 688 99 966 296 649 455 305 4번째로 작은 수는 296 #include #include #include void init_array(int list[], int n) { srand(time(NULL)); for (int i = 0; i < n; i++) *(list + i) = rand() % 100; } void print_array(int list[], int n) { for (int i = 0; i < n; i++) printf("..

[C] 순환을 이용한 배열에서 최대값 찾기

#include int max(int list[], int low, int high) { //순환 int middle; int max_left, max_right; if (low == high) return list[low]; //절반으로 나눈 끝에 low=high이면 자기 자신 반환 middle = (low + high) / 2; max_left = max(list, low, middle); //중앙에서 왼쪽 부분의 최대값 max_right = max(list, middle + 1, high); //중앙에서 오른쪽 부분의 최대값 return max_left >= max_right ? max_left : max_right; //조건 연산자 사용하여 왼쪽의 최대값과 오른쪽의 최대값을 비교하여 더 큰것을 반..

[C] 사이클 길이(순환)

사이클 길이? 어떤 정수 n이 짝수면 2로 나누고 홀수면 3을 곱한 다음 1을 더한다. 이런 과정을 반복하면서 n=1이 되면 멈춘다. 이 때 1이 나올 때까지 만들어진 수의 개수를 (n과 1 포함) 사이클 길이라고 한다. 입력 : 22 출력 : 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1 사이클 길이는 16 위와 은 수열을 출력하고 사이클 길이를 리턴해주는 함수를 순환을 이용하여 작성하시오. int get_cycle_number(int n) { int cycle_length = 1; printf("%d ", n); //수열을 만들면서 숫자 출력 if (n == 1) return count; else if (n % 2 == 0) //n이 짝수이면 cycle_length+=g..

[C] 하노이탑(the tower of hanoi) 재귀

하노이탑 문제 막대 A, B, C가 있고 막대 A에 아래에서부터 크기가 큰 순서대로 원판이 쌓여있다. 막대 A의 원판들을 막대 C에 옮겨야한다. 이 때 지켜야할 3가지 조건이 있다. 한 번에 하나의 원판만 이동할 수 있다. 맨 위에 있는 원판만 이동할 수 있다. 크기가 작은 원판 위에 큰 원판이 쌓일 수 없다. 중간의 막대를 임시적으로 이용할 수 있으나 이 역시 앞의 조건들을 지켜야 한다. 원판이 3개일 경우 A에서 C로 이동하는 과정을 그림으로 그리면 다음과 같다. 원판의 개수가 n개라고 할 경우, 다음과 같이 단순하게 생각할 수 있다. A에 쌓여있는 위에서부터 n-1개의 원판을 B에 이동하고, 제일 밑에 있는 하나의 원판을 C로 옮긴다. 그리고 다음으로 B에 있던 n-1개의 원판을 C로 옮긴다. 이를..

[C] 문자열을 입력받아 첫 번째로 등장하는 단어 출력

문자열을 입력받아 그 안의 첫 번째 단어를 출력하는 프로그램을 작성하시오. 입력: 123word 출력: word 입력: 123apple45pear 출력: apple #include #define TRUE 1 #define FALSE 0 int main(void) { char str[20]; char word[20]; int i, j = 0; int isFound = FALSE; scanf("%s", str); for (i = 0; str[i] != '\0'; i++) { if ((str[i] >= 'a' && str[i] ='A' && str[i]

[C] 문자열 병합

정렬되어 있는 알파벳(모두 소문자)으로 이루어진 문자열 word1과 문자열 word2을 merge 하여 answer 배열에 넣는 함수 solution을 작성하시오. word1과 word2내에서는 문자 중복이 없으며 word1과 word2간에 중복된 문자는 둘 중 하나만 answer 배열에 넣도록 한다. 입력: abcxy dcz 출력: abcdexyz 입력: abc bcde 출력: abcde #include #include #include char answer[20]; char* solution(char* word1, char* word2) { int i = 0, idx1 = 0, idx2 = 0; //idx1: word1의 인덱스 idx2: word2의 인덱스 // word1이나 word2가 끝날 때까지..

[C] 부분집합 여부 판단

정수 집합 a, b 에 대해서 집합 a 가 집합 b 의 subset 이면 1 아니면 0 을 리턴하는 함수 isSubset 을 정의하라. main 함수에서는 a 를 읽고(크기를 읽은 후 각각의 원소) b 를 같은 방법으로 읽고 a 가 b 의 부분집합이면 1 을 아니면 0 을 출력한다. aSize 와 bSize 는 각각 집합 a 와 b 의 크기이다. 입력 : 2 10 20 3 20 30 10 출력: 집합 A는 집합 B의 부분집합이다 입력 : 2 10 20 3 10 22 33 출력: 집합 A는 집합 B의 부분집합이 아니다 #include #define MAX_SET_SIZE 100 int hasElement(int set[], int size, int element) { int i = 0; for (i = 0..

[C] 3X3 게임판의 Tic-Tac-Toe

Tic-Tac-Toe : 3x3으로 이루어진 게임판에서의 오목게임 O와 X를 번갈아 그리며 가로, 세로, 대각선에서 심볼 3개가 먼저 만들어지면 우승한다. 입력: Tic-Tac-Toe에 입력할 심볼의 좌표값을 번갈아 입력한다. 출력: O 혹은 X가 그려진 게임판이 출력되며 둘 중에 한명이 우승한 경우 누가 우승했는지 출력하고 종료한다. 입력 프롬트 입력값 Player X(행 열): Player O(행 열): Player X(행 열): Player O(행 열): Player X(행 열): 1 1 0 0 0 1 1 0 2 1 입력 프롬트 입력값 Player X(행 열): Player O(행 열): Player X(행 열): Player O(행 열): Player X(행 열): 2 2 1 1 2 1 1 2 2..

반응형