Algorithm/백준 알고리즘_Python
[알고리즘][Python] 백준(BOJ) 2607 비슷한 단어_파이썬
알파이
2020. 10. 13. 08:38
2607 비슷한 단어 www.acmicpc.net/problem/2607
2607번: 비슷한 단어
첫째 줄에는 단어의 개수가 주어지고 둘째 줄부터는 한 줄에 하나씩 단어가 주어진다. 모든 단어는 영문 알파벳 대문자로 이루어져 있다. 단어의 개수는 100개 이하이며, 각 단어의 길이는 10 이��
www.acmicpc.net
문제 풀기 전 공부할 것 : 구현, 브루트포스 알고리즘
풀이 1
<내용>
- 첫 번째 단어를 dictionary 형태로 word에 저장한다.
- 단어들을 반복하여 단어의 알파벳을 word에서 -1 한다.
- 한 문자를 더하거나 빼거나 다른 문자로 바꾸는 경우에만 res에 +1을 한다.
<코드>
import copy
import sys
input = sys.stdin.readline
n = int(input())
words = [input().rstrip() for _ in range(n)]
word = {}
for w in words[0]:
if w in word:
word[w] += 1
else:
word[w] = 1
res = 0
for i in range(1, n):
if len(words[i]) > len(words[0])+1 or len(words[i]) < len(words[0])-1:
continue
check = copy.deepcopy(word)
for w in words[i]:
if w in check:
check[w] -= 1
else:
check[w] = -1
change = [0, 0]
flag = True
for c in check:
if check[c] == 0:
continue
if check[c] == 1:
change[1] += 1
elif check[c] == -1:
change[0] += 1
else:
flag = False
break
if sum(change) > 2:
flag = False
elif change[0] > 2 or change[1] > 2:
flag = False
if flag:
res += 1
print(res)
풀이 2
<내용>
- 위의 과정과 같으나 dictionary가 아닌 list로 표현해서 같은 방법으로 해결한다.
<코드>
import sys
input = sys.stdin.readline
n = int(input())
words = [[0 for _ in range(26)] for _ in range(n)]
for i in range(n):
string = input().rstrip()
for s in string:
words[i][ord(s)-ord('A')] += 1
res = 0
for word in words[1:]:
plus, minus = 0, 0
for i in range(26):
if word[i] > words[0][i]:
plus += (word[i]-words[0][i])
else:
minus += (words[0][i]-word[i])
if plus < 2 and minus < 2:
res += 1
print(res)
728x90
반응형