https://school.programmers.co.kr/learn/courses/30/lessons/84512
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
오늘의 문제는 사전에 문자열을 집어넣고 문자열을 입력받으면
해당 문자열의 순서를 return 하는 문제였다.
dic이라는 priorityQueue에 문자열로 이루어진 후보들을 집어넣고
순서대로 빼다가 답이랑 일치하면 출력하면 되는
아주 간단한 문제이다.
dfs를 통해서 사전에 하나씩 집어넣어주고 답을 출력했는데 크게 두개의 문제가 있었다.
어제 부터 쓰기로 한 stream이 import 되지 않았다는 것과
단어가 최대 5자리라고 했지 그 이하의 값들을 생각해 주어야 한다는 점이다.
첫번째 문제는 import java.util.*;를 해주었지만
stream에 한해서는 import java.util.stream.Collectors를 직접 해주어야 한다고 했다.
배열에 "" 하나를 입력해 길이 5이하의 것들을 고려해 주었지만
반복이 일어난다는 점이 문제가 되었다.
그래서 set에 입력 후 다시 PriorityQueue에 입력했는데
그냥 contains를 사용했어도 좋을 것 같다.
아 매일 TIL작성 시 다른 사람의 풀이도 참고하기로 다짐했다.
푸는 것 보단 코드 리뷰가 더 중요하다는 이야기를 들었기 때문이다.
개선사항
TreeSet이라는 개념이 있다. 순서가 있는 Set인데 사용한다면 set에 집어넣어 중복을 제거하고
priorityQueue에 다시 집어넣는 멍청한 짓을 하지 않아도 된다.
역시 머리가 나쁘면 몸이 고생하는 법이다.
import java.util.*;
import java.util.stream.Collectors;
import java.io.*;
class Solution {
static String[] str = {"", "A","E", "I","O","U"};
static Set<String> dic = new HashSet<>();
static PriorityQueue<String> dic2 = new PriorityQueue<>();
public int solution(String word) {
//선택할 수 있는 만큼 다 집어 넣고 정렬 후 출력
dfs(0, new String[5]);
dic2.addAll(dic);
int answer = 0;
while(!dic2.isEmpty()){
if(dic2.poll().equals(word)){
return answer;
}
answer++;
}
return answer;
}
static void dfs(int depth, String[] list){
if(depth == 5){
// 사전에 넣기
String temp = Arrays.asList(list).stream().collect(Collectors.joining());
dic.add(temp);
return;
}
for(int i = 0; i < 6; i++){
list[depth] = str[i];
dfs(depth +1, list);
}
}
}
'알고리즘 > java' 카테고리의 다른 글
<java>백준 4374 - map (0) | 2024.05.31 |
---|---|
<java> 전력망을 둘로 나누기 - tree, 완전 탐색 (0) | 2024.05.29 |
<java> Orderly Queue (0) | 2024.05.27 |
<java> put marbles in bags (0) | 2024.05.26 |
<java> 프로그래머스 디스크 컨트롤러 : 우선순위 큐 (0) | 2024.05.24 |