[프로그래머스 Level2] 전화번호 목록 - 자바(java) | 해쉬 사용

2022. 6. 5. 16:10·💻 개발/알고리즘
728x90
반응형
🌌프로그래머스 전화번호목록 - 자바(java)

 

📚 문제 설명

전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.
전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.

  • 구조대 : 119
  • 박준영 : 97 674 223
  • 지영석 : 11 9552 4421

전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.


👨🏻‍💻 제한 조건

  • phone_book의 길이는 1 이상 1,000,000 이하입니다.
    • 각 전화번호의 길이는 1 이상 20 이하입니다.
    • 같은 전화번호가 중복해서 들어있지 않습니다.

📖 예시

💻 입력 | 출력

phone_book	                  |   return
["119", "97674223", "1195524421"] |	  false
["123","456","789"]               |	  true
["12","123","1235","567","88"]	  |   false

💻 작성 코드

import java.util.HashMap;
class Solution {
    public boolean solution(String[] phone_book) {
        HashMap<String, Integer> map = new HashMap<>();        
       
        for(String phone_number : phone_book) {  // (1)
            map.put(phone_number, 1);
        }
        
        for(String phone_number : phone_book) { // (2)                
            for(int j = 1; j < phone_number.length(); j++) {   //(3)                                
                String prefix = phone_number.substring(0, j);  //(4)           
                if(map.containsKey(prefix))  //(5)
                    return false;
            }
        }
        return true;        
    }
}

🗝️ 해석 

  1. phone_book[]을 for문을 사용해서 HashMap에 저장 (key : value = phone_number : 1)
    - 해당 값은 추후 비교할 때 사용 
  2. for문 사용하여 문자열의 길이를 구하기 위한 세팅 진행
  3. 문자열의 길이를 구함. 이때 j = 1부터 선언
  4. j와 phone_number.length()의 값으로 substring()로  prefix 값을 구함 
  5. (1)번에 담아 둔 값과 비교해서 있을 경우 false 없을 경우 true 
phone_number.length(): 3
j: 1
j: 2
phone_number.length(): 8
j: 1
j: 2
j: 3
j: 4
j: 5
j: 6
j: 7
phone_number.length(): 10
j: 1
j: 2
j: 3

 


🥲 잘못 풀었던 부분 

import java.util.HashMap;
class Solution {
    public boolean solution(String[] phone_book) {
        HashMap<String, Integer> map = new HashMap<>();        
       
        for(String phone_number : phone_book) { 
            map.put(phone_number, 1);
        }
        
          for(String phone_number : phone_book) {          
            Integer j = phone_number.length();  // (1)
            String prefix = phone_number.substring(0, j);
                if(map.containsKey(prefix))  
                    return false;                                           
          } return true;
     }
}

print로 찍어보니 length의 가장 최대 값(2, 7, 3)을 통해서 "prefix"에 값을 담는걸 알아냄

[이중 for문 경우의 j의 값] 

phone_number.length(): 3
j: 1
j: 2
phone_number.length(): 8
j: 1
j: 2
j: 3
j: 4
j: 5
j: 6
j: 7
phone_number.length(): 10
j: 1
j: 2
j: 3

그래서 Integer j = phone_number.length();로 선언했고, 최대한 for문을 안돌게 수정했다.

(1)번에 for문 대신 phone_number의 length만 찍게 했는데

2번째 입출력값인 ["123","456","789"] 의 값이 true가 나와야하는데 false가 나왔다.

 

해결

애초에 접근 법이 잘못됨

Integer j = phone_number.length(); 값은 map에 포함되어 있어 if문을 무조건 탐 

j의 값으로 최대값이 되기 전 값이 있는지 체크에 걸리게 해야함. 

 

 

728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'💻 개발 > 알고리즘' 카테고리의 다른 글

콜라츠 추측 함수로 쪼개어 풀어보기  (0) 2022.10.01
[프로그래머스 Level1] k번째 수 구하기 - 자바(java) | 정렬  (0) 2022.06.08
[프로그래머스 Level1] 완주하지 못한 선수 - 자바(Java) | 해시 사용하기  (0) 2022.06.04
[프로그래머스Level1] 핸드폰 번호 가리기 - 자바(java)  (0) 2022.06.04
[프로그래머스 Level1] 직사각형 별찍기-자바(Java)  (0) 2022.06.04
'💻 개발/알고리즘' 카테고리의 다른 글
  • 콜라츠 추측 함수로 쪼개어 풀어보기
  • [프로그래머스 Level1] k번째 수 구하기 - 자바(java) | 정렬
  • [프로그래머스 Level1] 완주하지 못한 선수 - 자바(Java) | 해시 사용하기
  • [프로그래머스Level1] 핸드폰 번호 가리기 - 자바(java)
foodev
foodev
이것저것 개발과 이것저것 리뷰 합니다.
    반응형
    250x250
  • foodev
    개발 개맛집
    foodev
  • 전체
    오늘
    어제
    • 분류 전체보기 (109)
      • 🌟🙇🏻‍♂️ 꼭 읽어봤으면 하는 글 (4)
      • 💻 개발 (72)
        • 설정 및 세팅 (4)
        • DB&서버&네트워크&암호 (11)
        • React (0)
        • JPA, Querydsl (13)
        • 알고리즘 (7)
        • 언어 (15)
        • 프레임워크 (12)
        • HTML, CSS (10)
      • ✍🏻 (33)
        • 회고록 (16)
        • 독서록 (7)
        • 일지록 (9)
        • 세미나 (1)
      • 💡 리뷰 (0)
        • 제품리뷰 (0)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    스냅샷과로그성
    서이추
    validation failed (numeric string is expected)
    githubaction 라벨 배포
    스냅샷과히스토리성 차이
    di동작원리
    di란
    typedi 동작원리
    db 날림
    QueryDSL
    typedi란
    해피해킹 키매핑
    di의존성
    해피해킹 꿀팁
    nestjs pipe
    토이프로젝트개발일지
    디비스냅샷
    JPA
    해피해킹 방향키
    db 초기화
    nestjs pipe body
    창업패키지후기
    해피해킹 카라비너
    스냅샷과 히스토리
    githubaction 라벨 ci/cd
    스냅샷방식
    azure ci/cd
    해피해킹 커스텀
    db 날린 썰
    개발썰
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
foodev
[프로그래머스 Level2] 전화번호 목록 - 자바(java) | 해쉬 사용
상단으로

티스토리툴바