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 |
댓글