week10 (실습 문제)
2025. 6. 12. 17:23ㆍ프로그래밍1및실습
Quicksort Array
- 사용자로부터 입력받을 숫자들의 수 N을 입력 받고, 다음 행에서 공백으로 구분된 N개의 숫자를 입력받아서 이를 내림차순으로 정렬한 결과를 출력하세요.
- 임의의 N에 대해서 처리 가능하도록 동적 할당을 사용하세요.
- 입력받는 N개의 숫자들은 모두 int 의 범위 내에 존재한다고 가정합니다.
- 정렬할 때는 stdlib.h에 있는 qsort 함수를 활용하세요.
- qsort 함수는 주어진 배열을 오름차순으로 정렬합니다.
- qsort 함수의 원형은 다음과 같습니다.
void qsort( void *ptr, size_t count, size_t size, int (*comp)(const void *, const void *) );
- 위의 함수에서 각 인자들은 다음과 같습니다.
- ptr: 정렬할 array의 첫 번째 요소에 대한 주소(포인터)
- count: 정렬할 요소들의 개수(배열의 크기)
- size: 각 요소들의 크기(byte 단위 크기)
- comp: 2개의 요소들을 비교하는 함수를 가리키는 포인터
비교하는 함수 comp 의 경우 오름차순 정렬을 기준으로, 두 개의 인자로 받은 값에 대해 비교하여 다음과 같이 정수를 return해야 합니다.
첫 번째 요소가 두 번째 요소보다 작은 경우 음수를 반환
첫 번째 요소와 두 번째 요소가 같다면 0을 반환
첫 번째 요소가 두 번째 요소보다 크다면 양수를 반환
입력1
5 97 23 100 38 15
출력1
100 97 38 23 15
정답 코드
#include<stdlib.h> #include<stdio.h> #include<ctype.h> #include<string.h> int comp(const void *a, const void *b) { if (*(int*)a<*(int*)b) return 1; if(*(int*)a==*(int*)b) return 0; return -1; } int main(){ int n; scanf("%d", &n); int *a=(int*)malloc(sizeof(int)*n); for(int i=0;i<n;i++){ scanf("%d", &a[i]); } qsort(a, n, sizeof(int), comp); for(int i=0;i<n;i++){ printf("%d", a[i]); if(i != n - 1) printf(" "); } free(a); }
Transpose Matrix
- 사용자로부터 행렬의 행(N)과 열(M)을 나타내는 자연수 N과 M을 공백으로 구분하여 입력받은 후, 줄 단위로 공백으로 구분된 각 행에 들어갈 원소의 값을 입력받으세요. 그 후 입력받은 행렬에 대해 전치(Transpose)를 수행한 행렬을 한 줄에 한 행씩 각 열을 공백으로 구분하여 출력하세요.
- 임의의 N과 M 값에 대해 동작할 수 있도록 동적 메모리 할당을 사용하세요.
- 각 원소의 값은 int 범위 내에 있는 정수로 입력받는다고 가정합니다.
- 전치연산을 수행하는 코드는 배열을 전달받아 연산하는 별도의 함수를 선언하여 처리하세요.
- 함수의 원형은 수업에서 배운 2차원 배열을 전달하는 방법 중 어떠한 형태를 사용해도 무방합니다.
입력1
2 2 1 2 3 4
출력1
1 3 2 4
입략2
3 2 1 2 3 4 5 6
출력2
1 3 5 2 4 6
정답 코드
#include<stdlib.h> #include<stdio.h> #include<ctype.h> #include<string.h> int main() { int n,m; scanf("%d%d", &n, &m); int **a=(int**)malloc(sizeof(int*)*n); for(int i=0; i<n; i++) { a[i]=(int*)malloc(sizeof(int)*m); } for(int i=0; i<n; i++) { for(int j=0; j<m; j++) { scanf("%d", &a[i][j]); } } for(int i=0; i<m; i++) { for(int j=0; j<n; j++) { printf("%d ", a[j][i]); } printf("\n"); } for(int i=0; i<n; i++) { free(a[i]); } free(a); }
Word Search
- 사용자로부터 단어를 입력받아서 해당 단어가 주어진 파일 내에 존재하는지 확인하여, 그 위치를 출력하세요.
- 대소문자는 구분하지 않습니다.
- 알파벳으로만 구성된 파일들의 예시는 input01.txt, input02.txt, input03.txt에서 확인할 수 있습니다.
- 사용자가 입력한 단어를 주어진 문서에서 찾아주되, 첫 줄에서 첫 글자의 위치, 두 번째 줄에는 마지막 글자의 위치를 출력하세요.
- 위치를 출력할 때의 기준은 2차원 배열에서의 index로 상정합니다.
- 예를 들어 아래의 예제에서 CBA를 검색할 경우에는 시작 위치의 index는 0,2, 끝 위치는 0,0이 됩니다.
ABCD
BCDA
FDAB
EABG
- 위치 출력 시의 각 차원의 값은 쉼표(,)로 구분해주세요.
- 해당 단어가 여러 개 존재할 경우 2차원 행렬 기준으로 행이 가장 0에 가까운 것부터 열이 가장 0에 가까운 것을 찾아서 하나만 출력하세요.
- 단어 내에 포함된 글자 사이의 연결관계는 상/하/좌/우이며, 대각선 방향으로도 연결될 수 있습니다.
- 단, 연결 방향은 탐색 도중에 바뀌지 않습니다.
- 찾는 단어가 파일 내에 존재하지 않을 경우 -1, -1을 출력하세요.
입력1
parallel
출력10,3 0,10
정답 코드#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <math.h> int dx[8] = { -1, -1, -1, 0, 0, 1, 1, 1 }; int dy[8] = { -1, 0, 1, -1, 1, -1, 0, 1 }; int main(int argc, char *argv[]) { FILE *fp; fp = fopen("input1.txt", "r"); if (fp == NULL) { printf("NULL"); return 1; } char d[104][104] = { 0 }; int row = 0, col = 0; while (fgets(d[row], sizeof(d[row]), fp) != NULL) { d[row][strcspn(d[row], "\n")] = '\0'; for (int i = 0; d[row][i]; i++) { d[row][i] = tolower(d[row][i]); } col = strlen(d[row]); row++; } fclose(fp); char line[104]; scanf("%s", line); int len = strlen(line); for (int i = 0; i < len; i++) { line[i] = tolower(line[i]); } for (int x = 0; x < row; x++) { for (int y = 0; y < col; y++) { if (d[x][y] == line[0]) { for (int dir = 0; dir < 8; dir++) { int nx = x, ny = y; int k; for (k = 1; k < len; k++) { nx += dx[dir]; ny += dy[dir]; if (nx < 0 || ny < 0 || nx >= row || ny >= col) break; if (d[nx][ny] != line[k]) break; } if (k == len) { printf("%d,%d\n", x, y); printf("%d,%d\n", nx, ny); return 0; } } } } } printf("-1,-1\n"); return 0; }
Anagram
- Anagram은 단어나 문장을 구성하고 있는 문자의 순서를 바꾸어 다른 단어나 문장을 만드는 것입니다. (예시: heart <=> earth / I am Lord Voldemort <=> Tom Marvolo Riddle) 사용자로부터 문자열을 입력받아서 주어진 사전 내에서 anagram을 이루는 단어가 있는지 확인하여 출력하세요.
- 사전은 repository에 주어진 american-english-large.txt 파일을 읽어서 사용하세요.
- 입력으로는 영문 대소문자로 구성된 한 단어만 들어온다고 가정합니다. (특수문자 및 공백 입력은 없습니다.)
- 매칭 시에 대소문자는 무시하고 처리하세요.
- 사전에서 anagram을 이루는 첫 번째 단어만 모두 소문자로 출력하세요.
- Anagram을 이루는 단어가 없을 경우 -1을 출력해주세요.
ex)
input1.txt
appalachia gaja
입력1
ahalaaicpp
출력1
appalachia
입력2gajae
출력2-1
정답 코드#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> int comp(const void *a, const void *b) { return (*(char *)a - *(char *)b); } int main() { FILE *fp; fp = fopen("input1.txt", "r"); if (fp == NULL) { printf("NULL\n"); return 1; } char c[104], line[104]; fgets(c, sizeof(c), stdin); c[strcspn(c, "\n")] = '\0'; for (int i = 0; i < strlen(c); i++) { c[i] = tolower(c[i]); } int len = strlen(c); qsort(c, len, sizeof(char), comp); while (fgets(line, sizeof(line), fp) != NULL) { line[strcspn(line, "\n")] = '\0'; if (strlen(line) != len) continue; char temp[104]; for (int i = 0; i < len; i++) { temp[i] = tolower(line[i]); } temp[len] = '\0'; qsort(temp, len, sizeof(char), comp); if (strcmp(temp, c) == 0) { for (int i = 0; i < strlen(line); i++) { line[i] = tolower(line[i]); } printf("%s\n", line); fclose(fp); return 0; } } fclose(fp); printf("-1\n"); return 0; }
Sudoku Validator
- 사용자로부터 9x9 크기의 스도쿠 판을 입력받아 아래의 규칙에 어긋난 부분이 없는지 확인하여 올바르게 채워진 경우 true, 규칙에 어긋난 부분이 있는 경우 false를 출력하세요.
- 각 행은 1부터 9까지의 숫자가 중복없이 배치됩니다.
- 각 열에도 1부터 9까지의 숫자가 중복없이 배치됩니다.
- 3x3의 크기로 나누어진 9개의 내부 구획 내에서도 1부터 9까지의 숫자가 중복없이 배치됩니다.
- 각 숫자는 쉼표(,)로 구분합니다.
- 비어있는 칸은 마침표(.)로 나타냅니다.
- 입력으로 주어지는 스도쿠 판은 일부만 채워져 있을 수 있습니다. (비어있는 칸을 추론하여 채우기 위한 충분한 숫자가 채워져 있지 않을 수 있습니다.) 이번 과제에서는 입력으로 주어진 스도쿠 판에서 값이 채워진 곳들만 위의 규칙에 어긋난 부분이 없는지 확인하여 출력하시면 됩니다.
입력1
5,3,.,.,7,.,.,.,. 6,.,.,1,9,5,.,.,. .,9,8,.,.,.,.,6,. 8,.,.,.,6,.,.,.,3 4,.,.,8,.,3,.,.,1 7,.,.,.,2,.,.,.,6 .,6,.,.,.,.,2,8,. .,.,.,4,1,9,.,.,5 .,.,.,.,8,.,.,7,9
출력1
true
입력2
5,3,.,.,7,.,.,.,. 6,.,.,1,9,5,.,.,. .,9,8,.,.,.,.,6,. 8,.,.,.,6,.,.,.,3 4,.,.,8,.,3,.,.,1 7,.,.,.,2,.,.,.,6 .,6,.,.,.,.,2,8,. .,.,.,4,1,9,.,.,5 .,.,.,.,8,.,.,7,3출력2
false
정답 코드#include<stdio.h> #include<stdlib.h> #include<string.h> #include<ctype.h> int d[14][14]={0}; int main(){ for(int i=0;i<9;i++){ char line[24]; scanf("%s", line); char *token=strtok(line, ","); int idx=0; while(token!=NULL){ if(token[0]!='.') d[i][idx]=atoi(token); token=strtok(NULL,","); idx+=1; } } for(int i=0;i<9;i++){ int a[14]={0}; for(int j=0;j<9;j++){ if(a[d[i][j]]&&d[i][j]!=0) { printf("false"); return 0; } a[d[i][j]]+=1; } } for(int i=0;i<9;i++){ int a[14]={0}; for(int j=0;j<9;j++){ if(a[d[j][i]]&&d[j][i]!=0){ printf("false"); return 0; } a[d[j][i]]+=1; } } printf("true"); return 0; }
'프로그래밍1및실습' 카테고리의 다른 글
| naf-알고리즘 (3) | 2025.06.12 |
|---|---|
| week11 (실습 문제) (0) | 2025.06.12 |
| week8 (실습 문제) (0) | 2025.06.01 |
| week7 (실습 문제) (0) | 2025.05.28 |
| week6(실습 문제) (0) | 2025.05.28 |