알고리즘 문제 풀이/프로그래머스

[프로그래머스] (JAVA) Lv2 전화번호 목록

2023. 7. 1. 03:36
목차
  1. 문제
  2. 나의 풀이
  3. 문법 정리

문제

https://school.programmers.co.kr/learn/courses/30/lessons/42577

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

설명

입출력

나의 풀이

풀이 과정

첫 번째 입출력 예제인 phone_book = ["119", "97674223", "1195524421"]를 예로 들어서

처음에는 "119"가 어떤 번호의 접두어인지에 집중해서 풀이를 생각했다.

모든 배열을 돌면서 각 번호가 다른 번호의 접두어인지 모든 번호를 잘라서 확인하는 코드를 작성했다.

class Solution {
    public boolean solution(String[] phone_book) {
        boolean answer = true;

        int l = 0;

        for(String phone : phone_book) {
            l = phone.length();
            for(String other : phone_book) {
                try {
                    if(other.length() == l) {
                        continue;
                    } else {
                        if(phone.equals(other.substring(0,l))) {
                            answer = false;
                        } else {
                        }
                    }
                } catch (StringIndexOutOfBoundsException e) {
                }
            }

        }
        return answer;
    }
}

for each 문을 사용해서 phone에 기준 번호를 담고 phone의 길이만큼 나머지 번호들의 접두어를 substring으로 추출했다.

이때 phone의 길이보다 짧은 번호에 substring을 하면 StringIndexOutOfBoundsException가 발생하기 때문에

try, catch로 예외 처리를 해주었다. 

정확성 테스트는 통과했는데 효율성 테스트는 전부 실패였다.

정확성 테스트에서의 시간을 보니 2중 for문 안에 조건문, equals, substring 등 이 겹쳐져서 시간이 오래 걸리는 것 같다. 

다른 코드들을 참고한 결과

처음에 생각한 "119"가 어떤 번호의 접두어인지가 아닌 "119"의 접두어가 존재할까?에 초점을 맞춰서 생각해야 했다. 

import java.util.*;

class success {
    public static boolean solution(String[] phone_book) {
        boolean answer = true;

        Set<String> hs = new HashSet<String>();

        for(String num : phone_book) {
            hs.add(num);
        }

        for(String phone : phone_book) {
            for(int i=1; i < phone.length(); i++) {
                if (hs.contains(phone.substring(0,i))){
                    answer = false;
                }
            }
        }
        return answer;
    }

}

첫 for문에 "119"가 들어왔을 때 두 번째 for문 안에서 substring으로 "1" ,"11", "119" 가 hashset안에 있는지 확인하며

접두어가 존재하는지 확인하는 것이다. 

효율성 테스트까지 잘 통과 되었다. 

 

문법 정리

  • 문자열 비교 ==와 equals()의 차이
    • int나 boolean 같은 데이터는 ==로 비교
    • String 타입에서 ==는 주소값을 비교하는 것이다. (값이 같아도 주소가 다르면 false)
    • equals()는 문자열의 값 자체를 비교한다. st.equals("ab") 이런식으로 사용

참고 블로그 + 나중에 다시 읽어보기!

==와 equals의 차이 : https://sudo-minz.tistory.com/93

String에 대하여 : https://aljjabaegi.tistory.com/465

'알고리즘 문제 풀이 > 프로그래머스' 카테고리의 다른 글

[프로그래머스] (JAVA) Lv2 카펫  (0) 2023.07.02
[프로그래머스] (JAVA) Lv1 최소직사각형  (0) 2023.07.01
[프로그래머스] (JAVA) Lv0 배열 조각하기  (0) 2023.06.01
[프로그래머스] (JAVA) Lv0 더 크게 합치기  (0) 2023.06.01
[프로그래머스] (JAVA) Lv0 문자열 겹쳐쓰기  (0) 2023.05.31
  1. 문제
  2. 나의 풀이
  3. 문법 정리
'알고리즘 문제 풀이/프로그래머스' 카테고리의 다른 글
  • [프로그래머스] (JAVA) Lv2 카펫
  • [프로그래머스] (JAVA) Lv1 최소직사각형
  • [프로그래머스] (JAVA) Lv0 배열 조각하기
  • [프로그래머스] (JAVA) Lv0 더 크게 합치기
노루스름한맛
노루스름한맛
노루스름한맛
이몸의 블로그
노루스름한맛
전체
오늘
어제
  • 분류 전체보기 (33)
    • 대외 활동 (1)
      • 구름톤 풀스택 1기 (0)
    • 프로젝트 (4)
      • Reviewing(리뷰잉) (4)
    • 알고리즘 문제 풀이 (21)
      • 프로그래머스 (17)
      • 백준 (4)
    • Spring (1)
    • JAVA (1)
    • React native (1)
    • CI,CD (2)
    • TIL & 일기 (2)
      • TIL (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 프로그래머스더맵게
  • OpenSearch
  • 백준색종이만들기
  • rosetta
  • jenkins
  • 더맵게
  • Java
  • 백준
  • cicd
  • expogo
  • 전화번호목록
  • reviewing
  • 프로그래머스단어변환
  • 폰켓몬
  • 색종이만들기
  • 게임맵최단거리
  • 프로그래머스
  • 전국장애비장애대학생창업경진대회
  • 프로그래머스폰켓몬
  • 최소직사각형
  • 같은숫자는싫어
  • embeddings
  • 카펫
  • 리뷰잉
  • 재귀함수
  • 프로그래머스카펫
  • elasticsearch

최근 댓글

최근 글

hELLO · Designed By 정상우.
노루스름한맛
[프로그래머스] (JAVA) Lv2 전화번호 목록
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.