1. 기지국 설치
https://programmers.co.kr/learn/courses/30/lessons/12979
Sol 1) 기본형 이용- 정확성: 0.02ms, 효율성: 1.19ms
import java.util.*;
public class T3 {
public static int solution(int n, int[] stations, int w) {
int cnt = 0;
int position = 1;
int idx = 0;
while(position <= n){
if(idx < stations.length && stations[idx] - w <= position){
position = stations[idx] + w + 1;
++idx;
System.out.println("position: " + position + ", idx: "+ idx);
continue;
}
++cnt;
position += 2 * w + 1;
System.out.println("position: " + position + ", cnt: " + cnt);
}
return cnt;
}
public static void main(String[] args){
int[] stations = {4, 11};
System.out.println(solution(11, stations, 1));
stations = new int[]{9};
System.out.println(solution(16, stations, 2));
stations = new int[]{3, 7, 9};
System.out.println(solution(16, stations, 1));
}
}
- 그리디(greedy) 알고리즘을 이용한다.
- 루프는 효율성 테스트에서 시간을 많이 잡아 먹는다.
- primitive 타입을 사용하는 게 Objects타입( ex) stack, queue ) 사용 보다 빠르다.
- 그런데 while문에 등호가 빠지면 점수가 깎인다..
Sol 2) Queue 이용 - 정확성: , 효율성:
Sol 3) 제출 답안
class Solution {
public int solution(int n, int[] stations, int w) {
int left = 0;
int right = 0;
int baseL = 0;
int baseR = 0;
int result = 0;
for(int i = 0; i < stations.length; ++i){
int base = stations[i];
left = baseR;
baseL = base - w;
baseR = base + w;
if(baseL < 0 ) baseL = 0;
if(baseR > n ) baseR = n;
right = baseL - 1;
if(right < 0) continue;
if(left == right) continue;
if(left > right) continue;
double temp = (double) (right - left) / ((2 * w) + 1);
if(temp % 1 == 0) result += (int) temp;
else result += (int) temp + 1;
}
if(baseR != n){
double temp = (double) (n - baseR) / ((2 * w) + 1);
if(temp % 1 == 0) result += (int) temp;
else result += ((int) temp) + 1 ;
}
return result;
}
}
2. 가장 큰 수
Sol)
- 배열
- 숫자로 생각해서 풀지 않고 문자열을 다룬다 생각하고 푼다.
- 숫자 -> 문자 -> 내림차순 정렬 -> 조합
- 정확성 테스트에서 시간 초과되는 경우: 무한 루프가 돌거나 연산이 느린 경우
- 간결한 버전
import java.util.*;
import java.util.stream.*;
class Solution {
public String solution(int[] numbers) {
String answer = IntStream.of(numbers)
.mapToObj(String::valueOf)
.sorted((s1, s2) -> (s2 + s1).compareTo(s1 + s2))
.collect(Collectors.joining());
if(answer.startsWith("0")) return "0";
return answer;
}
}
import java.util.*;
class Solution {
public String solution(int[] numbers) {
String[] strNums = new String[numbers.length];
for(int i = 0; i < numbers.length; ++i){
strNums[i] = "" + numbers[i];
}
Arrays.sort(strNums, (s1, s2) -> (s2+ s1).compareTo(s1 + s2));
String answer = "";
for(String s: strNums){
answer += s;
}
if(answer.startsWith("0")) return "0";
return answer;
}
}
- 참고
import java.util.*;
class Solution {
public String solution(int[] numbers) {
String[] strNums = new String[numbers.length];
for(int i = 0; i < numbers.length; ++i){
strNums[i] = "" + numbers[i];
}
Arrays.sort(strNums, new Comparator<String>(){
public int compare(String s1, String s2){
return (s2+ s1).compareTo(s1 + s2);
}
});
String answer = "";
for(String s: strNums){
answer += s;
}
if(answer.charAt(0) == '0') return "0";
return answer;
}
}
3. 예산
Sol)
- 이분법을 이용하기 위해 최솟값, 최댓값을 구한다.
- Stream을 이용하면 간결하게 표현 가능하다.
- final을 붙여야 효율성 테스트를 통과한다.
import java.util.stream.*;
class Solution {
public int solution(int[] budgets, int M) {
int min = 0;
int max = IntStream.of(budgets).max().orElse(0);
int answer = 0;
while(min <= max){
final int mid = (min + max) / 2;
int sum = IntStream.of(budgets)
.map(b -> Math.min(b, mid))
.sum();
if(sum <= M){
min = mid + 1;
answer = mid;
continue;
}
max = mid - 1;
}
return answer;
}
}
class Solution {
public int solution(int[] budgets, int M) {
int max = 0;
int min = 0;
for(int b : budgets){
if(b > max) max = b;
}
int answer = 0;
while(min <= max){
int mid = (min + max) / 2;
int sum = 0;
for(int b : budgets){
if(b > mid) sum += mid;
else sum += b;
}
if(sum <= M){
min = mid + 1;
answer = mid;
}else{
max = mid - 1;
}
}
return answer;
}
}
4. 숫자 게임
Sol)
- 루프를 거꾸로 돌면서 서로 가장 큰 값을 비교한다.
- 단일 루트로 풀면 효율성 테스트 통과
- A와 B를 먼저 정렬시킨 다음에 A와 B에 인덱스를 다르게 준다.
- A[i] < B[index] 를 만족하면 index를 마이너스하고 answer을 플러스한다.
import java.util.*;
class Solution {
public int solution(int[] A, int[] B) {
Arrays.sort(A);
Arrays.sort(B);
int index = B.length - 1;
int answer = 0;
for (int i = A.length -1; i >= 0 ; --i) {
if (A[i] < B[index]) {
--index;
++answer;
}
}
return answer;
}
}
출처: https://programmers.co.kr/learn/courses/13699