임의의 길이를 가진 문자열이 하나 주어지며, 이 문자열 안에서 ASCII 값이 지정된 범위 [l, r]에 속하는 알파벳의 개수를 계산하고 해당 문자들을 출력하는 것이 이번 문제의 목표입니다.
대문자 A~Z의 ASCII 값
| A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 |
| T | U | V | W | X | Y | Z |
|---|---|---|---|---|---|---|
| 84 | 85 | 86 | 87 | 88 | 89 | 90 |
소문자 a~z의 ASCII 값
| a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 |
| t | u | v | w | x | y | z |
|---|---|---|---|---|---|---|
| 116 | 117 | 118 | 119 | 120 | 121 | 122 |
예시
입력 - str = "point", First = 111, Last = 117
출력 - 주어진 범위에 속하는 문자: p, o, t
개수: 3
설명 - p(112), o(111), t(116)는 모두 [111, 117] 범위 안에 있으므로 이 세 문자가 카운트됩니다.
입력 - str = "ABCZXY", First = 65, Last = 70
출력 - 주어진 범위에 속하는 문자: A, B, C
개수: 3
설명 - A(65), B(66), C(67)는 [65, 70] 범위 안에 있지만 Z(90), X(88), Y(89)는 범위를 벗어나므로 A, B, C만 카운트됩니다.
알고리즘(접근 방법)
- 문자열과 범위의 시작 값(left), 끝 값(right)을 입력받아 변수에 저장합니다.
- length() 함수를 사용하여 공백을 포함한 문자열의 전체 길이를 정수 값으로 구합니다.
- 조건을 만족하는 문자의 개수를 저장할 임시 변수(count)를 선언하고 0으로 초기화합니다.
- i를 0부터 문자열 길이보다 작은 동안 반복하는 루프를 시작합니다.
- 루프 안에서 left <= str[i] 이고 동시에 str[i] <= right 인지 검사합니다.
- 조건이 참이면 count를 1 증가시키고 해당 문자 str[i]를 출력합니다.
- 루프가 종료되면 count를 반환합니다.
- 반환된 개수를 최종적으로 출력합니다.
예제 코드
#include <iostream>
using namespace std;
// ASCII 값이 [l, r] 범위에 있는
// 문자의 개수를 세는 함수
int count_char(string str, int left, int right){
// 개수를 0으로 초기화
int count = 0;
int len = str.length();
for (int i = 0; i < len; i++) {
// 범위에 속하면 개수를 증가시키고 문자 출력
if (left <= str[i] and str[i] <= right) {
count++;
cout << str[i] << " ";
}
}
// 개수 반환
return count;
}
int main(){
string str = "tutorialspoint";
int left = 102, right = 111;
cout << "주어진 범위에 속하는 문자들";
cout << "\n개수: " << count_char(str, left, right);
return 0;
}
실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
주어진 범위에 속하는 문자들 개수: o i l o i n 6
문자열 "tutorialspoint"에서 ASCII 값이 102('f') 이상 111('o') 이하인 문자는 o, i, l, o, i, n으로 총 6개입니다. 나머지 문자인 t(116), u(117), r(114), a(97), s(115), p(112) 등은 범위를 벗어나므로 카운트되지 않습니다.
복잡도 분석
이 알고리즘은 문자열을 한 번만 순회하므로 시간 복잡도는 O(n)이며, 개수를 저장하는 변수 외에 추가적인 공간을 사용하지 않으므로 공간 복잡도는 O(1)입니다.