2024 - 11- 05 C++ 코딩테스트 10주완성 D+57
백준 14405 문제 - 피카츄
난이도
피카츄는 "pi", "ka", "chu"를 발음할 수 있다. 따라서, 피카츄는 이 세 음절을 합친 단어만 발음할 수 있다. 예를 들면, "pikapi"와 "pikachu"가 있다.
문자열 S가 주어졌을 때, 피카츄가 발음할 수 있는 문자열인지 아닌지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 문자열 S가 주어진다. (문자열은 알파벳 소문자로 이루어진 문자열이며, 길이는 5000을 넘지 않는다.)
출력
문자열 S가 "pi", "ka", "chu"를 이어 붙여서 만들 수 있으면 "YES"를 아니면 "NO"를 출력한다.
#include <bits/stdc++.h>
using namespace std;
string s;
int main()
{
cin >> s;
bool isflag = false;
for(int i =0; i < s.size(); i)
{
if(i < s.size() - 1)
{
if((s[i] == 'p' && s[i+1] == 'i') || (s[i] == 'k' && s[i+1] == 'a'))
{
i += 2;
continue;
}
}
if(i < s.size() - 2 && s[i] == 'c' && s[i+1] == 'h' && s[i+2] == 'u')
{
i += 3;
continue;
}
isflag = true;
break;
}
if(isflag) cout << "NO";
else cout << "YES";
}
내가 짠 코드는 단순하다!
순수하게 입력받은 문자열의 사이즈만큼 반복문을 돌리고, 해당 문자열의 인덱스에 접근할때마다 특정단어 pi, chu, ka가
나오지 않으면 isflag = true를 시켜주고 break 하여 "NO"를 출력,
끝까지 반복문을 통과하면 isflag 의 초깃값은 false이므로 "YES"를 출력시켜주는 코드이다!
간단한 코드이니 실행순서는 오늘 생략하겠다.
강의실습코드를 빼먹을 순 없다 한번 살펴보자!
강의실습코드
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
string s;
bool flag = 0;
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> s;
for(int i = 0; i < s.size(); i++){
if(i < s.size() - 1 && s.substr(i, 2) == "pi" || s.substr(i, 2) == "ka") i += 1;
else if(i < s.size() - 2 && s.substr(i, 3) == "chu") i += 2;
else flag = 1;
}
if(flag) cout << "NO\n";
else cout << "YES\n";
return 0;
}
난 s의 인덱스를 접근해 i 순서일때 i+1을 i+2 등 비교하여 단어를 알아챈 반면,
이 코드는 string 클래스의 메서드를 이용하여 단어를 알아챈 것! 이 두개의 차이점밖에 존재하질않는다
이번 코드는 강의 코드랑 별 차이가 없어 상당히 만족스럽다 ㅎㅎ..!!
백준 15353 문제 - 큰 수 A+B(2)
난이도
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 A와 B가 주어진다. (0 < A,B < 10^10000)
출력
첫째 줄에 A+B를 출력한다.
실습코드
#include<bits/stdc++.h>
using namespace std;
string string_add(string a, string b) {
int sum = 0;
string ret;
while(a.size() || b.size() || sum){
if(a.size()) {
sum += a.back() - '0';
a.pop_back();
}
if(b.size()) {
sum += b.back() - '0';
b.pop_back();
}
ret += (sum % 10) + '0';
sum /= 10;
}
reverse(ret.begin(), ret.end());
return ret;
}
string a, b;
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> a >> b;
cout << string_add(a, b) << '\n';
return 0;
}
이 문제를 풀려면 기본 int형으로 더하면 최대범위를 벗어나므로 성립하지않는다.
따라서 String형으로 입력을 받아 int형으로 변환하여 각자리수를 더하여 출력해주면 된다!
이 코드의 실행순서를 살펴보자!
1. 두 문자열 a,b를 입력받는다.
2. string_add(a,b) 를 호출해준다.
ㄴ 2.string string_add(string a,string b)
ㄴ 2-1. a의 사이즈 또는 b 사이즈 또는 sum 이 0이 될때까지 반복문
ㄴ 2-1-1. 만약 a의 배열이 남아있다면 sum 안에 a의 맨뒤 원소를 더해주고 popback
ㄴ 2-1-2. 만약 b의 배열이 남아있다면 sum 안에 b의 맨뒤 원소를 더해주고 popback
ㄴ 2-1-3. sum이 10을 넘을수도 있기떄문에 % 10을 한다음 나머지를 ret에 더해준다.
ㄴ 2-1-4. sum이 10을 넘었을 경우 1을 만들어준다. 이러면 다음 반복문때 sum이 1이 더해진 상태로 주어진다.
ㄴ 2-2. 이 반복문이 끝났을 경우 ret은 인덱스 0부터 저장되었기때문에 뒤집어주어야 둘이 더한수가 나오기떄문에
reverser를 해준다.
ㄴ 2-3. ret을 리턴시킨다.
3. cout << string_add(a,b) << '\n' 시켜주면 ret이 출력되게 된다.
간단한 코드지만
예를 들어) 61234 61234 를 더하였을때, 122468 이 나오는 예시를 보자
만약 같은 자리의 수를 더하였을때, 자리수가 하나 더 높아지는 결과물이 나올시 어떻게 해야 될지 헷갈렸었는데,
while 조건문안에 sum != 0 을 넣음으로써, a 와 b의 사이즈가 0일경우에도 ret안에 1을 추가하게 된다..!
이런 방법이 있다는 것도 한번 깨닫고 간다! ㅎㅎ