#include <iostream>
using namespace std;
int main()
{
string str;
cin >> str;
cout << str.length();
return 0;
}
★ 이 문제는 여러 방법으로 풀 수 있다. 1. char로 배열을 선언해서 strlen(arr)로 풀기 2. string으로 선언해서 length() 이용하기 / .size() 이용하기 단, sizeof() 함수를 사용하면 문자의 길이가 아니라 크기가 출력된다. (8byte*개수) size()랑 헷갈릴 거 같으면 그냥 길이를 나타내는 len쪽 함수를 쓰자!
#include <iostream>
using namespace std;
int main()
{
int n, sum=0;
string str;
cin >> n >> str;
for (int i = 0; i < n; i++) {
sum += str[i]-'0';
}
cout << sum;
return 0;
}
★문자열->정수 변환할 때는 stoi() 함수를 사용할 수도 있다. 처음엔 그렇게 하려고 했으나, 각 문자를 인덱스로 불러와서 stoi()로 변환하기엔 오류가 있었다. 그래서 아스키 코드를 이용해서 계산하였다. 문자에서 '0'값을 빼면 (=48을 뺌) 해당 정수가 나온다. (ex: '3'-'0'= 51-48=3)
#include <iostream>
using namespace std;
int main()
{
int a[26], n=0;
fill(a, a + 26, -1); //초기화
string s;
cin >> s;
for (int i = 0; i < s.length(); i++) { //문자열 끝까지 반복
n = s[i] - 'a'; //a=0부터로 연산
if (a[n] == -1) { //처음 등장할 때만 저장
a[n] = i;
}
}
for (int i = 0; i < 26; i++) {
cout << a[i] << " ";
}
return 0;
}
★0값으로 초기화할 때는 그냥 {}로 선언해주면 되지만, 특정 값으로 초기화할 때는 다른 방법을 사용해야 한다. 반복문으로 초기화를 해줘도 되지만 편하게 fill(시작 주소, 끝나는 주소, 값) 함수를 사용하였다. 문제에서 소문자만 사용하며 a를 0번 인덱스로 보고 있으므로, 아스키 코드로 a값을 빼줘서 배열 인덱스 값을 계산하였다. 또한 처음 등장하는 위치로 저장해야 되기 때문에, 해당 배열 원소가 초기화 값일 때만 저장하도록 하였다.
#include <iostream>
#include <string> //getline()
using namespace std;
int main()
{
string s;
int count=1;
getline(cin, s); //공백 포함 한 줄 입력 받기
if (s[0] == ' ' && s.length() == 1) { //공백만 입력받은 경우
cout << 0;
return 0;
}
for (int i = 1; i < s.length()-1; i++) { //시작과 끝 제외
if (s[i] == ' ') {
count++;
}
}
cout << count;
return 0;
}
★공백 포함 문자열을 입력 받을 때는 getline()을 쓰거나 scanf(%[^\n]", &s);를 사용할 수 있다. ^\n은 개행 문자가 나오기 전까지 다 입력받는다는 뜻이다. 또한 이번 문제에서는 여러 예외 처리를 해주어야 한다. 공백만 입력 받고 끝난 경우, 첫번째나 마지막에 공백이 오는 경우를 생각해서 구현한다.
#include <iostream>
#include <string>
using namespace std;
int inverseStr(char* str) {
char temp;
temp = str[0];
str[0] = str[2];
str[2] = temp;
string s = str;
int num = stoi(s);
return num;
}
int main()
{
char str1[4], str2[4];
cin >> str1 >> str2;
int n1, n2;
n1 = inverseStr(str1);
n2 = inverseStr(str2);
cout << max(n1, n2);
return 0;
}
☆문자형태로 입력을 받아서 위치를 교환하는 식으로 구현하였다. <string>의 stoi()함수로 정수타입으로 변환한 뒤 rturn하여 max() 함수로 더 큰 수를 출력하면 된다. 이때 처음 문자열 배열은, 문자열 끝의 \n 문자를 생각하여 한 칸 더 크게 선언해준다.
#include <iostream>
using namespace std;
int alpaToInt(int s)
{
int time = 0;
if (s <= 2) time = 3;
else if (s <= 5) time = 4;
else if (s <= 8) time = 5;
else if (s <= 11) time = 6;
else if (s <= 14) time = 7;
else if (s <= 18) time = 8;
else if (s <= 21) time = 9;
else if (s <= 25) time = 10;
else time = 0;
return time;
}
int main()
{
string s;
int time = 0;
cin >> s;
for (int i = 0; i < s.length(); i++) {
time += alpaToInt((int)s[i]-'A');
}
cout << time;
return 0;
}
☆최대한 코드를 간결하게 짜기 위해 식을 고민하다가 위와 같은 결과가 나왔다. 이렇게 해도 답은 맞았지만, 다른 방법이 더 있는지 찾아본 결과 아래처럼 코드를 훨씬 간단하게 짤 수 있었다. 미리 시간을 계산한 값을 배열로 만들어 놓고 인덱스를 찾아가는 형식이었다. 인덱스를 구하는 방법은 위에서도 동일하게 했는데, 각 자리의 알파벳을 (int)로 아스키 코드 값으로 바꾼 뒤 'A'(=65)를 빼서 A를 0부터로 계산하는 형식이다.
#include <iostream>
using namespace std;
int main()
{
string s;
int time = 0;
int alpa[] = { 3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,8,8,8,8,9,9,9,10,10,10,10 };
cin >> s;
for (int i = 0; i < s.length(); i++) {
time += alpa[(int)s[i]-'A'];
}
cout << time;
return 0;
}
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s;
while (1) {
getline(cin, s);
if (s == "") break;
cout << s << "\n";
}
return 0;
}
★난이도는 낮게 표시되어 있는데 왜 정답률도 낮은지 알 수 있었던 문제,,, 개념을 확실하게 알아야 맞힐 수 있는 문제같다. 일단 공백 포함 문자열을 입력 받아야 되기 때문에 <string>의 getline() 함수를 사용하였다. 그리고 여기서, 처음에는 문자가 끝나는 조건으로 if (s == " ") //공백 하나 씀 <-이렇게 했더니 출력 초과가 떴다. 여기서 문제를 못 알아채고 마지막 "\n"이 문제인가? 하고 괜히 개행 문자 지웠다가 시간 초과가 떴다. 이렇게 다양하게 틀린 것도 신기하다...
그다음 문제를 발견하였는데, if문 조건을 잘못 썼다. 공백도 쓰지말고 그냥 아예 ""로 써야 정답이 된다. 생각해보니까 왜 공백을 썼지,,, 아무튼 그제서야 아래 오류들에 대한 이해가 갔다. 공백을 기준으로 하고 있었으니 문자열이 아예 안들어올 때 break 되지 못하고 더 출력을 해서 출력 초과가 됐을 것이고, 그 다음엔 개행을 없애니 출력 포맷과 달라져서 계속 입력을 받아 시간이 초과됐을 것이라 생각한다. 암튼 해결했으니 5단계도 끝~!~!!