(67)

[Java] 단어 퍼즐 - Lv4 프로그래머스 / DP

문제 링크 https://school.programmers.co.kr/learn/courses/30/lessons/12983?language=java 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 풀이 DP를 사용하여 Bottom Up으로 풀이했고, 문제 예시에서의 banana로 예를 들어보자. b ba ban bana banan banana dp배열의 각 idx는 위의 값들을 만족하는 최소값들로 채워나갔다. strs의 원소에서, t의 인덱스마다 같은 substring이 있는지 확인하였고, 같다면 dp배열에 입력해나갔다. //strs에서 선택한 문자열과 ..

[Java] N으로 표현 - Lv3 프로그래머스 / 동적 계획법(Dynamic Programing)

https://school.programmers.co.kr/learn/courses/30/lessons/42895 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 첫 풀이 최소 반복 횟수를 구하는 문제이기 때문에 Bottom-Up방식을 활용해서 8번 반복할 때까지 해당 해가 있는지 찾고, 반복횟수가 9번째가 될 때 answer = -1로 리턴해주게 하자.. 라고 생각하며 코드를 작성했다. (DP공부를 한 뒤, 간단한 문제들을 풀고 처음으로 푸는 높은 난이도(??)의 문제라 설명이 부족할 수 있음.. 지나가던 고수분들 계시면 고쳐주시면 감사하겠습니다. 많은 ..

[Java] H-Index - Lv2 프로그래머스 정렬 / 프로그래머스 고득점 Kit

https://school.programmers.co.kr/learn/courses/30/lessons/42747 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 풀이 1. i의 최대길이를 논문의 인용 횟수 최대 크기 h로 설정 2. h번 이상 인용된 논문이 h편 이상이고.... 문제 설명에 말이 좀 애매한데 다시 설명하면 - ex)h=3 : 3번 이상 인용된 논문이 3편 이상이다. 똑같나..?ㅋㅋ;; 3. 인용된 횟수를 세는 cnt 변수를 통해 h번 이상 인용된 논문일 경우 ++; 4. 인용된 논문 개수가 조건 횟수 이상일경우 answer에 넣는다. - ..

[Java] K번째수 - Lv1 정렬 프로그래머스 / 프로그래머스 고득점 Kit

https://school.programmers.co.kr/learn/courses/30/lessons/42748 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 풀이 import java.util.Arrays; class Solution{ public int[] solution(int[] array, int[][] commands) { int[] answer = new int[commands.length]; int ansidx=0; for(int i=0; i

[Java] 모음사전 - Lv2 프로그래머스 완전탐색 / 코딩테스트 고득점 Kit

https://school.programmers.co.kr/learn/courses/30/lessons/84512 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 풀이 DFS를 이용해서 간단하게 풀어냈다. class Solution { static int idx = 0; static int answer = -1; public int solution(String word) { dfs(word, ""); return answer; } public void dfs(String word, String text) { if(answer > 0) return; if(w..

[Java] 피로도 - Lv2 프로그래머스 완전탐색 / 코딩테스트 고득점 Kit

https://school.programmers.co.kr/learn/courses/30/lessons/87946 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 풀이 이제 어느정도 기본 DFS문제는 감이 온 것 같다 백트래킹으로 던전 탐사가 가능한 최대값을 구해줬다. class Solution { static int join = 0; public int solution(int k, int[][] dungeons) { boolean[] bl = new boolean[dungeons.length]; dfs(dungeons, bl, 0, k, 0, 0); re..

[Java] 숫자 뽑기 - 프로그래머스 / COS Pro 1급 Java 모의고사

https://school.programmers.co.kr/learn/courses/11132/lessons/71156 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 풀이 문제에서, K만큼을 뽑아내어 가장 큰 수 - 가장 작은 수의 최소를 구하라고 했다. 처음에는 재귀를 통해 완전탐색을 하려하다가, 정렬을 통해 K만큼을 뽑아내면 되지 않나 생각했더니 엄청 간단하게 풀렸다. 1. 오름차순 정렬 후 answer 초기화 (배열의 가장 큰 수인 arr의 마지막값) 2. K를 뽑을 수 있는 경우의 수인 arr의길이-K만큼만 반복을 돌린다. 3. 돌리는 과정에서, ..

[Java] 카펫 - Lv2 프로그래머스 완전탐색 / 코딩테스트 고득점 Kit

https://school.programmers.co.kr/learn/courses/30/lessons/42842# 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 풀이 1. div메서드를 통해 총 카펫 크기의 약수를 모조리 구한다. public void div(int sum) { for(int i=1; i

[Java] 단어 퍼즐 - Lv4 프로그래머스 / DP

P.S./프로그래머스 2023. 8. 9. 21:57
728x90
728x90

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/12983?language=java 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

풀이

DP를 사용하여 Bottom Up으로 풀이했고, 문제 예시에서의 banana로 예를 들어보자.

 

b

ba

ban

bana

banan

banana

 

dp배열의 각 idx는 위의 값들을 만족하는 최소값들로 채워나갔다.

strs의 원소에서, t의 인덱스마다 같은 substring이 있는지 확인하였고, 같다면 dp배열에 입력해나갔다.

//strs에서 선택한 문자열과 t의 부분이 일치하는지 확인
if(word.equals(t.substring(i - wordLength, i))) {
	//word하나로 현재까지의 문자를 만들 수 있을 경우ⓐ
    if(i - wordLength == 0) {
        dp[i] = 1;
        continue;
    }
    //이전에 만든 문자열이 있을 경우
    if(dp[i - wordLength] > 0) {
    	//dp[i]가 0일 경우, 이전 위치까지의 최소단어개수에서 + 1처리를,
        dp[i] = dp[i] == 0 ? dp[i - wordLength] + 1
        //dp[i]가 이미 채워져있다면(위의 ⓐ경우를 만족했던 경우. ex)ba, a)
        //둘 중 비교하여 작은 경우의 수를 입력
        : Math.min(dp[i], dp[i - wordLength] + 1);
    }
}

 

import java.util.*;

class Solution {
    public int solution(String[] strs, String t) {
        int tLength = t.length();
        int strsLength = strs.length;
        int[] dp = new int[tLength + 1];

        for(int i = 1; i < tLength + 1; i ++) {
            for(int j = 0; j < strsLength; j ++) {
                String word = strs[j];
                int wordLength = word.length();
                if(i - wordLength < 0) continue;

                if(word.equals(t.substring(i - wordLength, i))) {
                    if(i - wordLength == 0) {
                        dp[i] = 1;
                        continue;
                    }
                    if(dp[i - wordLength] > 0) {
                        dp[i] = dp[i] == 0 ? dp[i - wordLength] + 1 : Math.min(dp[i], dp[i - wordLength] + 1);
                    }
                }
            }
        }

        int answer = dp[tLength];
        if (answer == 0) return -1;
        return answer;
    }


    public static void main(String[] args) {
        Solution sol = new Solution();
        sol.solution(new String[]{"ba", "na", "n", "a"}, "banana");
    }
}

 

 

728x90
300x250
mag1c

mag1c

2년차 주니어 개발자.

[Java] N으로 표현 - Lv3 프로그래머스 / 동적 계획법(Dynamic Programing)

P.S./프로그래머스 2023. 5. 8. 08:21
728x90
728x90

https://school.programmers.co.kr/learn/courses/30/lessons/42895

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

첫 풀이


최소 반복 횟수를 구하는 문제이기 때문에

Bottom-Up방식을 활용해서 8번 반복할 때까지 해당 해가 있는지 찾고, 반복횟수가 9번째가 될 때

answer = -1로 리턴해주게 하자.. 라고 생각하며 코드를 작성했다.

 

(DP공부를 한 뒤, 간단한 문제들을 풀고 처음으로 푸는 높은 난이도(??)의 문제라 설명이 부족할 수 있음.. 지나가던 고수분들 계시면 고쳐주시면 감사하겠습니다. 많은 도움이 됩니다 (__ )꾸벅)

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

class Solution {	
	int answer = 0;
	
    public int solution(int N, int number) {
    	if(N==number) return N;
    	
    	Set<Integer> set = new HashSet<Integer>() {{
    		add(N);
    		add(N+N);
    		add(N-N);
    		add(N*N);
    		add(N/N);
    		add((10*N) + N);
    	}};
    	
    	if(chk(set, number, 2)) return answer;
    	
    	dp(N, number, 3, set);
    	
    	System.out.println(answer);
    	return answer;
    }
    
    public void dp(int N, int number, int idx, Set<Integer> set) {
    	if(idx==9) {
    		answer = -1;
    		return;
    	}
    	
    	Set<Integer> num_set = new HashSet<>();
    	Iterator<Integer> iter = set.iterator();
    	while(iter.hasNext()) {
    		int num = iter.next();
    		num_set.add(num+N);
    		num_set.add(num-N);
    		if(num!=0) {
    			num_set.add(num*N);
        		num_set.add(num/N);
        		num_set.add((num*10)+N);
        		num_set.add(N/num);
    		}   		    		
    		num_set.add(N+num);
    		num_set.add(N-num);    		
			num_set.add(N*num);		    		    		
    	}
    	
    	if(chk(num_set, number, idx)) return;
    	
    	dp(N, number, idx+1, num_set);
    }
    
    public boolean chk(Set<Integer> set, int number, int idx) {
    	Iterator<Integer> iter = set.iterator();
    	while(iter.hasNext()) {
    		if(iter.next().equals(number)) {
    			answer = idx;
    			return true;
    		}
    	}
    	return false;
    }
}

 

테스트케이스를 무난하게 통과해서 제출해보았다. 과연?

 

그럼그렇지... 근데 실패하면 실패했지 왜 44.4점이냐  기분나쁘게 ..;;

 

생각해봤는데.. 내 코드는 아래와 같은 문제가 있었음(N이 4번 들어가야하는 상황부터 문제가 발생)

N이 3번 들어가는 상황에서

1번 ↔ 2번 / 2번 ↔ 1번 두가지를 모두 고려해서 set을 만듬.

 

N이 4번 들어가는 상황에서

3번 ↔ 1번 / 1번 ↔ 3번 이 두가지 상황만 고려하다보니 2번 ↔ 2번의 경우를 고려하지 못함...

(이걸 더 예쁘게 설명하지 못하겠다 .. ㅠㅠ)

 

그럼 N이 5번 돌아가는 상황에서

1 ↔ 4 / 2 ↔ 3 / 3 ↔ 2 / 4 ↔ 1의 경우를 고려해야하고.

6번의 경우

1 ↔ 5 / 2 ↔ 4 / 3 ↔ 3 / 4 ↔ 2 / 5 ↔ 1의 경우 모두 고려해야함...

 

이렇게 8번 모두 돌리고 찾고자 하는 number이 없으면 -1을 뱉어내야한다.

 

이렇게 적어놓고보니, 결국 Bottom-Up방식인 것은 같으나, 경우의 수를 저장해놓아야 한다.

어떻게? List안에 Set을 담아서 해보자..

 

 

 

두번째 풀이


첫 번째 풀이와 같은 구조에서, List안에 Set을 담아서 모든 경우를 고려할 수 있게 만들었다.

하나더, 첫 풀이에서 놓친 N=number일때 return값을 N으로해둬서, 1로 바꿨다.

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

class Solution {	
	int answer = 0;
	
    public int solution(int N, int number) {
    	if(N==number) return 1;
    	
    	List<Set<Integer>> list = new ArrayList<Set<Integer>>();
    	Set<Integer> set = new HashSet<Integer>() {{
    		add(N);
    	}};    	
    	list.add(set);
    	
    	set = new HashSet<Integer>() {{
    		add(N);
    		add(N+N);
    		add(N-N);
    		add(N*N);
    		add(N/N);
    		add((10*N) + N);
    	}};
    	list.add(set);
    	
    	
    	if(chk(set, number, 2)) return answer;
    	
    	dp(N, number, 3, list);
    	
    	System.out.println(answer);
    	return answer;
    }
    
    public void dp(int N, int number, int idx, List<Set<Integer>> list) {    	
    	Set<Integer> num_set = new HashSet<>();
    	
    	for(int i=0; i<list.size(); i++) {
    		int reverse = (list.size()-1) -i;    		
    		
    		Iterator<Integer> iter1 = list.get(i).iterator();
    		Iterator<Integer> iter2 = list.get(reverse).iterator();
    		
    		while(iter1.hasNext()) {
    			int i1 = iter1.next();
    			
    			while(iter2.hasNext()) {
    				int i2 = iter2.next();
    				num_set.add(i1+i2);
    				num_set.add(i1-i2);
    				num_set.add(i1*i2);
    				num_set.add(i2+i1);
    				num_set.add(i2-i1);
    				num_set.add(i2*i1);
    				if(i2!=0) {
    					num_set.add(i1/i2);
    				}
    				if(i1!=0) {
    					num_set.add(i2/i1);
    				}    				
    				num_set.add((i1*10)+i2);
    				num_set.add((i2*10)+i1);
    			}
    			
    		}
    	}    	
    	if(chk(num_set, number, idx)) return;
    	
    	list.add(num_set);    	
    	if(idx==8) {
    		answer = -1;
    		return;
    	}
    	dp(N, number, idx+1, list);
    }
    
    public boolean chk(Set<Integer> set, int number, int idx) {
    	Iterator<Integer> iter = set.iterator();
    	while(iter.hasNext()) {
    		if(iter.next().equals(number)) {
    			answer = idx;
    			return true;
    		}
    	}
    	return false;
    }

}

 

 

음...? 뭐가 문제였을까..

 

 

 

 

 

세번째 풀이


한 문제를 너무 오래 끄는 것이 비효율적인 것 같아서 마지막으로 수정하기로 했다.

아래는 수정을 위해 정리한 내용이다.

 

1. 더럽게 긴 코드 수정

2. 굳이 N을 두번 반복할 때 미리 Set을 세팅하고 해야하나..? 1번 ↔ 1번을 돌리는 것까지 포함해서 코드를 짜면 안되나?

 

 - 포스팅이 너무 길어질까 코드를 하나 생략했는데, 8번을 초과하면 -1을 뱉어내야 하므로, 8번째 경우까지 포함해줘야했는데 해당 경우를 포함해 주지 않아 5,8번 테스트케이스의 실패가 발생했었다.

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

class Solution {	
	int answer = -1;
	
    public int solution(int N, int number) {
    	List<Set<Integer>> list = new ArrayList<Set<Integer>>();
    	list.add(null);
    	list.add(new HashSet<Integer>());
    	list.get(1).add(N);   	
    	
    	dp(N, number, list);
    	
    	System.out.println(answer);
    	return answer;
    }
    
    public void dp(int N, int number, List<Set<Integer>> list) {    	
    	
    	for(int i=1; i<=8; i++) {
    		if(i>=2) {
    			list.add(new HashSet<Integer>());
    			StringBuilder sb = new StringBuilder();
    			for(int j=0; j<i; j++) {    				
    				sb.append(N);
    			}
    			list.get(i).add(Integer.parseInt(sb.toString()));
    			
    			for(int j=1; j<i; j++) {
    				for(int k : list.get(j)) {
    					for(int l : list.get(i-j)) {
    						list.get(i).add(k+l);
    						list.get(i).add(k-l);
    						list.get(i).add(k*l);
    						if(l!=0) list.get(i).add(k/l);
    					}
    				}
    			}
    		}
    		if(chk(list.get(i), number, i)) return;
    	}
    	
    }
    
    public boolean chk(Set<Integer> set, int number, int idx) {
    	if(set.contains(number)) {
    		answer = idx;
    		return true;
    	}
    	return false;
    }

}

 

위의 짠 코드를 약간 수정했다.

1. 굳이 앞의 수와 뒤의 수를 번갈아가며 사칙연산 할 필요가 없었다. 조건만 잘 주면 사칙연산 한번씩이면 끝남.

2. N을 이어붙인 숫자를 따로 추가할 필요가 없고 set을 추가하는 과정에서 셋팅만 해주면 된다.

 

 

728x90
300x250
mag1c

mag1c

2년차 주니어 개발자.

[Java] H-Index - Lv2 프로그래머스 정렬 / 프로그래머스 고득점 Kit

P.S./프로그래머스 2023. 5. 4. 06:59
728x90
728x90

https://school.programmers.co.kr/learn/courses/30/lessons/42747

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

풀이


1. i의 최대길이를 논문의 인용 횟수 최대 크기 h로 설정

2. h번 이상 인용된 논문이 h편 이상이고.... 문제 설명에 말이 좀 애매한데 다시 설명하면

  - ex)h=3 : 3번 이상 인용된 논문이 3편 이상이다. 똑같나..?ㅋㅋ;;

 

3. 인용된 횟수를 세는 cnt 변수를 통해 h번 이상 인용된 논문일 경우 ++;

4. 인용된 논문 개수가 조건 횟수 이상일경우 answer에 넣는다.

  - 이 과정에서 i가 오름차순(?)으로 낮은 수 ㅡ> 높은 수로 진행되기 때문에 answer는 자동적으로 가장 큰 h의 값이 됨

import java.util.Arrays;

class Solution{

    public int solution(int[] citations) {
        int answer = 0;       
        
        Arrays.sort(citations);
                
        for(int i=0; i<citations[citations.length-1]; i++) {
        	int cnt = 0;
        	for(int j=0; j<citations.length; j++) {
        		if(i<=citations[j]) cnt++;
        	}
        	if(cnt>=i) answer=i;
        }
        

        
        return answer;
    }
}

 

 

 

728x90
300x250
mag1c

mag1c

2년차 주니어 개발자.

[Java] 가장 큰 수 - Lv2 프로그래머스 정렬 / 프로그래머스 고득점 Kit

P.S./프로그래머스 2023. 5. 3. 13:49
728x90
728x90

https://school.programmers.co.kr/learn/courses/30/lessons/42746

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

풀이


첫 풀이

numbers.length <= 100,000이지만 복습할 겸 DFS로 풀어봤다.

통과돼도 수정해서 풀 예정이었지만 역시나 안됨  시간초과 메모리초과 ㅋㅋㅋ

 

class Solution{

    int max = 0;

    public String solution(int[] numbers) {
        boolean[] bl = new boolean[numbers.length];
        String[] strs = new String[numbers.length];
        for(int i=0; i<strs.length; i++){
            strs[i]=String.valueOf(numbers[i]);
        }
        
        dfs(strs, bl, 0, "");
        return String.valueOf(max);
    }

    public void dfs(String[] strs, boolean[] bl, int idx, String word){
        if(idx == strs.length){
            max = Math.max(Integer.parseInt(word), max);
            return;

        }
        for(int i=0; i<strs.length; i++){
            if(bl[i]) continue;
            bl[i]=true;
            dfs(strs, bl, idx+1, word+strs[i]);
            bl[i]=false;
        }
        
    }
}

 

다른 방법을 찾아야했다.

 

 

두번째 풀이

Comparator 인터페이스를 오버라이딩하여 사용하거나

lambda식을 활용하여 정렬을 진행할 수 있다.

import java.util.Arrays;

class Solution{
	 
    public String solution(int[] numbers) {

    	String[] strArr = new String[numbers.length];
    	
    	for(int i=0; i<numbers.length; i++) {
    		strArr[i] = String.valueOf(numbers[i]);
    	}
    	
    	Arrays.sort(strArr, (o1, o2) -> (o2+o1).compareTo(o1+o2));
    	
    	StringBuilder sb = new StringBuilder();
    	
    	for(String s : strArr)sb.append(s);
    	
    	if(sb.charAt(0)=='0') return "0";
    	
    	else return sb.toString();
    	
    }
}

sort를 통해, 두 문자열을 이어붙인 값을 비교하고, 내림차순으로 정렬한다.

 

 

728x90
300x250
mag1c

mag1c

2년차 주니어 개발자.

[Java] K번째수 - Lv1 정렬 프로그래머스 / 프로그래머스 고득점 Kit

P.S./프로그래머스 2023. 5. 3. 06:23
728x90
728x90

https://school.programmers.co.kr/learn/courses/30/lessons/42748

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

풀이


import java.util.Arrays;

class Solution{

    public int[] solution(int[] array, int[][] commands) {
        int[] answer = new int[commands.length];
        int ansidx=0;

        for(int i=0; i<commands.length; i++){
            int start = commands[i][0];
            int end = commands[i][1];
            int target = commands[i][2];
            int idx=0;
            int[] arr = new int[end-start+1];
            for(int j=start-1; j<end; j++){
                arr[idx] = array[j];
                idx++;
            }
            Arrays.sort(arr);
            answer[ansidx] = arr[target-1];
            ansidx++;
        }

        return answer;
    }
}

728x90
300x250
mag1c

mag1c

2년차 주니어 개발자.

[Java] 모음사전 - Lv2 프로그래머스 완전탐색 / 코딩테스트 고득점 Kit

P.S./프로그래머스 2023. 4. 19. 16:14
728x90
728x90

https://school.programmers.co.kr/learn/courses/30/lessons/84512

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

풀이


DFS를 이용해서 간단하게 풀어냈다.

class Solution {
	
    static int idx = 0;
    static int answer = -1;
	
    public int solution(String word) {   	
        dfs(word, "");        
        return answer;
    }
    
    public void dfs(String word, String text) {
    	if(answer > 0) return;
    	if(word.equals(text)) {
    		answer=idx;
    	}
    	idx++;
    	if(text.length()==5) {    		
    		return;
    	}
    	
    	dfs(word, text+"A");
    	dfs(word, text+"E");
    	dfs(word, text+"I");
    	dfs(word, text+"O");
    	dfs(word, text+"U");
    }

}

 

 

 

 

다른 풀이


프로그래머스에서 인상깊은 두가지 코드를 가져왔다.

 

첫번째는 모든 낱말의 개수를 per에 담아 조건에맞는 결과를 출력하는 코드인데

수학적 머리만 따라주면 간결하게 이런식으로 코드를 짤 수 있지만, 단점은 단어의 조건이 바뀔 때, per의 값이 계속 변해야 한다는 점이다.

 

class Solution {
    public int solution(String word) {
        int answer = 0, per = 3905;
        for(String s : word.split("")) answer += "AEIOU".indexOf(s) * (per /= 5) + 1;
        return answer;
    }
}

 

아래의 풀이는, 재귀를 돌리긴 하지만, 내가 나눠놓은 재귀호출을 반복문으로 한번에 처리했다.

import java.util.*;
class Solution {
    List<String> list = new ArrayList<>();
    void dfs(String str, int len) {
        if(len > 5) return;
        list.add(str);
        for(int i = 0; i < 5; i++) dfs(str + "AEIOU".charAt(i), len + 1);
    }
    public int solution(String word) {
        dfs("", 0);
        return list.indexOf(word);
    }
}

 

흡수해서 더 나은 코드를 짤수있도록 노력하자

728x90
300x250
mag1c

mag1c

2년차 주니어 개발자.

[Java] 피로도 - Lv2 프로그래머스 완전탐색 / 코딩테스트 고득점 Kit

P.S./프로그래머스 2023. 4. 19. 06:57
728x90
728x90

https://school.programmers.co.kr/learn/courses/30/lessons/87946

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

풀이


이제 어느정도 기본 DFS문제는 감이 온 것 같다

백트래킹으로 던전 탐사가 가능한 최대값을 구해줬다.

class Solution {
	
    static int join = 0;
	
    public int solution(int k, int[][] dungeons) {        
        boolean[] bl = new boolean[dungeons.length];
        
        dfs(dungeons, bl, 0, k, 0, 0);
        return join;
    }
    
    public void dfs(int[][] dungeons, boolean[] bl, int sum, int k, int join2, int idx){
    	for(int i=0; i<dungeons.length; i++) {
    		if(bl[i]) continue;
    		bl[i] = true;
    		if(k-sum >= dungeons[i][0]) {
    			dfs(dungeons, bl, sum+dungeons[i][1], k, join2+1, idx+1);
    		}    		
    		bl[i] = false;    		
    	}
        join = Math.max(join, join2);

    }
}

 

 

 

 

 

 

 

728x90
300x250
mag1c

mag1c

2년차 주니어 개발자.

[Java] 숫자 뽑기 - 프로그래머스 / COS Pro 1급 Java 모의고사

P.S./프로그래머스 2023. 4. 18. 06:56
728x90
728x90

https://school.programmers.co.kr/learn/courses/11132/lessons/71156

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

풀이


문제에서, K만큼을 뽑아내어 가장 큰 수 - 가장 작은 수의 최소를 구하라고 했다.

 

처음에는 재귀를 통해 완전탐색을 하려하다가, 정렬을 통해 K만큼을 뽑아내면 되지 않나 생각했더니 엄청 간단하게 풀렸다.

 

1. 오름차순 정렬 후 answer 초기화 (배열의 가장 큰 수인 arr의 마지막값)

2. K를 뽑을 수 있는 경우의 수인 arr의길이-K만큼만 반복을 돌린다.

3. 돌리는 과정에서, 배열의 맨 앞, 맨 뒤의 수를 뺀 값을 비교하여 answer에 담는다(최소값이니 Math.min() 활용)

public int solution(int[] arr, int K) {    	   	
    Arrays.sort(arr);
    int answer = arr[arr.length-1];
    for(int i=0; i<=arr.length-K; i++) {
        answer = Math.min(answer, arr[K-1+i]-arr[i]);
    }

    return answer;
}

728x90
300x250
mag1c

mag1c

2년차 주니어 개발자.

[Java] 카펫 - Lv2 프로그래머스 완전탐색 / 코딩테스트 고득점 Kit

P.S./프로그래머스 2023. 4. 17. 09:56
728x90
728x90

https://school.programmers.co.kr/learn/courses/30/lessons/42842#

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

풀이


1. div메서드를 통해 총 카펫 크기의 약수를 모조리 구한다.

public void div(int sum) {
    for(int i=1; i<=sum/2; i++) {
        if(sum%i==0) {
            list.add(i);
        }
    }
    list.add(sum);
}

 

 

2. list 사이즈가 짝수일 경우만 고려해주었다. 홀수일 경우는 x*x=sum이 되는 x의 값이 정답이라고 생각함.

 

총 카펫 크기에 대한 약수를 구했기 때문에, 해당 약수의 곱이 yellow가 일치하는지 꼭 확인해주어야했다.

예를들어 brown = 18 yellow = 6일 경우 검증해주지 않으면 8,3의 정답이 6,4가 나와버린다.

if(list.size()%2==0) {
    int x = list.size()/2;
    int y = list.size()/2-1;

    while((list.get(x)-2)*(list.get(y)-2)!=yellow) {
        y--;
        x++;
    }
    answer[0] = list.get(x);
    answer[1] = list.get(y);
}
else {
    answer[0] = list.get(list.size()/2);
    answer[1] = list.get(list.size()/2);                
}

 

 

전체 코드

import java.util.ArrayList;
import java.util.List;

class Solution {

    static List<Integer> list = new ArrayList<>();

    public int[] solution(int brown, int yellow) {
        int[] answer = new int[2];
        int sum = brown+yellow;       
        div(sum);
        
        if(list.size()%2==0) {
        	int x = list.size()/2;
        	int y = list.size()/2-1;
            
        	while((list.get(x)-2)*(list.get(y)-2)!=yellow) {
        		y--;
        		x++;
        	}
            answer[0] = list.get(x);
            answer[1] = list.get(y);
        }
        else {
            answer[0] = list.get(list.size()/2);
            answer[1] = list.get(list.size()/2);                
        }        
        return answer;
    }

    public void div(int sum) {
        for(int i=1; i<=sum/2; i++) {
        	if(sum%i==0) {
        		list.add(i);
        	}
        }
        list.add(sum);
    }
}

 

 

 

 

 

 

다른 풀이


프로그래머스 내의 신재권님의 풀이가 비슷한 접근방법이면서도 엄청 간단하게 풀어진 것 같아서 리뷰해보려 한다.

class Solution {
    public static int[] solution(int brown, int yellow) {
        int sum = brown + yellow;

        return find(yellow, sum);
    }

    private static int[] find(int yellow, int sum) {
        int y = 0, x = 0;

        for (int i = 1; i <= yellow; i++) {
            if (yellow % i == 0) {
                y = Math.min(i, yellow / i);
                x = Math.max(i, yellow / i);
                if ((y + 2) * (x + 2) == sum) {
                    break;
                }
            }
        }

        return new int[] {x + 2, y + 2};
    }
}

 

같은 약수를 찾는 완전탐색이지만,

yellow자체를 처음부터 나눠가면서 x+2,y+2의 곱이 전체 카펫의 크기와 같을 때 리턴해주었다.

내가 x-2, y-2로 yellow 자체의 크기와 비교한 것과 같은 맥락으로

x+2, y+2를 했을 경우 sum의 x와 y의 길이일 것이기 때문에, 곱했을 경우 전체 카펫의 크기가 된다.

 

똑같은 접근 방법이라고 생각하지만, 훨씬 간략한 코드인 것 같다.

728x90
300x250
mag1c

mag1c

2년차 주니어 개발자.

방명록