관리 메뉴

Storage Gonie

챕터2-4. 자료구조 | 문자열 본문

알고리즘/알고리즘 기초(코드플러스)

챕터2-4. 자료구조 | 문자열

Storage Gonie 2019. 4. 23. 16:03
반응형

문자열

# 문자열

- 문자열은 아스키코드로 저장이 됨.

 

# 아스키코드

- 문자 인코딩 방법

- 문자를 출력해보면 되므로 외울필요가 없다.

- 숫자랑 글자랑 매치되는 테이블이 있어서, 저장할 때 숫자로 저장했다가 출력은 글자로 해주는 것으로 이해하면 됨.

 

@ 예시

- '0' => ASCII코드값 : 48

- 'A' => ASCII코드값 : 65

- 'a' => ASCII코드값 : 97

ASCII코드값 : 48 => '0'

ASCII코드값 : 0 => NULL

printf("%c\n", 65);  // 문자 'A'가 출력됨.
printf("%c\n", 48);  // 문자 '0'이 출력됨.

 

# 알파벳 개수 문제

https://www.acmicpc.net/problem/10808

 

# 알파벳 찾기 문제

https://www.acmicpc.net/problem/10809

 

# 문자열 분석 문제

https://www.acmicpc.net/problem/10820

 

# 단어 길이 재기 문제

https://www.acmicpc.net/problem/2743

- C++의 경우 문자열 배열에서 strlen을 사용하거나, string에서 length나 size를 이용하면 되지만 이것을 사용할 수 없는 경우에는 
   아래와 같이 길이를 잴 수 있다.

char s[100];
int len = 0;

scanf("%s", s);

for (int i = 0; s[i]; i++)       // C언어의 경우 문자열의 끝에 NULL(0)이 들어가므로 이렇게 하면 문자열의 끝에서 중단됨.
    len += 1;
    
printf("%d\n", len);

- strlen을 사용하는 경우 주의할 점이 있다. strlen은 시간복잡도가 O(N)인데 이를 for문 안에 넣어주게되면 
   매번 연산이 되므로 O(N^2)의 복잡도가 되어버린다. 따라서 두 번째 방법대로 해줘야 한다.

char s[100];

// strlen(s) 부분에서 이뤄지는 연산의 시간복잡도가 O(N^2)인 비효율적인 코드
for (int i=0; i < strlen(s); i++){ }

// strlen(s) 부분에서 이뤄지는 연산의 시간복잡도가 O(N)인 효율적인 코드
int lne = strlen(s);
for (int i=0; i < len; i++){ }

- 어떤 사람들은 불안해서 맨 위의 방법처럼 카운트 하는것을 직접 구현하기도 하는데, 
   우리는 string을 자주 사용하기 때문에 s.size()를 사용해줘도 된다. s.size()의 시간복잡도는 O(1)이다.
   (컴파일러를 구현한 사람에 따라 다르겠지만 대게 그렇다.)
   단, for문 안에서 s에 글자를 추가하거나 한다면 size는 실행중에 변동되므로 for문 밖에서 저장하는 위와같은 방법으로 수행해야한다. 

string s;

// s.size() 부분의 시간복잡도가 O(1)인 효율적인 코드
for (int i=0; i < s.size(); i++){ }

 

# ROT13 문제

https://www.acmicpc.net/problem/11655

 

# 문자열 -> 정수

- C++에서는 #include<string> 을 해주면 아래의 함수들을 사용할 수 있다.

- 아래의 함수는 's'tring 'to' '자료형' 형식으로 이름이 붙여져 있다.

- stoi() : string -> int

- stol() : string -> long

- stoll() : string -> long long

- stolf() : string -> float

- stod() : string -> double

- stold() : string -> long double

- stoul() : string -> unsigned long

- stoull() : string -> unsigned long long

string s = "16";
int a;
    
a = stoi(s);        // string -> int
printf("%d", a);

 

# 정수 -> 문자열

- to_string함수를 사용하면된다.

- 각각의 데이터형 마다 구현되어 있기 때문에 to_string() 하나로 통일된다.

- 문자열->정수 변환을 위한 함수와 마찬가지로, 이를 사용하기 위해 C++에서는 #include<string> 을 해주면 된다.

int a = 16;
string s;

s = to_string(a);     int -> string

 

# 네 수 문제

https://www.acmicpc.net/problem/10824

 

# 접미사 배열 문제

- 스트링의 부분문자열은 substr을 이용할 수 있다.

https://www.acmicpc.net/problem/11656

 string s = "abcd";
 
cout << s.substr(1, 3); bcd 출력, 인덱스 1의 위치부터 3개의 문자열을 스트링형으로 반환한다.
반응형
Comments