코딩해요/C

[백준/C언어] 문자열 문제풀이

yenas0 2023. 8. 8. 15:52
반응형

 

#27866번 : 문자와 문자열

 

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
    char* words;
    words = (char*)malloc(1000 * sizeof(char));
 
    if (words == NULL)
    {
        printf("메모리 할당 오류");
        exit(1);
    }
 
    scanf("%s", words);
 
    int i;
    scanf("%d"&i);
 
    printf("%c", words[i - 1]);
 
    return 0;
}
cs

 

이 문제 두번이나 런타임 오류 (double free) 오류가 발생했다.

마지막에 return 앞에 동적메모리 해제하려고 free함수를 썻는데 double free라고 한다.. 왜그런지 열심히 찾아봤는데도 모르겠음..~

 

 

 

 

 

 

 

 

 

#2743번 : 단어 길이 재기

 

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
    char words[100];
 
    scanf("%s", words);
 
    int count = 0;
    for (int i = 0; i < 100; i++)
    {
        if (words[i] != NULL)
            count++;
        else
            break;
    }
 
    printf("%d", count);
    return 0;
}
cs

 

strlen 사용해서 하면 한줄이면 끝나긴 할텐데 그냥 for문 사용해서 풀어보았다.

배열의 마지막 값이 나올 때까지 count값을 증가시켜 문자열의 길이를 계산했다.

 

 

 

 

 

 

 

 

 

#9086번 : 문자열

 

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
    int T;
    scanf("%d"&T);
 
    char words[10][1000];
 
    for (int i = 0; i < T; i++)
    {
        scanf("%s", words[i]);
    }
 
    for (int i = 0; i < T; i++)
    {
        printf("%c%c\n", words[i][0], words[i][strlen(words[i]) - 1]);
    }
 
    return 0;
}
cs

 

2차원 배열 사용해서 여러개의 문자열을 받은 후에 각 문자열의 첫글자랑 마지막글자를 출력했다.

대충 이런 느낌.. 저 한칸에 들어가는 문자열은 1000글자까지 들어가는 것임.

 

 

 

 

 

 

 

 

 

 

#11654번 : 아스키 코드

 

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
    char c;
 
    scanf("%c"&c);
    printf("%d", c);
 
    return 0;
}
cs

 

 

 

 

 

 

 

 

 

 

#11720번 : 숫자의 합

 

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
    int N;
    char words[100];
 
    scanf("%d"&N);
    scanf("%s", words);
 
    int hap = 0;
 
    for (int i = 0; i < N; i++)
    {
        hap += words[i] - '0';
    }
 
    printf("%d", hap);
 
    return 0;
}
cs

 

문자열에 숫자를 저장할 때 int로 저장한게 아니라 char로 넣었기 때문에 그냥 합을 계산하면 아스키코드값이 계산된다.

그래서 0의 아스키 코드값 48을 빼서 실제 숫자값과 동일하게 계산하도록 for문을 작성한다.

 

 

 

 

 

 

 

 

 

 

 

#10809번 : 알파벳 찾기

 

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main(void)
{
    char str[100];
    int alp[26];
    
    scanf("%s", str);
 
    for (int i = 0; i < 26; i++)
    {
        alp[i] = -1;
    }
 
    for (int i = 0; i < strlen(str); i++)
    {
        if (alp[str[i] - 'a'== -1)
        {
            alp[str[i] - 'a'= i;
        }
    }
 
    for (int i = 0; i < 26; i++)
    {
        printf("%d ", alp[i]);
    }
 
 
    return 0;
}
cs

 

먼저 알파벳이 26개니까 크기가 26인 배열을 만들고 모든 값에 -1을 입력해둔다.

현재 문자에서 알파벳 'a'의 아스키 코드값을 빼서 alp의 인덱스 값을 계산하고 i값을 alp에 대입한다.

이때 for문을 사용해서 문자가 시작하는 곳을 찾을 건데 맨 처음에 나온 위치를 입력해야되기 때문에 중복을 막아야한다.

==> if문을 사용해서 alp배열의 값이 -1일 때만 변경하도록 한다.

 

반응형