///////////////// 1157 : 단어 공부 (전지윤)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <ctype.h>
int main()
{
char text[1000003] = ""; // 단어를 입력 받기 위한 객체
scanf("%1000000s", text);
// 처리 : 가장 많이 사용된 알파벳이 무엇인지 알아내야 함.
// 각 알파벳이 몇 개나 사용됐는지 세야 함. => 객체가 필요하다.
int counts[26] = { 0 };
// Index를 알파벳과 대응 => 어떻게 알파벳과 index를 대응시킬지 => 모든 문자를 대문자로 바꿔준다.
// a, A => 0
// b, B => 1
// c, C => 2
// d, D => 3
int maxCount = 0; // 1. 최댓값은 무엇인지?
char maxAlphabet = '\0'; // 2. 그에 대응하는 알파벳은 무엇인지?
const int SPEED_OF_LIGHT = 299792458;
for (int i = 0; text[i] != '\0'; i++) // null문자 전까지만 돌아가도록
{
/const int DIFFERNECE_BETWEEN_UPPER_AND_LOWER = 32;
if (text[i] >= 'a')
{
text[i] -= DIFFERNECE_BETWEEN_UPPER_AND_LOWER;
}/
text[i] = toupper(text[i]);
int alphabetIndex = text[i] - 'A';
counts[alphabetIndex] += 1;
if (counts[alphabetIndex] == maxCount) //최대 알파벳 개수 판단
{
maxAlphabet = '?';
}
else if (counts[alphabetIndex] > maxCount)
{
maxCount = counts[alphabetIndex];
maxAlphabet = text[i];
}
}
// 출력 :
printf("%c", maxAlphabet);
}
///////////////////// 다이얼 : 안중재
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
// 입력 : 알파벳 대문자로 이뤄진 단어
char words[16] = "";
scanf("%s", &words);
// 처리
// 1. 시간을 구하려면 숫자를 알아야 함.
// 2. 숫자를 알려면 알파벳을 대응하는 숫자로 변환.
// WA -> 92 -> 10 + 3 -> 13
// ABC DEF GHI JKL MNO PQRS TUV WXYZ
// 2 3 4 5 6 7 8 9 (0,1은 왜 안눌러요..)
// 1. 알파벳을 대응하는 숫자로 바꾼다.
// 알파벳 변수를 만들고 변수의 순서가 알파벳 순서라 가정, 대응하는 숫자를 입력한다.
// alphabet[0] == A
int alphabetToDigit[26] = {
2,2,2, 3,3,3, 4,4,4, 5,5,5, 6,6,6,
7,7,7,7, 8,8,8, 9,9,9,9
};
// 2. 숫자와 대응하는 시간을 더한다.
int time = 0;
for (int i = 0; words[i] != '\0'; ++i)
{
int digit = alphabetToDigit[words[i] - 'A'];
time += (digit + 1);
}
// 출력 : 그 다이얼을 걸기 위해 필요한 최소 시간
printf("%d", time);
}
@@@@@@@@@@@1@@@@@@@@@@@@
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
void Swap(int a, int b)
{
// a : 0x1234 -> 0xabcd
// b : 0x5678 -> 0x5780
int temp = a;
a = b;
b = temp;
}
int main(void)
{
char input[] = "A bird came down the walk";
// Pointer : 데이터를 메모리 주소값으로 해석
// Type Identifier;
// int p; => pointer to int
int a = 10; // a : 0x1234
int b = 20; // b : 0x5678
// a <-> b
Swap(&a, &b);
printf("%d %d", a, b);
int num = 10;
int p2 = NULL;
int p = #
int* * p3 = &p; // pointer to pointer to int
**p3 = 30;
int p4 = &p3; // pointer to pointer to pointer to int
p4 = 50;
*p = 20;
// 왜? 포인터를 사용해야 하는가
// 메모리에 접근하는 방법은 2가지가 있다.
// 직접 참조(Direct Reference / Direct Access) : 메모리 주소에 직접 접근하는 것
// num = 20;
// 간접 참조(Indirect Reference / Indirect Access) : 메모리 주소를 포인터를 통해서 접근하는 것
// *p = 20;
a;
// Scope : 프로그램이 식별자를 찾을 수 있는 영역
// Block Scope => Local Variable
// File Scope => Global Variable
puts("");
}
@@@@@@@@@@2@@@@@@@@@@
// Pointer Type 크기는 얼마인가?
// Pointer Type : 데이터를 메모리 주소값으로 해석한다.
// x86 : 4byte
// x64 : 8byte
// + - : 메모리 주소를 가리키고 있는 타입의 크기만큼 옮긴다.
// ++ / --
// Address Operation : 주소 연산
int arr[2] = { 10, 20 };
p = arr; // arr의 첫 번째 원소의 주소를 가리키게 된다.
p = p + 1; // &arr[1]
p = p - 1; // &arr[0]
++p;
--p;
p++;
p--;
char* pch; // pointer to character
pch + 1; // 1 바이트만큼 뒤로
pch - 1; // 1 바이트만큼 앞으로
// a[b] => *(a + b);
p = arr;
// 주의 : 역참조 연산자와 증감 연산자를 결합할 때 연산 순서를 유의해야 한다.
int num2 = p++;
num2 = ++p;
num2 = ++(*p);
printf("\n%d", sizeof p);
@@@@@@@@@3@@@@@@@@@
// [1][2][3]
// p
int n = *p++; // n = 1
// *p : 역참조를 한 후
// p++ : 포인터의 주소값을 증가시킨다.
int n = *++p; // n = 3
// ++p : 포인터의 주소값을 증가시킨 후
// *p : 역참조한다.
int n = ++(*p); // n = 4
// *p : 역참조한 후 3
// ++ : 역참조한 값을 증가시킨다.
@@@@@@@@@@4@@@@@@@@@@
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
// return-type identifier(parameter-list) => Header
// complicated statement => Body
// 매개변수(Parameter)
// 함수에서 사용되는 변수. 함수 외부에서 입력값을 받기 위해 사용.
// 함수를 사용한다는 것은 코드를 재사용하기 위함이다.
// 함수를 호출한다. 호출한 사람을 호출자(Caller), 호출된 함수를 피호출자(Callee)
// 호출자에게 내가 계산한 결과를 '반환' 해줄 수 있다.
// 반환은 return문을 사용함. 반환 값은 반환 타입과 일치해야 함.
// 반환해줄 것이 없다면 void 타입을 사용.
int sum(int x, int y)
{
return x + y;
}
void foo()
{
if (1)
{
// 반환 타입이 void인 경우에도 return문을 사용할 수 있으며
// 함수를 중간에 끝낼 때 사용한다.
return;
}
}
// 3개의 입력을 받아 모든 입력값을 더해서 반환하는 함수 sum3()을 만들어라.
int sum3(int x, int y, int z)
{
return x + y + z;
}
// Swap() : 2개의 정수를 받아 서로 데이터를 교환
void Swap(int a, int b)
{
int temp = a;
a = b;
b = temp;
}
// islower() : 한 개의 문자를 받아 소문자인지 판별한다.
int islower(char ch)
{
if ('a' <= ch && ch <= 'z')
{
return 1;
}
else
{
return 0;
}
}
// isupper()
int isupper(char ch)
{
if ('A' <= ch && ch <= 'Z')
{
return 1;
}
else
{
return 0;
}
}
// tolower() / toupper()
char tolower(char ch)
{
if ('A' <= ch && ch <= 'Z')
{
return ch + 32;
}
else
{
return ch;
}
}
char toupper(char ch)
{
if ('a' <= ch && ch <= 'z')
{
return ch - 32;
}
else
{
return ch;
}
}
int main(void)
{
printf("%c\n", tolower('G'));
printf("%c\n", tolower('!'));
printf("%c\n", toupper('a'));
printf("%c\n", toupper('?'));
return 0;
}
@@@@@@5@@@@@@
// strchr() : 문자열에서 특정 문자의 위치를 찾는 것
// 입력 : 문자열(const char), 내가 찾을 문자(const char)
// 처리 : 입력된 문자열에서 그 문자가 나온 위치(메모리 주소)를 찾는다.
// 출력 : 문자의 위치 => 그 문자가 있는 메모리 주소값(char)
// 1. 문자가 있는 경우 => 그 문자의 위치
// 2. 문자가 없는 경우 => NULL
// char* pos = strchr("Hello, 'l');
// "Hello"
// ↑
// 1. 문제 정의 => 입력, 처리, 출력. 문제를 충분히 해결할 수 있을 정도로 계속해서 작은 단위로 쪼개서 생각해야 함.
// 2. 작은 문제로 쪼갰다면 그 문제를 해결할 절차를 기술.
// 3. 문제를 해결하기 위해 어떤 데이터가 필요한가? => 즉, 어떤 데이터를 저장해야 하는가?
char strchr(const char str, const char ch)
{
while (str != '\0')
{
if (str == ch)
{
return (char*)str;
}
++str;
}
return NULL;
}
strcpy()
strcat()
strlen()
strcmp()
strchr()
strrchr()
strstr()