Language Grammar/C++

2024 - 11- 05 C++ 코딩테스트 10주완성 D+57

Jang_^ 2024. 11. 6. 13: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을 추가하게 된다..!

 

이런 방법이 있다는 것도 한번 깨닫고 간다! ㅎㅎ