배경
- 알고리즘 문제를 풀던 도중 하나의 테스트 케이스만 실패하는데, 도무지 해당 테스트 케이스가 무엇인지 모르겠는 상황이 있었다.
문제 상황
- 프로그래머스 - 단어 변환 문제를 풀고 최종 제출 하였는데, 테스트케이스 3번이 계속 실패했다.
- 어디가 문제일까 고민하며 BFS 알고리즘만 고민하고 있었다.
무엇이 문제였나
- 해당 문제의 질문 탭에서 힌트를 얻었다.
- 다른 단어와 비교하여 한 글자만 다른지 아닌지를 판별하는 로직이 문제였다.
- aab 와 aac 는 한 글자가 다르다. true!
- abc와 acd는 두 글자가 다르다. false
- 나는 해당 로직을 Set을 사용해 구현했었다.
func compare(_ lh: String, _ rh: String) -> Bool {
let lhSet = Set(lh)
let rhSet = Set(rh)
return lhSet.intersection(rhSet).count == lhSet.count - 1
}
- 그러나 위 로직은 서로 다른 위치의 글자가 다른 경우도 한 글자만 다른 단어로 식별하게 된다.
- aab와 caa도 true를 반환
- 그러나 같은 자리의 글자가 다른 경우에만 true를 반환해야 한다.
- 아래와 같이 배열로 변환해 각 인덱스의 글자마다 일대일 비교를 통해 서로 다른 글자의 갯수를 알아내는 로직으로 변환해 문제를 해결하였다.
func compare(_ lh: String, _ rh: String) -> Bool {
let lhArr = Array(lh)
let rhArr = Array(rh)
var diffCount = 0
for i in lhArr.indices {
if lhArr[i] != rhArr[i] {
diffCount += 1
}
}
return diffCount == 1
}
오늘의 교훈
- 문제 조건을 잘 읽기!
- 잘 안 풀릴 땐 전체 코드 재점검하기.