본문 바로가기
백준

백준 7단계 - 문자열

by 오젼 2021. 1. 29.

1) #11654 아스키코드

ㄱㅊ

c - '0' => 숫자 , 숫자 + '0' => c

 

2) #11720 숫자의 합

ㄱㅊ

문자열로 입력받아 각 문자별로 숫자로 바꿔 sum구하기

 

3) #10809 알파벳 찾기

ㄱㅊ

c - 'a' => 소문자 알파벳 순서

memset(주소, 바꿀 값, 크기) string.h에 포함되어 있음

 

4) #2675 문자열 반복

ㄱㅊ

 

5) #1157 단어 공부

피곤....

실수를 너무 많이함.. 오류케이스: bbaannnnnn

max값 찾을 때 max보다 클 때는 max와 maxi를 갱신시켜주고 max와 같을 때는 무조건 "?"출력하고 return되게 했는데, 이 경우 알파벳 배열상 앞쪽 문자에서 빈도수가 겹치는 경우가 나오고 가장 많이 나온 문자는 그 뒤 쪽 문자이면 올바로 출력 안 되고 ?가 출력되어버림.. 

 

6) #1152 단어의 개 수

scanf("%[^\n]s", str) 공백 포함 입력 받고 싶을 때

흠 근데 이렇게 하면 12ms 나오고 그냥 gets로 받으면 8ms가 나온다. 무슨 차이일까 어쨌든 gets사용이 권장되지 않고 있으니 위 방법대로 하는 쪽으로 연습해야겠다.

 

7) #2908 상수

 

8) #5622 다이얼

각 번호 숫자 다 더하고 각 번호 개수 더하기 --> 각 번호 숫자 + 1씩 매번 더하기

라고 착각했었음~

 

그림 보면 각 숫자 밑에 알파벳 적혀 있는데 해당 알파벳이 저걸 말하는 거였음;; 역시 문제를 잘 읽어야한다...

ABC -> 2, DEF -> 3, GHI -> 4 ...이런식 근데 1을 걸 때 총 2초가 걸리고 1씩 커질 때마다 총 걸리는 시간이 1초씩 늘어난다고 했으니까, 더할 때 ABC -> +3, DEF -> +4, GHI -> +5 ... 이런식으로 해주면 됨.

2가지 방법

1) if, else 문으로 각 알파벳 조건 마다 비교 하는 경우 공간↓ 시간↑

2) alpha[26] 해놓고 각각 총 걸리는 시간으로 초기화 해준 다음 += alpha[c - 'A'] 하는 경우 공간↑ 시간↓

근데 사실 별 차이 없음. 이 경우는 2번이 더 효율적인듯.

 

9) 크로아티아 알파벳

처음: 

#include<stdio.h>
#include<string.h>
int croatia(char* str, int i) {
    if(str[i] == '=') {
        if(str[i - 1] == 'z') {
            if(i >= 2 && str[i - 2] == 'd') return -1;
        }
        return 0;
    }
    else if(str[i] == '-') return 0;
    else if(str[i] == 'j') {
        if(str[i - 1] == 'l' || str[i - 1] == 'n') return 0;
    }
    return 1;
}
int main() {
    char str[101];
    int i, ans = 0;
    scanf("%s", str);
    for(i = 0; i < strlen(str); i++) {
        ans += croatia(str, i);
    }
    printf("%d", ans);
    return 0;
}

수정:

#include<stdio.h>
#include<string.h>
int main() {
    char str[101];
    int i, ans;
    scanf("%s", str);
    ans = strlen(str);
    for(i = 0; i < strlen(str); i++) {
        if(str[i] == '=' || str[i] == '-')
            ans--;
        else if((str[i] == 'l' || str[i] == 'n') && (str[i + 1] == 'j'))
            ans--;
        else if(str[i] == 'd' && str[i + 1] == 'z' && str[i + 2] == '=')
            ans--;
    }
    printf("%d", ans);
    return 0;
}

이 경우는 앞에서부터 비교하는 걸로 해야 범위 초과할 때를 따로 생각하지 않아도 된다. 모든 문자 개수를 그냥 문장 길이로 초기화 하고 그 다음 조건에 맞게 개수를  빼주는 식으로 진행하는 게 훨씬 수월. 'dz='같은 경우 'd'에서 -1을 한 번 해 주고, '='에서 -1을 한 번 해주게 되면 문자 1개로 인식할 수 있다. 조건문이 훨씬 간결해짐.. 

 

10) #1316 그룹 단어 체커

ㄱㅊ

#include<stdio.h>
int isGroup(char* str) {
    int alpha[26] = {0}, tmp;
    while(*str) {
        while(*(str + 1) == *str) {
            str++;
        }
        tmp = *str - 'a';
        if(!alpha[tmp]) alpha[tmp] = 1;
        else return 0;
        str++;
    }
    return 1;
}
int main() {
    int n, i, ans = 0;
    char str[101];
    scanf("%d", &n);
    for(i = 0; i < n; i++) {
        scanf("%s", str);
        ans += isGroup(str);
    }
    printf("%d", ans);
    return 0;
}

배열 하나만 사용하는 방법이 있긴 한데, 이건 그냥 알파벳 배열 하나 더 만들어서 플래그 값으로 사용하는 게 더 효율적인듯.

 

 

 

'백준' 카테고리의 다른 글

백준 6단계 - 함수  (0) 2021.01.27
백준 5단계 - 1차원 배열  (0) 2021.01.26

댓글