반응형
https://school.programmers.co.kr/learn/courses/30/lessons/148653
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
1. 실패한 풀이 (BFS탐색) 시간초과
package Programmers;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
public class 마법의엘리베이터 {
static int[] ch;
static int[] floor ;
static int minL = Integer.MAX_VALUE;
static Queue<Integer> q = new LinkedList<>();
public static void main(String[] args){
int storey = 2554;
마법의엘리베이터 T = new 마법의엘리베이터();
T.solution(storey);
}
public int solution(int storey) {
int answer = 0;
// -1, 1, -10, 10, -100, 100
List<Integer> tempFloor = new ArrayList<>();
for (int i = 0; i < 10; i++) {
int tempPow = (int)Math.pow(10, i);
tempFloor.add(tempPow);
tempFloor.add(-tempPow);
}
floor = new int[tempFloor.size()];
for (int i = 0; i < tempFloor.size(); i++) {
floor[i] = tempFloor.get(i);
}
ch = new int[100000001]; //층수의 크기만큼 저장
ch[storey] = 1; //시작점 체크
q.offer(storey); //시작점추가
bfs(storey);
answer = minL;
return answer;
}
public void bfs(int s){
int L = 0;
//q 가 빌때까지 돈다
while (!q.isEmpty()){
//q 들어있는 크기만큼 사이즈의 for문을 돈다 bfs 단계를 알기위해서
int qs = q.size();
for (int i = 0; i < qs; i++) {
int t = q.poll();
if(t == 0){
minL = Math.min(minL, L);
return; //q가 0이면 반환한다.
}
//갈수있는 층수만큼 돈다.
for (int j = 0; j < floor.length; j++) {
int nextFloor = t + floor[j];
if(nextFloor >=0 && nextFloor <= 100000000 && ch[nextFloor] == 0){
ch[nextFloor] = 1;
q.offer(nextFloor);
}
}
}
L++; //bfs 한바퀴돌때마다 단계를 추가해준다.
}
}
}
음 탐색범위가 너무 넓다.
1. 수정한 코드
package Programmers;
public class 마법의엘리베이터 {
public static void main(String[] args){
int storey = 2554;
마법의엘리베이터 T = new 마법의엘리베이터();
T.solution(storey);
}
public int solution(int storey) {
int answer = 0;
//storey가 0이 될때까지 돌린다.
while (storey != 0){
int cur = storey % 10;
int next = (storey / 10) % 10;
if(cur > 5){
answer += 10 - cur; //6이면 4만큼 버튼을 누른거다.
storey += 10;
}else if(cur == 5){
//앞자리가 4이하면 현재자리수의 5는 빼는게 이득 앞자리가 6이면 현재자리 5는 더하는게 이득
answer += 5; //cur가 5면 더하거나 빼는건 카운팅이 똑같은데 next 숫자만 더해줄지 그냥 냅둘지 정하면됨
if(next >= 5){
storey += 10; //next가 5보다 크면 10을 더해주면 현재 storey에서 next +1 이된다.
}else{
storey += 0; //5보다 작으면 기냥 냅둔다.
}
}else{
answer += cur;
}
storey /= 10; //1의 자리숫자는 계산된거니까 날려준다.
}
return answer;
}
}
1. 10 의 배수만 버튼으로 주어지니까 단순 경우의수만 생각하고 1의 자리 숫자가
5보다 큰지, 5인지 > (10의자리 숫자가 5보다 큰지 5보다 작은지), 5보다 작은지
※ 알고리즘 공부하다보니 DFS BFS 중독인거같다
최소거리나 경우의수 보면 DFS BFS 쓰고싶음 (쓰고나면 시간초과될까바 두렵)
(버튼의 종류가 임의의 숫자면 BFS를 썼어야겠지만 10의 배수이기때문에 쉽게 풀린다. )
반응형
'기타 > 알고리즘' 카테고리의 다른 글
[알고리즘] 프로그래머스 - 점찍기 (Java) (0) | 2023.04.30 |
---|---|
[알고리즘] 프로그래머스 - 테이블 해시함수 Java (0) | 2023.04.28 |
[알고리즘] 프로그래머스 - 이모티콘할인행사 (java) - dfs 탐색 (0) | 2023.04.26 |
[알고리즘] 프로그래머스 -택배 배달과 수거하기 (Java) (0) | 2023.04.25 |
[알고리즘] 프로그래머스 (개인정보 수집 유효기간) Java (1) | 2023.04.24 |