[Java] 프로그래머스 - 큰 수 만들기 (2단계)

배똥회장·2022년 7월 25일
0
post-custom-banner

📝 문제

프로그래머스 > 코딩테스트 연습 > 탐욕법(Greedy) > 큰 수 만들기


📝 답안

📌 작성 코드

import java.util.*;
class Solution {
    StringBuilder answer;
    public String solution(String number, int k) {
        answer = new StringBuilder();
        int[] num = new int[number.length()];
        
        for (int i = 0; i < num.length; i++) {
            num[i] = Integer.parseInt(number.substring(i, i+1));
        }
        
        int count = num.length - k;
        int start = 0;
        while (count > 0) {
            start = func(num, count, start);
            count--;
        }
        
        return answer.toString();
    }
    
    public int func(int[] n, int count, int start) {
        int max = n[start];
        int index = start;
        for (int i = start; i <= n.length - count; i++) {
            if (n[i] > max) {
                max = n[i];
                index = i;
            }
        }
        
        answer.append(max);
        return index+1;
    }
}

📌 결과

테스트 1 〉 통과 (0.04ms, 75.8MB)
테스트 2 〉 통과 (0.05ms, 77MB)
테스트 3 〉 통과 (0.10ms, 76.5MB)
테스트 4 〉 통과 (0.96ms, 79.8MB)
테스트 5 〉 통과 (0.99ms, 77.7MB)
테스트 6 〉 통과 (10.74ms, 75.9MB)
테스트 7 〉 통과 (18.09ms, 85.1MB)
테스트 8 〉 통과 (59.74ms, 79.6MB)
테스트 9 〉 통과 (32.33ms, 103MB)
테스트 10 〉 통과 (1755.88ms, 115MB)
테스트 11 〉 통과 (0.03ms, 84.8MB)
테스트 12 〉 통과 (0.04ms, 74.2MB)


📌 코드 풀이

StringBuilder answer = new StringBuilder();
  • String으로 문자열 붙이기를 하면 시간을 많이 차지 하기 때문에 일단 StringBuilder로 선언
for (int i = 0; i < num.length; i++) {
	num[i] = Integer.parseInt(number.substring(i, i+1));
}
  • 한 자리씩 잘라가면서 int형으로 변환하고, 배열에 담기
 int count = num.length - k; 
 int start = 0;
  • count : 만들어야 할 숫자의 길이
  • start : 탐색을 시작하는 위치
while (count > 0) { 
	start = func(num, count, start);
	count--;
}
  • count가 0이 될 때까지 while문 반복하기
  • func(int배열, 만들어야할 숫자 길이, 탐색 시작할 위치)
  • func함수 리턴값으로 시작 위치 리셋
  • func함수를 호출 할 때마다 숫자 하나씩 answer에 더해지기 때문에 구해야할 숫자 길이인 count는 1씩 줄어듦
return answer.toString();
  • answer은 StringBuilder로 선언되어 있기 때문에 리턴할 땐 toString()으로 String형으로 변환해야 함
 public int func(int[] n, int count, int start) {
	int max = n[start]; 
	int index = start;
	--- 중략 ---
}
  • max : 가장 큰 수를 담을 변수. 임시로 n[start]의 값으로 할당
  • index : func함수 리턴값. 임시로 start로 할당
 public int func(int[] n, int count, int start) {
	for (int i = start; i <= n.length - count; i++) {
		if (n[i] > max) {
			max = n[i];
			index = i;
		}
	}
	--- 중략 ---
}
  • for문의 범위는 start부터 (길이 - 구해야할 자리 수) 까지임.
  • 범위 내에서 가장 큰 값 구하기

📌 설명 한 눈에 파악하기

profile
어쩌면 개발자
post-custom-banner

0개의 댓글