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

2022. 6. 5. 16:10·📂 Backend Engineering
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
반응형
저작자표시 비영리 변경금지 (새창열림)

'📂 Backend Engineering' 카테고리의 다른 글

@Transactional에 대해 / @Transactional(readOnly = false) @Transactional(readOnly = true) 차이  (0) 2022.06.23
[프로그래머스 Level1] k번째 수 구하기 - 자바(java) | 정렬  (0) 2022.06.08
[프로그래머스 Level1] 완주하지 못한 선수 - 자바(Java) | 해시 사용하기  (0) 2022.06.04
[프로그래머스Level1] 핸드폰 번호 가리기 - 자바(java)  (0) 2022.06.04
@PutMapping이용시 오류메시지 해결하기 / not-null property references a null or transient value  (0) 2022.05.27
'📂 Backend Engineering' 카테고리의 다른 글
  • @Transactional에 대해 / @Transactional(readOnly = false) @Transactional(readOnly = true) 차이
  • [프로그래머스 Level1] k번째 수 구하기 - 자바(java) | 정렬
  • [프로그래머스 Level1] 완주하지 못한 선수 - 자바(Java) | 해시 사용하기
  • [프로그래머스Level1] 핸드폰 번호 가리기 - 자바(java)
foodev
foodev
이것저것 개발과 이것저것 리뷰 합니다.
    반응형
    250x250
  • foodev
    개발 개맛집
    foodev
  • 전체
    오늘
    어제
    • 분류 전체보기 (103)
      • ⭐ Featured (4)
      • 📂 Backend Engineering (36)
      • 📂 Troubleshooting & Ops (10)
      • 📂 Infra & System (7)
      • 📂 Reflections (20)
        • Year-in-Review (4)
        • Work & Career (10)
        • Lessons Learned (6)
      • 📂 Team Journal (10)
      • 📂 Archive (16)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

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

티스토리툴바