일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Tags
- 전국 대학생 프로그래밍 대회 동아리 연합
- 2017
- 2023
- Python
- 인하대학교
- 코딩트리조별과제
- certi
- 구현
- 알고리즘 특강
- 삼성전자 코딩테스트
- 선린고등학교
- agcu컵
- 삼성전자
- 알고리즘특강
- iucpc
- B형
- 백준
- ICPC
- 파이썬
- 프로그래밍 경시대회
- 코딩테스트실력진단
- newbie programming contest
- 코딩테스트
- PRO
- 코드트리
- 알고리즘
- 파일 생성 불가
- 서울대학교
- 구름톤 챌린지
- 사내자격증
Archives
- Today
- Total
니노니나니
[SWEA 3816] 아나그램 - C++ 본문
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
문제
아나그램이란 문자열의 문자들을 모두 사용하여 재배열한 것을 의미한다.
“abc”의 아나그램은 “abc”, “acb”, “bac”, “bca”, “cab”, “cba” 총 6개이다.
문자열 S1, S2이 차례대로 주어진다. S2의 부분문자열 중 S1의 아나그램인 것의 개수를 구하는 프로그램을 작성하라.
입력
첫 줄에 테스트케이스의 개수 T가 주어진다. (T ≤ 20)
각 테스트케이스의 첫 줄에 S1, S2가 사이에 공백을 갖고 띄어져 있다.
S1과 S2는 영문 소문자로만 이루어져 있다. (1 ≤ |S1| ≤ |S2| ≤ 100,000)(|S1|, |S2|는 문자열 S1, S2의 길이)
풀이
int isEqual(int* s1_counter, int* s2_counter)
{
for (int i = 0; i < 26; i++)
{
if (s1_counter[i] != s2_counter[i])
{
return 0;
}
}
return 1;
}
int FindAnagram(int Len1, char *S1, int Len2, char *S2) {
int answer = 0;
int s1_counter[26] = { 0 };
int s2_counter[26] = { 0 };
//S1 기록
for (int i = 0; i < Len1; i++)
{
int temp;
temp = int(S1[i] - 'a');
s1_counter[temp] += 1;
}
for (int i = 0; i < Len1; i++)
{
int temp;
temp = int(S2[i] - 'a');
s2_counter[temp] += 1;
}
answer += isEqual(s1_counter, s2_counter);
for (int i = Len1; i < Len2; i++)
{
int temp;
temp = int(S2[i - Len1] - 'a');
s2_counter[temp] -= 1;
temp = int(S2[i] - 'a');
s2_counter[temp] += 1;
answer += isEqual(s1_counter, s2_counter);
}
return answer;
}
해결방법
S1의 문자열 길이를 기준으로 각 알파벳에 대한 카운터를 운영하여 한칸씩 이동하면서 동일한 알파벳 수를 가지고 있는지 확인하면 되는 문제입니다.
'알고리즘 > 삼성 Certi' 카테고리의 다른 글
[SWEA 3950] 괄호 - C++ (0) | 2025.02.26 |
---|---|
[SWEA 3947] 가장 짧은 길 전부 청소하기 - C++ (0) | 2025.02.26 |
[SWEA 3813] 그래도 수명이 절반이 되어서는... - C++ (0) | 2025.02.26 |
[SWEA 1232] 사칙연산 - C++ (0) | 2025.02.25 |
[SWEA 1233] 사칙연산 유효성 검사 - C++ (0) | 2025.02.25 |