[C++] String 클래스

출처

string class

Header :


.assign : 문자열을 할당

( 문자열 ) : 문자열을 할당한다.

( 개수, 문자 ) : 문자를 개수만큼 할당한다

( 문자열, 시작위치, 개수 ) : 매개변수 문자열의 시작위치부터 개수만큼을 호출한 문자열에 할당

1
2
3
4
string s1, s2, s3 ;
s1.assign( "ABCDEFG" ) ; // s1 = "ABCDEFG"
s2.assign( 3, 'a' ) ; // s2 = "aaa"
s3.assign( s, 2, 4 ) ; // s3 = "CDEF" ( 문자열 s의 2부터 4개를 복사하여 할당 )

.append : +연산자의 역할처럼 문자열을 끝에 더한다.

( 문자열 ) : 문자열을 더한다

( 개수, 문자 ) : 문자를 개수만큼 끝에 더한다

( 문자열, 시작위치, 개수 ) :

1
2
3
4
5
string s, s2 ;
s.append( "ABCDEF" ) ; // s = "ABCDEF"
s.append( 3, 'x' ) ; // s = "ABCDEFxxx"
s2.append( s, 2, 4 ) ; // s2 = "CDEF"
s2 += "x" ; // s2 = "CDEFx"

.clear : 문자열의 내용을 모두 삭제

1
s.clear() ;

.compare : 문자열을 비교 ( 사전순으로 비교 )

1
s.compare( s2 ) ;  // s == s2이면 0,  s<s2이면 음수,  s>s2이면 양수를 반환

.empty : 문자열이 비었는지 확인

1
s.empty() ;

.erase : 문자열을 지운다

( 시작위치, 개수 ) : 시작위치부터 개수만큼의 문자를 지운다.

1
2
string s = "ABCDEF" ;
s.erase( 0, 3 ) ; // s = "DEF" ( 인덱스 0부터 3개의 문자를 지운다 )

.find : 특정 문자열을 찾고, 그 시작위치를 반환

( 문자 ) : 인덱스 0부터 해당 문자를 찾고, 시작위치를 반환한다.

( 문자열 ) : 인덱스 0부터 해당 문자열을 찾고, 그 시작위치를 반환한다.

( 문자열, 시작위치 ) : 시작위치부터 문자열을 찾고, 시작위치를 반환한다.

1
2
3
4
5
6
string s1 = "abcd" ;
string s2 = "b" ;
**int** location = s1.find( s2 ) ;
location = s1.find( s2, x ) ;
location = s1.find_first_of( s2, x ) ;
location = s1.find_first_not_of( s2, x ) ; location = s1.find_last_of s1.find_last_not_of

.replace : 문자열을 대체

( 시작위치, 개수, 문자열 ) : 호출한 문자열의 시작위치부터 개수만큼의 문자를 매개변수 문자열로 대체한다.

1
2
   string s = "abc_def" ;
s.replace( 4, 3, "zzz" ) ; // s = "abc_zzz" ( 인덱스 4부터 3개의 문자를 "zzz"로 대체 )

.insert : 문자열을 지정한 위치에 삽입

( 시작위치, 문자열 ) : 시작위치에 문자열을 삽입한다.

string s = “ABCDEF” ; s.insert( 2, “xx” ) ; // s = “ABxxCDEF”

.pop_back : 문자열에서 가장 뒤의 문자 하나를 빼낸다.

.push_back : 문자열의 가장 뒤에 문자 하나를 추가한다.

string s = “ABCDEF” ; s.pop_back() ; // s = “ABCDE” s.push_back( ‘x’ ) ; // s = “ABCDEx”

.resize : 문자열의 크기를 재설정

s

.size, .length : 문자열의 크기를 반환

.max_size : 문자열이 최대로 가질수 있는 길이를 반환한다.

string s = “ABCDEF” ; int size = s.size() ; // size = 6 ( 실제 사용되고 있는 크기 ) int length = s.length() ; // length = 6 ( 문자열의 길이 )

.capacity : 할당된 메모리의 크기를 반환 ( reallocation 없이 사용할 수 있는 문자수를 반환 )

string s = “ABCDEF” ; int capacity = s.capacity() ; // size = 6, capacity = 15

★ capacity가 size보다 클때, 속도는 더 빠르다 !

= capacity가 size보다 크면, 기존 공간에 문자를 추가하면 되지만

그 반대의 경우에는 문자를 추가하기 위해 새로운 메모리를 할당해야 하기 때문이다.

.reserve : reallocation을 피하기 위해, 메모리의 최소용량을 지정

( 크기 ) : 크기만큼의 여유 메모리를 할당한다.

** 이때, 매개변수의 크기는 현재 capacity보다 크지않으면 의미도 효과도 없다.

string s = “ABCDEF” ; // size = 6, capacity = 15 s.reserve( 100 ) ; // size = 6, capacity = 111 s.reserve( 1000 ) ; // size = 6, capacity = 1007

.substr : 문자열의 일부분을 문자열로 반환

( 시작위치 ) : 시작위치부터 끝까지의 문자들을 문자열로 반환

( 시작위치, 개수 ) : 시작위치부터 개수만큼의 문자를 문자열로 반환

string s = “ABCDEF” ; string s2 = s.substr( 4 ) ; // s2 = “EF” ( 인덱스 4부터 끝까지의 문자열을 반환 ) string s3 = s.substr( 1, 3 ) ; // s3 = “BCD” ( 인덱스 1부터 3까지의 문자열을 반환 )

.swap : 문자열을 서로 바꾼다

string a = “ABCD” ; string b = “WXYZ” ; a.swap( b ) ; // a = “WXYZ”, b = “ABCD” b.swap( a ) ; // a = “ABCD”, b = “WXYZ”

.at : 문자열에서 특정위치의 문자를 액세스

string s = “ABCDEF” ; char c = s.at(3) ; // c = ‘D’

.c_str : string 문자열을 char* 형으로 바꾸어 반환한다.

string s = “ABCDEF” ; int length = strlen( s.c_str() ) ;

.date

.copy

.back

.front

.begin

.end

[백준] 10039번 평균점수

[백준] 10039번 평균점수

출처: [백준]10039번


문제

상현이가 가르치는 아이폰 앱 개발 수업의 수강생은 원섭, 세희, 상근, 숭, 강수이다.

어제 이 수업의 기말고사가 있었고, 상현이는 지금 학생들의 기말고사 시험지를 채점하고 있다. 기말고사 점수가 40점 이상인 학생들은 그 점수 그대로 자신의 성적이 된다. 하지만, 40점 미만인 학생들은 보충학습을 듣는 조건을 수락하면 40점을 받게 된다. 보충학습은 거부할 수 없기 때문에, 40점 미만인 학생들은 항상 40점을 받게 된다.

학생 5명의 점수가 주어졌을 때, 평균 점수를 구하는 프로그램을 작성하시오.


입력

입력은 총 5줄로 이루어져 있고, 원섭이의 점수, 세희의 점수, 상근이의 점수, 숭이의 점수, 강수의 점수가 순서대로 주어진다.

점수는 모두 0점 이상, 100점 이하인 5의 배수이다. 따라서, 평균 점수는 항상 정수이다.


출력

첫째 줄에 학생 5명의 평균 점수를 출력한다.


예제 입력 1

1
2
3
4
5
10
65
100
30
95

예제 출력 1

1
68

힌트

숭과 원섭이는 40점 미만이고, 보충학습에 참여할 예정이기 때문에 40점을 받게 된다. 따라서, 점수의 합은 340점이고, 평균은 68점이 된다.


출처

Olympiad > 일본정보올림피아드 > 일본정보올림피아드 예선 > JOI 2014 예선 1번


알고리즘 분류



풀이

  • 조건에 맞는 5개의 숫자를 받으면서 더한 후, 평균을 구한다.

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>

using namespace std;

int main()
{
int result=0,tmp;

for(int i=0; i<5; i++){
cin >> tmp;

if(tmp<0 || tmp>100 || tmp%5!=0){
return 0;
}

if(tmp<40){
tmp=40;
}

result+=tmp;
}

cout << result/5;
return 0;
}
[백준] 2920번 음계

[백준] 2920번 음계

출처: [백준]2920번


문제

다장조는 c d e f g a b C, 총 8개 음으로 이루어져있다. 이 문제에서 8개 음은 다음과 같이 숫자로 바꾸어 표현한다. c는 1로, d는 2로, …, C를 8로 바꾼다.

1부터 8까지 차례대로 연주한다면 ascending, 8부터 1까지 차례대로 연주한다면 descending, 둘 다 아니라면 mixed 이다.

연주한 순서가 주어졌을 때, 이것이 ascending인지, descending인지, 아니면 mixed인지 판별하는 프로그램을 작성하시오.


입력

첫째 줄에 8개 숫자가 주어진다. 이 숫자는 문제 설명에서 설명한 음이며, 1부터 8까지 숫자가 한 번씩 등장한다.


출력

첫째 줄에 ascending, descending, mixed 중 하나를 출력한다.


예제 입력 1

1
1 2 3 4 5 6 7 8

예제 출력 1

1
ascending

예제 입력 2

1
8 7 6 5 4 3 2 1

예제 출력 2

1
descending

예제 입력 3

1
8 1 7 2 6 3 5 4

예제 출력 3

1
mixed

출처

Contest > Croatian Open Competition in Informatics > COCI 2009/2010 > Contest #1 1번


알고리즘 분류



풀이

  • 8개의 숫자를 순서대로 string으로 받는다. 그리고 그 string이 ‘12345678’ 인지, ‘87654321’ 인지 아닌지 확인 후 알맞은 결과값을 출력시킨다.

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <string>

using namespace std;

int main()
{
string str;
string tmp;

for(int i=0; i<8; i++){
cin >> tmp;
str.append(tmp);
}

string as="12345678";
string des="87654321";

if(str==as){
cout << "ascending";
}
else if(str==des){
cout << "descending";
}
else {
cout << "mixed";
}

return 0;
}
[백준] 2577번 숫자의 개수

[백준] 2577번 숫자의 개수

출처: [백준] 2577번 숫자의 개수


문제

세 개의 자연수 A, B, C가 주어질 때 A×B×C를 계산한 결과에 0부터 9까지 각각의 숫자가 몇 번씩 쓰였는지를 구하는 프로그램을 작성하시오.

예를 들어 A = 150, B = 266, C = 427 이라면

A × B × C = 150 × 266 × 427 = 17037300 이 되고,

계산한 결과 17037300 에는 0이 3번, 1이 1번, 3이 2번, 7이 2번 쓰였다.


입력

첫째 줄에 A, 둘째 줄에 B, 셋째 줄에 C가 주어진다. A, B, C는 모두 100보다 같거나 크고, 1,000보다 작은 자연수이다.


출력

첫째 줄에는 A×B×C의 결과에 0 이 몇 번 쓰였는지 출력한다. 마찬가지로 둘째 줄부터 열 번째 줄까지 A×B×C의 결과에 1부터 9까지의 숫자가 각각 몇 번 쓰였는지 차례로 한 줄에 하나씩 출력한다.


예제 입력 1

1
2
3
150
266
427

예제 출력 1

1
2
3
4
5
6
7
8
9
10
3
1
0
2
0
0
0
2
0
0

출처

Olympiad > 한국정보올림피아드 > 한국정보올림피아드시․도지역본선 > 지역본선 2006 > 초등부 2번

  • 문제의 오타를 찾은 사람: pineapple
  • 잘못된 데이터를 찾은 사람: tncks0121

알고리즘 분류



풀이

  • 세 개의 자연수를 곱한 값을 10으로 나눈 나머지를 확인하여 해당 배열 인덱스에 카운트 1을 증가시켜준다.

  • 곱한 값은 10으로 나누어 1의 자리를 없앤다.

    ==> 1의 자리 숫자 하나씩 확인하면서, 10으로 나누어서 자릿수를 없애는 방식


소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
using namespace std;
int main()
{
int A, B, C, result;
int count[10]={}; // 0으로 초기화

cin >> A >> B >> C; // 3개의 값 입력

result=A*B*C;

while(result != 0){
int temp = result %10;
result =result/10;
count[temp]++;
}


for(int i=0; i<10; i++){
printf("%d\n",count[i]);
}

return 0;
}
[백준] 8958번 OX퀴즈

[백준] 8958번 OX퀴즈

출처: [백준] 8958번 OX퀴즈


문제

“OOXXOXXOOO”와 같은 OX퀴즈의 결과가 있다. O는 문제를 맞은 것이고, X는 문제를 틀린 것이다. 문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다. 예를 들어, 10번 문제의 점수는 3이 된다.

“OOXXOXXOOO”의 점수는 1+2+0+0+1+0+0+1+2+3 = 10점이다.

OX퀴즈의 결과가 주어졌을 때, 점수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 길이가 0보다 크고 80보다 작은 문자열이 주어진다. 문자열은 O와 X만으로 이루어져 있다.

출력

각 테스트 케이스마다 점수를 출력한다.

예제 입력 1 복사

1
2
3
4
5
6
5
OOXXOXXOOO
OOXXOOXXOO
OXOXOXOXOXOXOX
OOOOOOOOOO
OOOOXOOOOXOOOOX

예제 출력 1 복사

1
2
3
4
5
10
9
7
55
30

출처

ACM-ICPC > Regionals > Asia > Korea > Asia Regional - Seoul 2005 A번

  • 문제를 번역한 사람: baekjoon
  • 문제의 오타를 찾은 사람: jh82582

링크


풀이



소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
#include <cstring>
using namespace std;

int main(void)
{
char str[100];
int number = 0, result =0, flag=1;

cin >> number;

for (int i=0; i<number; i++){
cin >> str;
int length = strlen(str); // str의 길이를 미리 계산하여 loop문에서 계속 계산되는 것을 방지?

for(int j=0; j<length; j++){
if (str[j] == 'O'){ // O일 때 결과값 flag만큼 증가
result+=flag;
flag++;
}
else{ // X일 때 flag 1로 초기화
flag=1;
}
}

cout << result << endl;
result =0;
flag =1;
}

return 0;
}
[백준] 1152번 단어의 개수

[백준] 1152번 단어의 개수

출처: [백준] 1152번 단어의 개수


문제

영어 대소문자와 띄어쓰기만으로 이루어진 문자열이 주어진다. 이 문자열에는 몇 개의 단어가 있을까? 이를 구하는 프로그램을 작성하시오. 단, 한 단어가 여러 번 등장하면 등장한 횟수만큼 모두 세어야 한다.


입력

첫 줄에 영어 대소문자와 띄어쓰기로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 띄어쓰기 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열의 앞과 뒤에는 공백이 있을 수도 있다.


출력

첫째 줄에 단어의 개수를 출력한다.


예제 입력 1

1
The Curious Case of Benjamin Button

예제 출력 1

1
6

예제 입력 2

1
Mazatneunde Wae Teullyeoyo

예제 출력 2

1
3

예제 입력 3

1
Teullinika Teullyeotzi

예제 출력 3 복사

1
2

출처


알고리즘 분류



소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <string>

using namespace std;
using std::string;

int main()
{
string str={};
int wordCnt=0; // 단어 갯수

getline(cin,str);

for(int i=0; i<str.length(); i++) {
if(str[i] == ' ')
wordCnt++;
}

if(str.at(0) == ' ')
wordCnt--;

if(str.at(str.length()-1)==' ')
wordCnt--;

cout << wordCnt+1;
return 0;
}