[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