티스토리 뷰
https://www.acmicpc.net/problem/2607
- 문제 :
영문 알파벳 대문자로 이루어진 두 단어가 다음의 두 가지 조건을 만족하면 같은 구성을 갖는다고 말한다.
- 두 개의 단어가 같은 종류의 문자로 이루어져 있다.
- 같은 문자는 같은 개수 만큼 있다.
예를 들어 "DOG"와 "GOD"은 둘 다 'D', 'G', 'O' 세 종류의 문자로 이루어져 있으며 양쪽 모두 'D', 'G', 'O' 가 하나씩 있으므로 이 둘은 같은 구성을 갖는다. 하지만 "GOD"과 "GOOD"의 경우 "GOD"에는 'O'가 하나, "GOOD"에는 'O'가 두 개 있으므로 이 둘은 다른 구성을 갖는다.
두 단어가 같은 구성을 갖는 경우, 또는 한 단어에서 한 문자를 더하거나, 빼거나, 하나의 문자를 다른 문자로 바꾸어 나머지 한 단어와 같은 구성을 갖게 되는 경우에 이들 두 단어를 서로 비슷한 단어라고 한다.
예를 들어 "DOG"와 "GOD"은 같은 구성을 가지므로 이 둘은 비슷한 단어이다. 또한 "GOD"에서 'O'를 하나 추가하면 "GOOD" 과 같은 구성을 갖게 되므로 이 둘 또한 비슷한 단어이다. 하지만 "DOG"에서 하나의 문자를 더하거나, 빼거나, 바꾸어도 "DOLL"과 같은 구성이 되지는 않으므로 "DOG"과 "DOLL"은 비슷한 단어가 아니다.
입력으로 여러 개의 서로 다른 단어가 주어질 때, 첫 번째 단어와 비슷한 단어가 모두 몇 개인지 찾아 출력하는 프로그램을 작성하시오.
- 풀이 :
생각보다 까다로운 구현 문제였다.
매 테스트케이스마다 비교 기준단어의 문자들에 대한 dictionary에 카운팅을 한다.
이 dictionary에서 비교대상이 되는 단어의 각 자릿수마다 비교를 시작한다.
각 자리를 구성하는 알파벳마다 dictionary의 값이 1 이상이라면 -1을 해주고 아니라면 flag를 true로 변경해준다
이 flag는 단어를 한번 뺐다는 표시를 해주기 위해 사용하였다. 만약 dictionary의 값이 0이면서 flag가 true라면 이 상황은
-> 이미 문자를 하나 뺐는데 또 다른 문자가 나온 경우
이다. 따라서 이는 정답이 될 수 없다. 이를 체크하기 위해 ansC라는 boolean값을 사용하여 체크하였다.
추가적으로, 원래 기준문자에서 알파벳을 하나 빼는 경우를 체크해주기 위해 dictionary의 모든 값을 합한 수가 2 이상이라면 정답으로 체크하지 않도록 구현하였다.
즉, 이 문제에서 체크한 테스트케이스는
2
DOG
DOGG
1
2
DOG
DOLL
0
2
DOG
DOLY
0
2
DOGGY
DOG
0
이다.
- 소스코드 :
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
31
32
33
34
|
N = int(input())
firstWord = sorted(input())
words = []
for _ in range(N-1):
words.append(sorted(input()))
l = len(firstWord)
ans = 0
for i in words:
dic = dict()
flag = False
ansC = True
for j in range(26):
dic[chr(ord("A")+j)] = 0
for j in firstWord:
dic[j] += 1
for j in i:
if dic[j] > 0:
dic[j] -= 1
else:
if not flag:
flag = True
else:
ansC = False
break
if ansC:
sum = 0
for i in dic:
sum += dic[i]
if sum <= 1:
ans += 1
print(ans)
|
cs |
'Algorithm > String' 카테고리의 다른 글
(Python/파이썬) - 백준(BOJ) 1316번 : 그룹 단어 체커 (0) | 2022.04.14 |
---|---|
(Python) - BOJ(1032번) : 명령 프롬프트 (0) | 2022.03.02 |
(Python) - BOJ(18870번) : 좌표 압축 (0) | 2022.02.16 |
(C++) - BOJ(1427번) : 소트인사이드 (0) | 2022.01.26 |
(Python) - BOJ(1120번) : 문자열 (0) | 2022.01.25 |