Elice_Coding_Word_Pattern

Elice_Coding_Word_Pattern

엘리스 코딩 단어 패턴을 풀어봤다


단어 패턴

문자열(패턴) 하나와 문자열의 배열 하나가 주어집니다.
패턴 문자열의 각각의 문자 하나는, 두번째 문자열 배열의 각각의 문자열 하나에 대응 될 수 있습니다.
해당 배열이 해당 패턴으로 표현 되는지 아닌지의 여부를 확인하는 함수를 만들어 보세요.

예를 들어서, aabb 와 [‘elice’, ‘elice’, ‘alice’, ‘alice’] 가 주어졌을 경우에는 함수가 True를 반환해야 합니다. 이 경우에는 a가 elice에, b가 alice에 대응되도록 하면 배열을 해당 패턴으로 표현 하는 것이 가능하기 때문이죠.

반면, aabb 와 [‘elice’, ‘alice’, ‘elice’, ‘alice’] 가 주어졌을 경우에는 함수가 False를 반환해야 합니다.
모든 문자는 영어 소문자라고 가정합니다.

문제를 보고 쉬울거라고 생각했다. 패턴을 쪼개서 각 단어에 매칭을 시켜주면 간단히 해결될 것 같았다.
하지만 패턴을 쪼개서 단어에 매칭 시키는 게 간단한 문제가 아니었다.

지금은 a와 b뿐이지만 만약에 단어리스트가 주어지는개 100개라면 abcd…로 매칭시키는게 힘들다.
물론 그 정도까지로 테스트 케이스가 나올 것 같지는 않지만…

따라서, 일일이 패턴을 매칭시켜서 판단하는 건 힘들다고 판단해서 이렇게 가는 건 아니라고 생각했고
다른 방향을 모색했다.

그러던 중에 불현듯 패턴과 단어리스트를 zip해보고 싶어졌다. 일단 길이는 서로 무조건 같을 거니까.
그리고 패턴이 일치하는 것을 찾는 거니까 set을 하면 의미있는 결과가 나올 듯 싶었다.
코드와 결과는 다음과 같다.

1
2
3
pattern = "aabb"

strList = ["elice", "elice", "alice", "alice"]
1
set(zip(pattern, strList))
1
Out : {('a', 'elice'), ('b', 'alice')}

잘 생각해보니, set을 한 pattern하고 길이가 똑같을 것 같았다. 직관적으로 그런 생각이 들었다.
일단 테스트로 다음과 같은 코드를 작성해봤다.

1
2
pattern1 = "abab"
strList1 = "elice", "elice", "alice", "alice"
1
set(zip(pattern1, strList1))
1
Out : {('a', 'alice'), ('a', 'elice'), ('b', 'alice'), ('b', 'elice')}

역시 단어리스트의 패턴이 다르면 주어진 패턴의 set과는 길이가 달랐다.

그래서 전체코드로는 다음과 같이 작성했다.

1
2
3
4
5
6
7
8
9
10
11
def wordPattern(pattern, strList):
return len(set(pattern)) == len(set(zip(pattern, strList)))


def main():
print(wordPattern("aabb", ["elice", "elice", "alice", "alice"])) # should return True
print(wordPattern("abab", ["elice", "elice", "alice", "alice"])) # should return False


if __name__ == "__main__":
main()

빵끗 웃는 토끼
제출결과 빵끗 웃는 토끼가 나왔고, 테스트 점수 100점이 나왔다.

Author

SangHyub Lee, Jose

Posted on

2019-04-17

Updated on

2023-12-08

Licensed under

Comments