본문 바로가기
지난 학기들의 기록/C 기초

[C실습] BOJ/10809 + 문자열과 포인터 예제

by 아메리카노와떡볶이 2020. 6. 14.
728x90

  문자열과 포인터를 공부하고 있어서 백준 예제 문제와 실습문제로 주어진 문제 몇가지들을 풀어보았습니다.

배열과 문자열을 포인터를 활용하여 접근하면 call by reference 이기때문에, call by value와 다르게 활용할수있는 방법이 많았습니다. 꾸준히 연습해서 자유자재로 다룰 수 있도록 연습할 것 입니다.

 

https://www.acmicpc.net/problem/10809

 

10809번: 알파벳 찾기

각각의 알파벳에 대해서, a가 처음 등장하는 위치, b가 처음 등장하는 위치, ... z가 처음 등장하는 위치를 공백으로 구분해서 출력한다. 만약, 어떤 알파벳이 단어에 포함되어 있지 않다면 -1을 출

www.acmicpc.net

#pragma warning(disable:4996)
#include <stdio.h>
#include <string.h>
/* BOJ 10809 */

int main() {
char str[100];
int len;
char ch = 'a';
scanf("%s", str);
    len = strlen(str);
char* p;
int cnt = 0;
p = str;
for(ch='a';ch<='z';ch++){
cnt = 0;
for(p=str;p<str+len;p++){

if (*p == ch) {
printf("%d ", p - str);
cnt++;
break;
}
}
if (cnt == 0) printf("-1 ");

}
return 0;
}

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#pragma warning(disable:4996)
#include <stdio.h>
#include <string.h>
/* 문자열 1번 포인터로 풀어보기*/
int main() {
    char s1[30]=" ";
    char s2[30]=" ";
    int len1=0, len2 = 0;
    int max_len = 0;
    int* p=NULL;
    char* ps1, * ps2;
 
    scanf("%s", s1);
    scanf("%s", s2);
     len1 = strlen(s1);
    len2 = strlen(s2);
    
    if (len1 > len2) max_len = len1;
    else max_len = len2;
 
    ps1 = s1;
    ps2 = s2;
    int i = 0;
 
    for (i=0; i < max_len; i++) {
 
        if (*(ps1+i) == *(ps2+i)) printf("O");
        else printf("X");
    }
        return 0;
 
}
cs

 

문제를 그냥 읽으면 맨 앞글자와 나머지 문자들을 분리해서 이동시키는 작업을 N번 하는것을 구현하는것처럼 보이지만

쉽게 생각해서 그냥 정렬하는 문제입니다. 

정렬알고리즘에서 원래 문자열의 길이만큼 행하는 횟수를 사용자로 부터 입력받는것입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#pragma warning(disable:4996)
#include <stdio.h>
#include <string.h>
/* 문자열 2번 함수로 구현하기*/
void changestr(char* p, int len);
int main() {
    char s[30]="";
    int N;
    int len;
    scanf("%s", s);
    scanf("%d"&N);
    len = strlen(s);
    for (int i = 0; i < N; i++) {
        changestr(s, len);
    }
    printf("%s", s);
        return 0;
 
}
//simpson ==> changestr ==> impsons
void changestr(char * p,int len)
{
 
    for (int i = 0; i < len-1; i++) {
 
        char temp = *p;
        *= *(p + 1);
        * (p + 1)=temp;
        p++;
    }
    
}
cs

 

N개의 정수를 두 번 입력받아 (N ≤ 20), 역방향으로 더하여 출력하는 프로그램을 작성하시오.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#pragma warning(disable:4996)
#include <stdio.h>
addArray(int* a, int* b, int* c, int n);
int main() {
    int N;
    int Num[3];
    int Num2[3];
    int sum_Num[3= { 0 };
    int* a, * b, * c,*p1;
    scanf("%d"&N);
    for (a = Num; a < Num + N; a++) {
        scanf("%d", a);
    }
    for (b = Num2; b < Num2 + N; b++) {
        scanf("%d", b);
    }
    c = sum_Num;
    addArray(Num, Num2, sum_Num,N);
 
    for (p1=c;p1<c+N;p1++){
        printf("%d ",*p1);
    }
    return 0;
}
 
addArray(int* a, int* b, int* c, int n)
{
    int* p;
 
    for (p = c; p < c + n; p++) {
 
        *= *+ *(b+n-1);
        a++;
        b--;
 
    }
}
cs

 

 

728x90

댓글