today_is

[ 알고리즘 ] 프로그래머스 - 전화번호 목록 본문

카테고리 없음

[ 알고리즘 ] 프로그래머스 - 전화번호 목록

ye_rang 2024. 6. 4. 17:39

 

 

 작성한 코드 

import java.util.*;

class Solution {
    public boolean solution(String[] phone_book) {
        boolean answer = true;
        
        HashMap<String,Integer> map = new HashMap<>();
        
        for(String str : phone_book) {
            map.put(str, 1);
        }
        
        for(String str : phone_book) {
            for(int i=1; i < str.length(); i++) {
                String prefix = str.substring(0, i);
                
                if(map.containsKey(prefix)) {
                    return false;
                }
            }
        }
    
        return answer;
    }
}

 

 

 한줄씩 해석해보기 

answer는 true로 초기화

 

HashMap은 key(String) , value(Integer) 형태로 만든다

 

배열 phone_book의 각각을 str이라고 하자 {

     map.put을 이용하여, 모든 str을 추가함 (value는 1)

}

 

배열 phone_book의 각각을 str이라고 하자 {

     i는 1부터 str의 길이만큼 i++ {

          prefix 에는 subString을 이용해서 str의 모든 글자를 담음 (이때, i는 1부터 str의 길이만큼)

          

          만약, map의 key중에서 prefix를 포함한다면 {

                 false를 반환하여 반복문 중단

           }

     }

}

return answer;   (if조건이 끝까지 성립하지 않는 경우는 true를 반환)

 

 


 

 틀렸던 방식 

import java.util.*;

class Solution {
    public boolean solution(String[] phone_book) {
        boolean answer = true;
        
        HashMap<String,Boolean> map = new HashMap<>();
        
        for(String str : phone_book) {
            for(int i=0; i <= str.length(); i++) {
                String prefix = str.substring(0,i);
                
                if(map.containsKey(prefix) && !prefix.equals(str)) {
                    answer = false;
                }
            }
            answer = true;
        }

        return answer;
    }
}

 

 

 수정한 부분 

(중략)

if(map.containsKey(prefix) && !prefix.equals(str)) {
	answer = false;
    }
}
answer = true;

 

1) 결과값이 true로 고정되어버리는 문제

if문을 이용해서 기껏 false로 적용했는데

다시 answer = true 때문에 반복문을 이어가면서 모든게 true로 바뀌어버렸음

 

 

2) 반복문이 끊기는 문제

또한, 반복문을 통해서 계속해서 비교를 해야하기 때문에

만약 i번째의 str이 접두어가 아니더라도, (= 결과가 true라고해도)

다음을 또 비교하기 위해서 map.put 을 이용하여 추가해줘야함(대신, true로 추가)

 

-> 처음부터 map의 value를 Integer형태로 1로 초기화해버리자.

중간에 또 put하는게 비효율적인듯 

 

 

 

3) if문에 걸리지 않는다면, true를 반환

굳이 answer에 true를 대입하지 않아도 괜찮은 이유는 !

answer의 초기값이 true이고,

맨 마지막 문장에 의하여 answer를 return하기 때문이다

 

 

4) false조건이 성립한다면 반복중지.

false일 경우에는 더이상 반복하지 않아도 되니까 그냥 바로 return false

 

 

5) 어차피 HashSet의 key값은 중복불가능