[Python] 코딩 도장 - 비슷한 단어 찾아내기
Updated:
코딩 도장 사이트의 문제를 직접 풀어본 내용을 정리하여 올립니다.
코딩 도장에서 여러 문제를 확인할 수 있습니다.
난이도 순으로 차근차근 풀어보려 합니다.
[문제: 비슷한 단어 찾아내기] - Lv.2
아래와 같은 결과를 출력하는 function을 구현하라
bool OneEditApart(string s1, string s2)
OneEditApart("cat", "dog") = false
OneEditApart("cat", "cats") = true
OneEditApart("cat", "cut") = true
OneEditApart("cat", "cast") = true
OneEditApart("cat", "at") = true
OneEditApart("cat", "acts") = false
한개의 문자를 삽입, 제거, 변환을 했을때 s1, s2가 동일한지를 판별하는 OneEditApart 함수를 작성하시오.
출처: https://codingdojang.com/scode/445?answer_mode=hide
[풀이]
def OneEditApart(s1,s2):
l1 = len(s1)
l2 = len(s2)
# 길이가 다를 때 제거 (삽입과 동일)
if l1 != l2:
if max(l1,l2) == l1:
s1, s2 = s2, s1
answer = sum([s2.replace(s2[i],"") == s1 for i in range(l2)])
# 길이가 같을 때 변환
else:
answer = l1 - sum([s1[i] == s2[i] for i in range(l1)])
if s1 == s2:
answer = 1
if answer == 1:
return "true"
else:
return "false"
print(OneEditApart("cat", "dog"))
print(OneEditApart("cat", "cats"))
print(OneEditApart("cat", "cut"))
print(OneEditApart("cat", "cast"))
print(OneEditApart("cat", "at"))
print(OneEditApart("cat", "acts"))
false
true
true
true
true
false
길이가 다른 경우에 max(l1,l2) == l1
조건으로 s1, s2 = s2, s1
를 설정하였다.
이렇게 되면 무조건 s2가 더 큰 길이가 될 것이다.
[s2.replace(s2[i],"") == s1 for i in range(l2)]
으로 한 개 문자 제거시 s1과 같으면 true를 생성한다.
이를 sum()
하면 s1과 같은 경우가 있으면 1 아닐 경우 무조건 0이다.
길이가 같은 경우에는 처음부터 두 문자가 같거나 한 개만 달라야 변환으로 동일하게 만들 수 있다.
l1 - sum([s1[i] == s2[i] for i in range(l1)])
으로 1 또는 0이 나오면 동일하게 만들 수 있는 경우이다.
0인 경우는 1로 바꿔서 최종적으론 1이면 true, 0이면 false로 반환하였다.
[추천 풀이]
def checkRemoval(s1, s2):
for i in range(len(s1)):
t = s1[:i]+s1[i+1:]
if s2==t: return True
return False
def checkReplace(s1, s2):
for i in range(len(s1)):
t1 = s1[:i]+s1[i+1:]
t2 = s2[:i]+s2[i+1:]
if t1==t2: return True
return False
def OneEditApart(s1, s2):
if len(s1) > len(s2):
return checkRemoval(s1, s2)
elif len(s1) < len(s2):
return checkRemoval(s2, s1)
else:
return checkReplace(s1, s2)
print(OneEditApart("cat", "dog"))
print(OneEditApart("cat", "cats"))
print(OneEditApart("cat", "cut"))
print(OneEditApart("cat", "cast"))
print(OneEditApart("cat", "at"))
print(OneEditApart("cat", "acts"))
False
True
True
True
True
False
이 분은 두 문자열의 길이가 다른 경우는 큰 문자열에서 하나씩 문자를 제거 해 보았을 때 같은지 체크하였다.
두 문자열의 길이가 같은 경우에는 한 개의 문자를 제외한 나머지 문자열이 같은지 체크한 방식이다.
Leave a comment