N

(SWEA c++)7853. 오타 본문

SW Expert Academy

(SWEA c++)7853. 오타

naeunchan 2020. 12. 1. 10:39
728x90
반응형

swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWttUKkq5hQDFASy&categoryId=AWttUKkq5hQDFASy&categoryType=CODE

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

문자열의 앞뒤를 비교해야한다.

 

for문을 이용해 s.size()만큼 반복한다.

우선 인덱스가 0이거나 s.size() - 1인 경우 문자가 2개만 비교하기 때문에 if를 이용해 따로 처리하도록 한다.

두 개의 문자가 같은지 비교하여 같지 않은 경우는 ans에 2를 곱하도록 한다.

 

위의 경우가 아닌 경우는 세 개의 문자를 비교하면 된다.

세 개의 문자가 같은 경우는 continue,

두 개의 문자가 같은 경우는 ans * 2를 곱,

모두 다른 경우는 ans * 3을 해주면 된다.

 

각 곱마다 10억 + 7로 나눈 나머지를 해야 코드가 돌아갈 것이다..!

#include <iostream>
#include <string>
#include <cmath>

using namespace std;

int main(void)
{
    int t;
    cin >> t;
    
    for(int tc = 1; tc <= t; tc++)
    {
        string s;
        long long ans = 1;
        
        cin >> s;
        
        for(int i = 0; i < s.size(); i++)
        {
            if(i == 0)
            {
                if(s[i] != s[i + 1])
                    ans = (ans * 2) % (long long)(1e9 + 7);
            }
            else if(i == s.size() - 1)
            {
                if(s[i] != s[i - 1])
                    ans = (ans * 2) % (long long)(1e9 + 7);
            }
            else
            {
                if(s[i - 1] == s[i] && s[i] == s[i + 1])
                    continue;
                else if((s[i - 1] == s[i] && s[i] != s[i + 1]) || (s[i + 1] == s[i] && s[i - 1] != s[i]) || (s[i - 1] == s[i + 1] && s[i] != s[i + 1]))
                    ans = (ans * 2) % (long long)(1e9 + 7);
                else
                    ans = (ans * 3) % (long long)(1e9 + 7);
            }
        }
        cout << "#" << tc << " " << ans << endl;
    }
    return 0;
}
728x90
반응형