임의의 길이를 가진 문자열이 주어졌을 때, 문자열 안에서 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 |
예시
입력 − String str = "point" First = 111, Last = 117 출력 − 범위에 포함되지 않는 문자: i, n 개수: 2
설명 − 'i'(105)와 'n'(110)은 [111, 117] 범위에 속하지 않으므로 이 두 문자가 카운트됩니다.
입력 − String str = "ABCZXY" First = 65, Last = 70 출력 − 범위에 포함되지 않는 문자: Z, X, Y 개수: 3
설명 − 'Z'(90), 'X'(88), 'Y'(89)는 [65, 70] 범위에 속하지 않으므로 이 세 문자가 카운트됩니다.
프로그램에 적용된 접근 방식
- 문자열과 함께 범위를 구성할 시작 값(start)과 끝 값(end)을 입력받아 변수 str 등에 저장합니다.
- length() 함수를 사용해 문자열의 길이를 구합니다. 이 함수는 공백을 포함한 문자열 내 문자 수에 해당하는 정수 값을 반환합니다.
- 조건에 맞는 문자의 개수를 저장할 임시 변수를 준비하고, 이미 출력된 문자를 추적하기 위한 맵(m)을 생성합니다.
- i가 0부터 문자열 길이 미만일 때까지 반복문을 실행합니다.
- 반복문 안에서 start ≤ str[i] ≤ end 조건을 검사하여 해당 문자가 범위 밖에 있는지 확인합니다.
- 범위 밖의 문자라면 개수를 증가시키고, m[str[i]]의 값이 1이 아니면 해당 문자를 출력한 뒤 m[str[i]]를 1 증가시켜 동일한 문자가 중복 출력되지 않도록 합니다.
- 최종 개수를 반환합니다.
- 결과를 출력합니다.
예제 코드
#include <iostream>
#include <unordered_map>
using namespace std;
// ascii 값이 [l, r] 범위에 없는 문자의 개수를 세는 함수
int count_non_char(string str, int left, int right){
int count = 0;
// 각 문자를 한 번만 출력하기 위해 map 사용
unordered_map<char, int> m;
int len = str.length();
for (int i = 0; i < len; i++) {
if (!(left <= str[i] and str[i] <= right)){
count++;
if (m[str[i]] != 1){
cout << str[i] << " ";
m[str[i]]++;
}
}
}
// 개수 반환
return count;
}
// 메인 코드
int main(){
string str = "tutorialspoint";
int left = 102, right = 111;
cout << "Characters and ";
cout << "\nand count in the given range is: " << count_non_char(str, left, right);
return 0;
}
실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다 −
Characters and and count in the given range is: t u r a s p 8
"tutorialspoint" 문자열에서 ASCII 값이 [102, 111] 범위에 속하지 않는 문자는 중복을 포함해 총 8개입니다. 이때 해시 맵을 활용해 중복 출력을 방지했기 때문에 화면에는 t, u, r, a, s, p 여섯 개의 고유한 문자만 표시됩니다.