11654 아스키 코드
#include <stdio.h>
int main()
{
char n;
scanf("%c", &n);
printf("%d", n);
return 0;
}
11720 숫자의 합
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n, result = 0;
scanf("%d", &n);
char* array = (char*)malloc(n * sizeof(char));
scanf("%s", array);
for (int i = 0; i < n; i++) result += array[i] - 48;
printf("%d", result);
return 0;
}
아스키 코드 48부터 숫자가 시작되기 때문에 48을 빼서 숫자를 구한다.
10809 알파벳 찾기
#include <stdio.h>
int main()
{
char input[101];
int alphabet[27];
for (int i = 0; i < 26; i++) alphabet[i] = -1;
scanf("%s", input);
for (int i = 0; i < strlen(input); i++) if (alphabet[input[i]-97] == -1) alphabet[input[i] - 97] = i;
for (int i = 0; i < 26; i++) printf("%d ", alphabet[i]);
return 0;
}
alphabet 배열을 -1로 초기화한다.
단어를 입력받고 반복문을 돌면서 각각의 자리에 저장된 값의 아스키코드에서 97(소문자 a)를 뺀 값의 인덱스에 저장된 값을 확인한다. -1이면 처음 나온 것이므로 i를 저장한다. 처음 등장하는 위치를 출력해야 하므로 if문에서 alphabet[input[i]-97] != -1이라면 이미 등장한 적이 있는 문자라는 뜻이고 이 경우에는 그냥 넘어간다.
alphabet 배열을 출력한다.
2675 문자열 반복
#include <stdio.h>
int main()
{
int n, repeatNumber;
char string[21];
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d %s", &repeatNumber, string);
for (int k = 0; string[k] != '\0'; k++) for (int j = 0; j < repeatNumber; j++) printf("%c", string[k]);
printf("\n");
}
return 0;
}
테스트 케이스를 입력받은 후 케이스 개수만큼 반복문을 돈다.
반복문 내에서 반복 횟수와 단어를 입력받고, 단어의 끝까지 도는 반복문 내에서, 반복횟수만큼 반복문을 돌게 하면서 단어의 문자를 출력한다.
1157 단어 공부
#include <stdio.h>
int main()
{
char a[1000001];
int result[27] = { 0 };
scanf("%s", a);
for (int i = 0; a[i] != '\0'; i++)
{
if (a[i] <= 'Z') result[a[i] - 65]++;
else result[a[i]-97]++;
}
int max = 0, final = 0, count = 0;
for (int i = 0; i < 27; i++)
{
if (result[i] > max)
{
max = result[i];
final = i;
}
}
for (int i = 0; i < 27; i++)
{
if (result[i] == max) count++;
}
if (count > 1) printf("?");
else printf("%c", final + 65);
return 0;
}
result 배열에 문자의 등장횟수를 저장한다. 대문자의 경우에는 A의 아스키코드인 65를 뺀 값으로 인덱스를 정하고, 소문자인 경우에는 a의 아스키코드인 97를 뺀 값으로 인덱스를 정한다.
반복문에서 최댓값과 최댓값을 저장하는 배열의 인덱스를 구하고, 다시 또 다른 반복문을 돌면서 최댓값과 같은 값이 몇 개인지 확인한다.
만약 최댓값과 같은 값이 1보다 많다면(전체 배열을 돌기 때문에 무조건 이 값은 1 이상이 된다.) ?를 출력하고 최댓값이 하나라면 인덱스+65를 문자로 출력한다.
1152 단어의 개수
#include <stdio.h>
#include <string.h>
int main()
{
char input[1000001];
int alphabet[27] = { 0 }, count = 0;
scanf("%[^\n]", input); // 엔터가 나올 때까지 문자열을 입력받음
int len = strlen(input);
if (len == 1 && input[0] == ' ')
{
printf("%d", count);
return 0;
}
for (int i = 0; i < len; i++)
{
if (input[i] == ' ')
{
if (i == 0 || i == len - 1) count--;
count++;
}
}
count++;
printf("%d", count);
return 0;
}
입력된 문자열의 길이가 1이고, 입력된 것이 공백이라면 단어가 아니므로 0을 출력하고 프로그램을 종료한다.
위 상황이 아니라면 반복문을 돈다.
공백을 만난다는 것은 단어 하나가 끝났다는 것이므로 1을 더하는데, 만약 문자열의 시작이 공백으로 시작했거나 문자열의 끝에 공백을 하나 입력했을 경우에는 단어가 아니므로 1을 뺀다.
반복문을 돌고 나서 count에 1을 더하고 결과를 출력한다.
반복문 이후에 1을 더하는 이유는 가장 일반적인 경우인 "c programming"를 보면 된다. 일단 문자열의 길이가 1이 아니므로 if문에 해당하지 않아서 반복문을 돈다. c와 p 사이의 공백을 만났을 때는 if문 내용에 해당하지 않아서 count가 1이 된다. 이후 반복문이 끝나면 단어의 개수로 1이 저장되어 있는 상태이다. 단어는 2개이므로 1을 더해준다.
2908 상수
#include <stdio.h>
int makeNumber(int a)
{
int result = 0;
result += a / 100;
result += ((a % 100) / 10)*10;
result += (a % 10)*100;
return result;
}
int main()
{
int a, b;
scanf("%d %d", &a, &b);
if (makeNumber(a) > makeNumber(b)) printf("%d", makeNumber(a));
else printf("%d", makeNumber(b));
return 0;
}
상수가 읽는 수를 구하는 함수 makeNumber를 선언해 값을 계산한다.
5622 다이얼
#include <stdio.h>
#include <string.h>
int main()
{
char string[16];
scanf("%s", string);
int len = strlen(string);
int result = len;
for (int i = 0; i < len; i++)
{
if (string[i] < 'D') result += 2;
else if (string[i] < 'G') result += 3;
else if (string[i] < 'J') result += 4;
else if (string[i] < 'M') result += 5;
else if (string[i] < 'P') result += 6;
else if (string[i] < 'T') result += 7;
else if (string[i] < 'W') result += 8;
else result += 9;
}
printf("%d\n", result);
return 0;
}
단어의 길이만큼 코드를 반복하고, 조건문에 경계값을 넣어서 result에 값을 더한다.
아쉬운 점이 있는데, 반복문에 들어가는 문자열의 아스키코드를 보면 D는 68, G는 71, J는 74, M은 77,P는 80,T는 84,W는 87이다. P에서 T로 넘어가는 부분을 제외하면 간격이 3으로 일정하다. 이걸 이용하면 더 짧게 코드를 작성할 수 있을 것 같다. 추후에 새로 짜서 업데이트하겠다.
2941 크로아티아 알파벳
#include <stdio.h>
#include <string.h>
int main()
{
char a[333];
int i = 0, count = 0;
scanf("%s", a);
while (i < strlen(a))
{
if (a[i] == 'c')
{
if (a[i + 1] == '=' || a[i + 1] == '-') i += 1;
}
else if (a[i] == 'd')
{
if (a[i + 1] == 'z' && a[i + 2] == '=') i += 2;
else if (a[i + 1] == '-') i += 1;
}
else if (a[i] == 'l' || a[i] == 'n')
{
if (a[i + 1] == 'j') i += 1;
}
else if (a[i] = 's' || a[i] == 'z')
{
if (a[i + 1] == '=') i += 1;
}
i++;
count++;
}
printf("%d", count);
return 0;
}
길이만큼 반복하는데, 조건문에 해당하면 크로아티아 알파벳을 표현한 것이다.
c=, c-를 첫 번째 if문에서 확인하고 있다. c=, c-인 경우에는 c와 =, -라는 두 개의 문자가 하나의 알파벳을 뜻하므로 1을 더해서 =나 - 이후의 문자들을 확인하게 한다. else if문과 if문과 유사하게 코드를 작성했다.
1316 그룹 단어 체커
#include <stdio.h>
#include <string.h>
int checkWord(char a[]);
int main()
{
int n, count = 0;
char word[101];
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%s", word);
count += checkWord(word);
}
printf("%d", count);
return 0;
}
int checkWord(char a[])
{
int i,j;
for (i = 0; i < strlen(a); i++)
{
for (j = 1; j < strlen(a); j++)
{
if (a[i] == a[j] && j - i > 1)
{
if (a[i] != a[j - 1]) return 0;
}
}
}
return 1;
}
메인 함수에서는 단어의 개수를 입력받고 개수만큼 반복문을 돈다. 반복문 내에서 단어를 입력받고, checkWord 함수를통해 그룹단어인지를 반환한 값을 결과에 더해나간다.
checkWord 함수는 단어의 길이만큼 반복문을 돌고, 그 반복문 내에서 한 번 더 반복문을 돈다. 안쪽 반복문에서는 if문으로 그룹단어인지를 확인한다. 문자가 같으면서 연속하지 않은 경우, a[i]와 a[j] 사이의 문자를 확인한다. 만약 a[j-1]가 a[j]와 다르면 그룹단어가 아니므로 바로 0을 반환한다. return 0을 만나지 않은 경우는 그룹단어이기 때문에 1을 반환한다.
'PS (C, C++)' 카테고리의 다른 글
[백준/C] 1010 다리놓기 (0) | 2022.08.20 |
---|---|
[백준/C] 1924 2007년 (0) | 2022.08.20 |
[백준/C] 함수 (0) | 2022.08.20 |
[백준/C] 1차원 배열 (0) | 2022.08.20 |
[백준/C] 반복문 (0) | 2022.08.20 |