https://school.programmers.co.kr/learn/courses/30/lessons/42577
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
컬렉션 함수를 잘 이용하면 간단히 풀릴 문제였는데 적절한 사용을 못하고 슬라이딩 윈도우로 풀다가 인덱스바운더리 에러만 맛봤다... 가슴이 아파서 정리해둔다
내가 참 간과한 것이 있는데, String 배열도 배열이라 Arrays.sort() 가 사용가능 하다는 점, 그리고 사전순서대로 정렬이 된다는 점이다.
대체 왜 막연히 길이가 짧은 순서대로 정렬이 된다고 생각했던 걸까... 아래와 같이 시험해보니 길이가 긴 문자열이라도 사전순으로 앞이면 앞에 정렬된다.
String[] s = {"119", "97674223", "1195524421", "11111111111111111111111111"};
for (String s1 : s) {
System.out.println(s1);
}
Arrays.sort(s);
System.out.println();
for (String s1 : s) {
System.out.println(s1);
}
// 출력결과
119
97674223
1195524421
11111111111111111111111111
11111111111111111111111111
119
1195524421
97674223
Arrays.sort() + for문 풀이
이 코드에서 포인트는 String.startsWith() 함수다. 이런 함수가 있다는 사실조차 까먹고 있었다...
이 함수를 사용하면 i와 i+1번째 문자열 중에 어떤것이 더 긴지에 대한 고려를 할 필요도 없다. (함수가 알아서 해주니까...)
import java.util.Arrays;
class Solution {
public boolean solution(String[] phoneBook) {
Arrays.sort(phoneBook);
for (int i = 0; i < phoneBook.length - 1; i++)
if (phoneBook[i + 1].startsWith(phoneBook[i]))
return false;
return true;
}
}
성공은 하는데 좀 느린감이 있다.
HashMap 사용 풀이
해쉬맵 가지고 정말 별의 별짓을 다해봤는데... containsKey() 함수가 포인트다.
정렬할 필요 없이, 문자열 마다 substring(0,j) 씩 부분 문자열을 추출해 containsKey() 로 검색하면 빠르게 해결할 수 있다.
import java.util.HashMap;
class Solution {
public boolean solution(String[] phoneBook) {
HashMap<String, Integer> hp = new HashMap<>();
for (String s : phoneBook) {
hp.put(s, hp.getOrDefault(s, 0) + 1);
}
for (int i = 0; i < phoneBook.length; i++) {
for (int j = 0; j < phoneBook[i].length(); j++) {
if (hp.containsKey(phoneBook[i].substring(0, j))) {
return false;
}
}
}
return true;
}
}
확실히 정렬+for문 보다 성능이 좋다.
'알고리즘 > 문제 풀이' 카테고리의 다른 글
[프로그래머스] 위장(JAVA) / 해시 Level2 (0) | 2023.03.17 |
---|---|
[프로그래머스] 합승 택시 요금(JAVA), 다익스트라, 2021 KAKAO BLIND RECRUITMENT (0) | 2023.02.27 |
[프로그래머스] 파괴되지 않은 건물(JAVA), 2차원 배열 누적합, 2022 KAKAO BLIND RECRUITMENT (0) | 2023.02.23 |
[백준] 6087 : 레이저 통신(JAVA), 다익스트라 (0) | 2023.01.25 |
[백준] 2749 : 피보나치의 수 3 (JAVA) / 피보나치 수 구하는 방법, 재귀, 메모이제이션, 행렬) (0) | 2023.01.19 |
댓글