일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- React
- BOJ
- 카카오블라인드코딩테스트
- 프로그래머스
- 달빛클럽1기
- 재귀
- 경제공부
- 리액트
- JPA
- HashMap
- Array
- 자바
- dfs
- ReactJS로 영화 웹 서비스 만들기
- 노마드코더 강의
- Stack
- Java
- 완전탐색
- 달빛캠퍼스
- 인플레이션에서 살아남기
- 달빛클럽
- 알고리즘
- React.js
- SoftwareExpertAcademy
- Algorithm
- SWEA
- 노마드코더
- 달빛클럽 1기
- 백준
- programmers
- Today
- Total
th42500의 TIL
[Java] 해시 - 전화번호 목록 (Lv2) 본문
https://school.programmers.co.kr/learn/courses/30/lessons/42577
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
✔ 입출력 예시
💡 포인트
1️⃣ 한 번호가 다른 번호의 접두어인 경우가 있다면 false를 return 해야함
👉 어떤 번호가 다른 어떤 번호의 시작이라면 false를 return
1️⃣ 첫번째 시도
❓ 풀이과정
👉 String클래스의 startsWith() 메서드 이용하기
👉 phone_book 배열을 Arrays.sort()로 정렬한 뒤 반복문을 이용하여 startsWith()로 앞뒤 비교하기
❗ 결과
👉 테스트 통과
✔ 소스코드
import java.util.Arrays;
public class Solution { // 전화번호 목록
public static void main(String[] args) {
// String[] phone_book = {"119", "97674223", "1195524421"};
// String[] phone_book = {"97674223", "119", "1195524421"};
// String[] phone_book = {"123","456","789"};
// String[] phone_book = {"12","123","1235","567","88"};
String[] phone_book = {"819232312", "976", "119552", "2"};
System.out.println(solution(phone_book));
}
private static boolean solution(String[] phone_book) {
Arrays.sort(phone_book);
// 확인
// System.out.println(Arrays.toString(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;
}
}
앞에서 Arrays.sort()로 정렬을 한번 해주었기 때문에
String[] phone_book = {"119", "97674223", "1195524421"}; 👉 String[] phone_book = {"119", "1195524421", "97674223"};
위와 같이 정렬이 되므로 앞뒤로만 startsWith()로 비교를 해도 충분히 답을 구할 수 있었다.
2️⃣ 두번째 시도 (2022.10.07)
Hash에 대한 문제였으므로 Hash로 한번 더 도전해보았다.
❓ 풀이과정
👉 HashSet 이용하기
👉 HashSet에 phone_book에 있는 원소들을 모두 집어 넣은 후 2중 for문을 이용하여 각 phone_book의 원소와
HashSet에 있는 모든 key값들과 비교
👉 HashSet에 있는 Key와 비교할때 각 phone_book의 원소들을 최소 한글자(첫글자)부터 최대 HashSet의 원소의
길이까지만 substring()을 이용하여 잘라서 비교
❗ 결과
👉 테스트 통과
✔ 소스코드
import java.util.HashSet;
public class Solution { // 전화번호 목록
public static void main(String[] args) {
// String[] phone_book = {"119", "97674223", "1195524421"};
// String[] phone_book = {"97674223", "119", "1195524421"};
// String[] phone_book = {"123","456","789"};
// String[] phone_book = {"12","123","1235","567","88"};
String[] phone_book = {"819232312", "976", "119552", "2"};
System.out.println(solution(phone_book));
}
private static boolean solution(String[] phone_book) {
HashSet<String> hash = new HashSet<>();
for (int i = 0; i < phone_book.length; i++) {
hash.add(phone_book[i]);
}
for (String num : phone_book) {
for (int j = 1; j < num.length(); j++) {
if(hash.contains(num.substring(0, j))) {
return false;
}
}
}
return true;
}
}
처음에는 HashSet을 이용한 풀이는 2중 for문을 사용하여 더 오래걸릴 것이라 생각했다.
테스트 결과 HashSet을 이용한 풀이가 배열을 이용한 문제풀이보다 훨씬 시간이 짧게 걸림을 알 수 있었다.
자료구조의 중요성을 다시 생각해보는 문제였다🔥
'Algorithm > Programmers' 카테고리의 다른 글
[Java] 2019 카카오 개발자 겨울 인턴십 - 크레인 인형뽑기 게임 (0) | 2022.03.24 |
---|---|
[Java] 2021 KAKAO BLIND RECRUITMENT - 메뉴리뉴얼 (0) | 2022.03.22 |
[Java] 2019 KAKAO BLIND RECRUITMENT - 오픈채팅방 (0) | 2022.03.17 |
[Java] 해시 - 위장 (Lv2) (0) | 2022.03.01 |
[Java] 해시 - 완주하지 못한 선수(Lv1) (0) | 2022.03.01 |