엘리스 코딩 단어 패턴을 풀어봤다
단어 패턴
문자열(패턴) 하나와 문자열의 배열 하나가 주어집니다.
패턴 문자열의 각각의 문자 하나는, 두번째 문자열 배열의 각각의 문자열 하나에 대응 될 수 있습니다.
해당 배열이 해당 패턴으로 표현 되는지 아닌지의 여부를 확인하는 함수를 만들어 보세요.
예를 들어서, aabb 와 [‘elice’, ‘elice’, ‘alice’, ‘alice’] 가 주어졌을 경우에는 함수가 True를 반환해야 합니다. 이 경우에는 a가 elice에, b가 alice에 대응되도록 하면 배열을 해당 패턴으로 표현 하는 것이 가능하기 때문이죠.
반면, aabb 와 [‘elice’, ‘alice’, ‘elice’, ‘alice’] 가 주어졌을 경우에는 함수가 False를 반환해야 합니다.
모든 문자는 영어 소문자라고 가정합니다.
문제를 보고 쉬울거라고 생각했다. 패턴을 쪼개서 각 단어에 매칭을 시켜주면 간단히 해결될 것 같았다.
하지만 패턴을 쪼개서 단어에 매칭 시키는 게 간단한 문제가 아니었다.
지금은 a와 b뿐이지만 만약에 단어리스트가 주어지는개 100개라면 abcd…로 매칭시키는게 힘들다.
물론 그 정도까지로 테스트 케이스가 나올 것 같지는 않지만…
따라서, 일일이 패턴을 매칭시켜서 판단하는 건 힘들다고 판단해서 이렇게 가는 건 아니라고 생각했고
다른 방향을 모색했다.
그러던 중에 불현듯 패턴과 단어리스트를 zip
해보고 싶어졌다. 일단 길이는 서로 무조건 같을 거니까.
그리고 패턴이 일치하는 것을 찾는 거니까 set
을 하면 의미있는 결과가 나올 듯 싶었다.
코드와 결과는 다음과 같다.
1 | pattern = "aabb" |
1 | set(zip(pattern, strList)) |
1 | Out : {('a', 'elice'), ('b', 'alice')} |
잘 생각해보니, set을 한 pattern하고 길이가 똑같을 것 같았다. 직관적으로 그런 생각이 들었다.
일단 테스트로 다음과 같은 코드를 작성해봤다.
1 | pattern1 = "abab" |
1 | set(zip(pattern1, strList1)) |
1 | Out : {('a', 'alice'), ('a', 'elice'), ('b', 'alice'), ('b', 'elice')} |
역시 단어리스트의 패턴이 다르면 주어진 패턴의 set과는 길이가 달랐다.
그래서 전체코드로는 다음과 같이 작성했다.
1 | def wordPattern(pattern, strList): |
제출결과 빵끗 웃는 토끼가 나왔고, 테스트 점수 100점이 나왔다.