게임 개발/알고리즘

[BOJ 백준] 31825번 : 알파벳과 쿼리 (Easy) (C++)

유행성바코드 2025. 5. 14. 22:35

[BOJ 백준] 31825번 : 알파벳과 쿼리 (Easy) (C++)

목차

  • 01. 개요
  • 02. 접근 방식
  • 03. 정답 코드

01. 개요

출처

https://www.acmicpc.net/problem/31825

 

문제

 

입력

 

출력

 

예시

 

 


02. 접근 방식

 

과정

1. string으로 현재 문자열을 입력 받음

 

2. 쿼리 값이 1인 경우

index가 start -1부터 end-1까지 현재 문자와 이전 문자를 비교

달라질 때마다, 묶음의 개수를 1 증가

초기에는 char prev = ' '; 로 초기화하면, 처음 검사를 할 때, 서로 다른 문자로 인식해 묶음의 개수가 1로 시작

구한 묶음의 개수를 출력

 

3. 쿼리 값이 2인 경우

index가 start - 1부터 end -1까지 알파벳의 순서를 한 단계 미루기 → 아스키 코드가 1씩 차이나는 것을 활용

이때, Z인 경우에는 A로 변경하므로 나머지 연산을 활용

str[i] = (str[i] + 1 - 'A') % 26 + 'A'

위 식을 사용하면, Z에서 1을 더해도 나머지 연산으로 인해 A로 변경

 

과정

 

 


03. 정답 코드

더보기
// 실버 5 - 31825번 : 알파벳과 쿼리 (Easy)
// 작성자 : free4760(jeonghoe22)

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>

using namespace std;

// 200 * 200 = 40'000

int main()
{
    // 입출력 최적화
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    // 문자열 길이 N, 쿼리 개수 Q
    int N, Q;
    cin >> N >> Q;

    string input;
    cin >> input;

    int query, start, end;
    for(int i = 0; i < Q; i++)
    {
        cin >> query >> start >> end;

        // 찾기
        if(query == 1)
        {
            int result = 0;
            char prev = ' ';
            for(int idx = start-1; idx < end; idx++)
            {
                if(input[idx] != prev)
                {
                    prev = input[idx];
                    result++;
                }
            }   
            cout << result << "\n";
        }
        // 구간에 있는 알파벳 변경
        else
        {
            for(int idx = start-1; idx < end; idx++)
                input[idx] = (input[idx] - 'A' + 1) % 26 + 'A';
        }
    }
}

 


 

읽어주셔서 감사합니다.

틀린 내용 지적은 언제나 환영입니다!