백준 Refrigerator Magnets - 4575
오늘은 백준 4575문제를 풀어봤습니다.
문제
결과적으로 반복된 문자가 없는 문장만 출력하는 문제입니다.
아래의 사진과 같이 문자가 중복이 있는 문장은 출력하지 않고 중복이 없는 문장만 출력하게 코드를 짜면 됩니다.
풀이
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
string content;
while (true) {
getline(cin, content);
if (content == "END") {
break;
}
vector<int> alphabet_count(26, 0);
bool possible = true;
for (char c : content) {
if (c == ' ') {
continue;
}
int index = c - 'A';
alphabet_count[index] += 1;
if (alphabet_count[index] > 1) {
possible = false;
break;
}
}
if (possible) {
cout << content << endl;
}
}
}
C++을 사용해서 풀었으며, 위의 나온 예시를 바탕으로 코드를 구성하면 됩니다.
종료조건은 입력된 값이 "END"이면 종료 이므로 If문을 사용해서 구현하였고, 입력된 값이 END가 아닐 경우 반복문을 돌려서 "index = c - 'A';" 코드를 통해 각 알파벳에 맞는 배열 주소를 구하고 "alphabet_count[index] += 1;" 코드를 통해 그 주소값에 +1을 하도록 구현하였습니다.
그리고 제일 중요한 아래의 코드를 통해 1보다 클 경우 중복된 문자가 있는 경우 이므로 possible 변수를 false로 바꾸어 그 문장은 출력되지 않도록 구현하였습니다. 결과적으로 possible 변수가 true인 경우 중복된 문자가 없는 경우 이므로 그 문장은 출력되도록 구현하였습니다.
if (alphabet_count[index] > 1) {
possible = false;
break;
}
arr[c - 'A'] 에 대해서
c는 영문자를 저장하는 변수 입니다.
c - 'A'는 해당 문자를 0부터 시작하는 인덱스로 변환합니다.
예시)
만약 c = 'A'라면
c - 'A' = 'A' - 'A' = 0이 됩니다. 따라서 arr[0]을 참조합니다.
만약 c = 'B'라면
c - 'A' = 'B' - 'A' = 1이 됩니다. 따라서 arr[1]을 참조합니다.
만약 c = 'Z'라면
c - 'A' = 'Z' - 'A' = 25가 됩니다. 따라서 arr[25]를 참조합니다.