Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 가장 긴 증가하는 부분 수열2
- 11758번
- 10830번
- java
- 1300번
- Design Pattern
- Adapater Pattern
- BOJ
- 클린코드
- 9장
- 11286번
- Spring
- 백준
- 2166번
- SerialDate 리펙터링
- java의 정석
- programmers
- 냄새와 휴리스틱
- 프로그래머스
- springboot
- 1043번
- 17장
- 코딩 테스트
- Dxerr.h
- 코딩테스트
- DxTrace
- 2156번
- Design Patterns
- 2206번
- 자바의 정석
Archives
- Today
- Total
Don't give up!
[프로그래머스] 전화번호 목록 본문
코딩테스트 연습 - 전화번호 목록 | 프로그래머스 (programmers.co.kr)
어떻게 생각하고 문제를 풀었는가?
특정 원소가 다른 원소의 접미사인지 확인하기 위해 주어진 원소들을 먼저 저장하고, 각 원소들의 가능한 접미사가 저장한 원소에 해당한다면 false를 반환하는 방식으로 문제를 해결할 수 있을 것이라고 생각하였습니다.
코드
import java.util.*;
class Solution {
public boolean solution(String[] phone_book) {
Set<String> set = new HashSet<>();
for (String s : phone_book) set.add(s);
for (String s : phone_book)
for (int i = 0; i < s.length(); i++)
if (set.contains(s.substring(0, i))) return false;
return true;
}
}
중복을 허용하지 않는 컬렉션 HashSet에 문자열들을 먼저 저장하고, 각 문자열들을 substring으로 접미사들을 만들어 검사하는 방법으로 테스트를 통과하였습니다.
생성한 접미사가 HashSet에 포함되어 있는경우 다른 검사를 수행할 필요 없이 false를 반환, 모든 검사를 수행하였을 때 false가 리턴되지 않으면 true를 반환합니다.
개선
import java.util.*;
class Solution {
public boolean solution(String[] phone_book) {
Arrays.sort(phone_book);
for(int i=0; i<phone_book.length-1; i++){
if(phone_book[i+1].startsWith(phone_book[i])) return false;
}
return true;
}
}
String의 startsWith함수는 접미사를 검사하는 함수입니다. 해당 함수를 사용하여 문자열이 접미사인지 확인할 수 있습니다.
문자열들을 사전순으로 정렬하였을 때 같은 접미사에서 길이가 더 긴 문자열이 순서가 뒤에 있습니다.
앞의 문자가 순서상 뒤의 문자열에 접미사로 포함되는지 확인함으로서 검사 횟수를 줄일 수 있고, 접미사가 다르다면 이후 문자열들도 접미사가 다름을 의미하므로 앞의 문자열과 뒤의 문자열만 검사하여 결과를 찾을 수 있습니다.
'Coding Test > Programmers' 카테고리의 다른 글
[프로그래머스] 단체사진 찍기 (java) (0) | 2021.06.21 |
---|---|
[프로그래머스] 방문 길이 (java) (0) | 2021.06.02 |
[프로그래머스] 가사 검색 (java) (0) | 2021.05.31 |