스터디 그룹/ProjectH4C

ProjectH4C 2개월 3주차 과제 (포인터 5문제)

문제 풀기에 앞서, 풀 문제들에 대하여 알아보자.

코드업에 포인터를 검색했을 때 나오는 문제이다. 저 문제들을 풀고 더 문제를 찾아보도록 하자.

 

성공률이 높은 부분 문자열을 먼저 풀어보자.


📒부분문자열 (코드업, 1810)

입력

첫째 줄에 1개의 문자열이 입력된다. 문자열의 최대 길이는 100미만이다.

둘째 줄에 부분문자열의 시작위치 a와 끝위치 b가 정수로 입력된다. (단 0<=a<b<100)

출력

입력받은 문자열에서 a번째 문자부터 b번째 문자까지를 출력한다.

 

문제 조건이 있다. 배열을 절대 사용하지 못한다는 것이다.

그러면 우리는 포인터로 풀기로 하자.

 

먼저 힌트는 배열대신 동적메모리 할당법을 사용하라는 것이다.

매우 이지하다.

 

#include <stdio.h>
#include <stdlib.h>

int main(){
    char *string;
    int a,b;

    string = malloc(sizeof(char)*100);

    scanf("%s", string);
    scanf("%d %d", &a, &b);
    for(int i = a-1; i<=b-1; i++){
        printf("%c", *(string+i));
    }
    return 0;
}

📒swap함수 만들기 (코드업, 1581)

이 문제는 조건들이 굉장히 많다. 그러므로 좀 더 자세히 보자.

조건이 되게 복잡하게 생긴 것 같은데 그냥 포인터랑 함수로 만들어보자. void로 만들어줘야 할 것 같다.

void myswap(int *a, int *b) {
	int temp;
    if (*a > * b) {
		temp = *a;
		*a = *b;
		*b = temp;
	}
}

쉬웠다.


📒(코드업, 1581)

이전에 풀었던 문제인데 포인터로 한 번 더 풀어보자. (malloc활용)

 

#include <stdio.h>
#include <stdlib.h>

int main(){
    char *string = malloc(sizeof(char)*50);
    scanf("%s", string);
    printf("%s", string);
    free(string);
    return 0;
}

📒알파벳 찾기 (백준, 10809)

음 ..................  뭐 문자열은 arr (array)에 알파벳은 al(alphabet) 에 저장하면 될 것 같다.

#include <stdio.h>
#include <string.h>

int main() {
	char arr[100];
	char al[26];
	char *ptrarr = arr;
	char *ptral = al;
	int x;

	scanf("%s", arr);

	for (int i = 0; i < 26; i++) {
		*(ptrarr+i) = -1;
	}
	for (int i = 'a'; i <= 'z'; i++) {
		for (int j = 0; j < strlen(arr); j++) {
			if (*(ptrarr+j) == i) {
				x = *(ptral + j) - 'a';
				*(ptral+x) = j;
				break;
			}
		}
	}
	for (int i = 0; i < 26; i++) {
		printf("%d ", *(ptral+i));
	}
	return 0;
}

나름대로 쉬운 문제였다.


📒제로(백준, 19773)

 

딱 봐도 그냥 동적할당에 관한 문제이다. 무엇보다 동적할당은 메모리를 엄청 효율적으로 사용할 수 있어서 좋은 것 같다.

(그래서 linked list도 포인터로 주로 구현하는 것 같다.)

 

#include <stdio.h>
#include <stdlib.h>

int main(){
	int hap = 0;
	int size;
	int start = 0;

	scanf("%d", &size);
	int *array = malloc(sizeof(int) * size);

	for (int i = 0; i < size; i++){
        int num;
		scanf("%d", &num);
		if (num != 0)
			array[start++] = num;
		else
			start--;
	}

	for (int i = 0; i < start; i++){
		hap += array[i];
	}

	printf("%d", hap);
    free(array);
	return 0;
}

 


📒끝, 후기

printf 함수에서는 변수 자체를 그냥 쓰지만 왜 scanf 함수에서는 &num 와 같은 형태로 메모리 주소를 알아내는지 궁금하다.

 

더욱 공부해보자.