본문 바로가기

Java/Java 알고리즘 2

[Java 알고리즘] (1) 그리디, 정렬, 이분탐색, 시뮬레이션 ##

반응형

1. 기지국 설치 - 그리디

2. 가장 큰 수- 정렬

3. 예산 - 이분 탐색

4. 숫자 게임 - 시뮬레이션

 


 

1. 기지국 설치 - 그리디

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

 

프로그래머스

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

programmers.co.kr

class Solution {
    
    //문제 풀이 순서

    //1. 순회하면서 전파 범위를 확인한다.
    //2. 전파 없으면 기지국 설치 -> 전파 범위 최대로 이동
    //3. 전파 범위 끝나는 지점 이후부터, 시작
    //4. 전파 범위 겹치면 전파 범위 넘어서 시작

    
    //아파트 개수 n, 기지국 설치된 아파트 번호 배열 stations, 전파 도달 거리 w
    public int solution(int n, int[] stations, int w) {
        int answer = 0;
        //최소 기지국 설치 개수
        int si=0;
        //현재 위치
        int pos=1;
        //현재 아파트 개수
        
        //아파트 개수 만큼 반복
        while(pos<=n){
            //전파 범위 안일 경우
            //-> 기지국 설치된 아파트의 길이안에 존재하고, 전파의 왼쪽 범위가 pos보다 작거나 같을 경우
            if(si<stations.length&&stations[si]-w<=pos){
                //기지국 설치 안함
                
                pos=stations[si]+w+1;
                //오른쪽 전파 범위보다 +1로 위치를 이동
                //-> 현재 위치를 전파범위 밖의 최소위치로 이동

                
                si++;
                //다음 기지국으로 이동
            }
            
            //전파 범위 밖일 경우
            else{
                //기지국 설치
                
                pos+=w+1+w;
                //현재 위치가 전파범위 밖의 최소위치이므로, 범위 밖으로 이동
                
                answer++;
                //기지국 개수 추가
            }
        }

        return answer;
    }
}

 

import java.util.*;
class Solution {
    //아파트 개수 : n, 기지국 설치 아파트 번호 배열 stations, 전파 거리 w
    public int solution(int n, int[] stations, int w) {
        //기지국 번호
        int si=0;
        //아파트 번호
        int pos=1;
        //기지국 설치 개수
        int answer = 0;
        
        //최대 설치할 수 있는 기지국 개수 = 아파트 개수
        //: 아파트 번호 기준 분기이므로, 조건문 결과가 pos에 영향을 미쳐야함
        while(pos<=n){
            
            //기지국의 전파 범위와 기지국 설치 가능 개수에 따라 조건 분기
            //->아파트가 기지국 전파 범위 내인가 / 기지국 설치 가능 개수 내인가
            if(si<stations.length&&pos>=stations[si]-w){
                
                //아파트 위치를 설치된 기지국 위치 기준 변경, 기지국 위치 +1
                pos=stations[si]+w+1;
                si++;
            }
            else{
                //아파트 위치를 현재 기지국 설치 기준 변경, 기지국 설치 개수 +1
                pos+=w+w+1;
                answer++;
            }
        }
            

        return answer;
    }
}

 

2. 가장 큰 수 - 정렬

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

 

프로그래머스

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

programmers.co.kr

 

내부 클래스를 이용한 comparator

: 클래스 안에 선언된 클래스 -> implements comparator<>를 사용할 경우

-> 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있고, 코드의 복잡성을 줄일 수 있어 캡슐화 가능

 

인스턴스 클래스의 인스턴스를 생성하기 위해서는 외부 클래스의 인스턴스를 먼저 생성해야하며,

스태틱 클래스의 인스턴스의 경우에는 외부 클래스의 인스턴스를 먼저 생성하지 않아도 가능하다.

익명 클래스의 경우에는 이름이 없는 일회용으로 선언과 생성을 동시에 하고, 하나의 객체만 생성가능하다.

 

https://xianeml.tistory.com/35

 

JAVA 자바 중첩클래스, comparator 인터페이스

🎯 자바 중첩클래스와 comparator 인터페이스를 활용한 배열정렬을 알아본다. 🔖 목차 중첩클래스 익명클래스 comparator 정렬 인터페이스 중첩클래스 public class Outer{ class Inner{ }//end Inner }//end..

xianeml.tistory.com

 

 

compare와 compareto 차이

(1) compare()은 Comparator 인터페이스를 구현

(2) compareTo()은 Comparable 인터페이스를 구현

: compare()은 비교하는 방법이 정해져 있는 경우, compareTo()는 직접 비교방법을 구현해야한다.

 

http://daplus.net/java-compare-%EC%99%80-compareto-%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90%EC%9D%80-%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C/

 

[java] compare ()와 compareTo ()의 차이점은 무엇입니까? - 리뷰나라

Java compare()와 compareTo()메소드 의 차이점은 무엇입니까 ? 그 방법들이 같은 대답을하나요? 답변 에서 JavaNotes : a.compareTo(b): Comparable 인터페이스 : 값을 비교하고 값이보다 작거나 같거나 큰지 여부

daplus.net

https://hwannny.tistory.com/93

 

Java의 정렬 클래스 Comparable, Comparator 정리

들어가며 컬렉션의 아이템들을 정렬할 때 쓰이는 클래스, 인터페이스들에 대해 깊게 알지 못했던게 최근 코딩테스트 응시 중 밑천이 드러나버렸다. 이를 반성하는 의미로 정리하고자 포스팅하

hwannny.tistory.com


 

(1) 소트함수 이용

import java.util.*;
class Solution {
    // 문제 해결 과정

    // 1. 숫자를 문자로 바꾸기
    // 2. 내림차순 정렬
    // 3. 조합

    // 정렬하는 방법
    // 1. 버블 소트로 직접 구현
    // 2. 소트 함수로 구현
    // 3. 람다식으로 구현
    
    // 숫자가 성립되지 않는 경우 예외처리
    // 1. str.charAt(0) == '0'
    // 2. str.startsWith("0")
    
    public String solution(int[] numbers) {
        //1. 숫자 배열을 문자 배열로 변경
        
        String strNums[] = new String[numbers.length];
        for(int i=0;i<numbers.length;i++){
            strNums[i]=""+numbers[i];
            //숫자를 문자로 바꾸는 방법
        }
        
        //2. 소트함수를 이용해, 내림차순 정렬
        //-> Comparable 인터페이스의 compare메서드를 오버라이딩
        
        Arrays.sort(strNums, new Comparator<String>(){
            public int compare(String s1, String s2){
                return (s2+s1).compareTo(s1+s2);
                //내림차순 정렬 : s2+s1과 s1+s2를 비교해, 작으면 -1, 같으면 0, 크면 +1
            }
        });
        
         String answer="";
		 for(String s : strNums) {
			 answer+=s;
		 }
        
        //3. 문자열 시작으로 변경
        //-> 맨 앞 숫자가 0이면 0리턴
        if(answer.startsWith("0")) return "0";
        
        return answer;
    }
}

(2) 람다식 이용

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;
    }
}

 


(3) 스트림 이용

import java.util.*;
import java.util.stream.*;
class Solution {
    public String solution(int[] numbers) {
       String answer=
           //중간연산
           //1. int배열을 인자로 기본형 int 스트림 정적으로 생성
           //2. valueOf 메서드 참조를 이용해, 기본형 String 배열로 변환 후, 
           // mapToObj 메서드로 기본 스트림을 스트림으로 변환
           //3. sorted() 메서드로 compareTo함수 호출해 내림차순 정렬 수행
    
           //최종연산
           //collect() 메서드는 Collector를 매개변수로 하는 최종연산으로
           //joining() 메서드를 이용해, 통계 기능의 컬렉터로 문자열 결합해 추출
           
           
           //하나의 메서드를 호출하는 경우 사용하는 메서드 참조
            //-> 어떤 인자를 전달할지 명확할 경우, (호출할 메서드의 클래스::메서드 이름)
           IntStream.of(numbers).mapToObj(String::valueOf)
           .sorted((s1,s2)-> (s2+s1).compareTo(s1+s2))
           .collect(Collectors.joining());
           
           //최종연산 collect 메서드을 이용해 Collectors를 구현한 컬렉터 호출
            //문자열 스트림의 요소를 모두 연결하는 문자열 결합 메서드 : joining()
            //구분자를 이용한 결합도 가능 .collect(joining(",", "[","]"))
           
           
           if(answer.startsWith("0")) return "0";
        

        	return answer;
    }
}

 

import java.util.stream.*;
class Solution {
    public String solution(int[] numbers) {
        String answer=
            //기본 int형 스트림을 배열로 생성 후, 중간연산(1)정렬 (2)스트림으로 변환, 최종연산
            IntStream.of(numbers)
            //기본형 스트림 -> 스트림으로 변환 [제네릭으로 변환] -> 직접 형변환 가능
            //: String.valueOf();
            .mapToObj(String::valueOf)
            .sorted((s1,s2)->(s2+s1).compareTo(s1+s2))
            //기본형 스트림 -> 스트림으로 변환 [제네릭이 아니라 자료형 결정]
            //.peek(s-> System.out.print(s))
            //메서드 참조로 표현
            .peek(System.out::print)
            .collect(Collectors.joining());
        return answer;
    }
}

 

import java.util.stream.*;
class Solution {
    public String solution(int[] numbers) {
        String answer =
            //1. 배열로 기본 int형 스트림 생성
            IntStream.of(numbers)
            //2. 기본 스트림을 스트림으로 변환 후, String으로 형 변환
            //:String.valueOf()
            .mapToObj(String::valueOf)
            //3. 스트림을 이용한 정렬 수행
            .sorted((s1,s2)->(s2+s1).compareTo(s1+s2))
            //4. peek()을 이용해 요소를 소비하지 않고 결과 확인
            .peek(System.out::print)
            //5. 문자열 결합
            .collect(Collectors.joining());
            
        return answer;
    }
}

 

.colelct(joining())
//6210
//9534330


.collect(joining(","))
//6,2,10
//9,5,34,3,30


.collect(joining(",", "[","]"))
//[6,2,10]
//[9,5,34,3,30]

 

 

#스트림

(1) 생성

: 일반적으로 기본형 스트림으로 생성해, 스트림으로  변환

(2) 중간연산

: 자르기, 걸러내기, 정렬하기, 변환하기, 스트림과 기본 스트림의 상호변환, 엿보기

(3) 최종연산

: 모든 요소에 작업 수행, 배열로 변환, 조건 검사, 조건에 일치하는 요소 찾기, 통계 정보, 요소를 하나씩 줄여가며 누적 연산 가능

: 혹은, collect메서드를 이용해, Collectors클래스를 구현한 클래스를 이용해 원하는 리턴값으로 만든다.

 

스트림의 중간연산 메서드 특징
skip(), limit()
filter(), distinct()
스트림 자르기
스트림 요소 걸러내기
sorted() 스트림 정렬하기
map() 스트림 요소 변환
mapToInt(), mapToLong(), mapToDouble()
mpaToObj(), boxed()
스트림을 기본 스트림으로 변환
기본 스트림을 스트림으로 변환
flatMap() 스트림의 스트림을 스트림으로 변환
peek() 스트림의 요소를 엿보기
스트림의 최종연산 메서드 특징
forEach(), forEachOrdered() 스트림의 모든 요소에 지정된 작업을 수행
toArray() 스트림을 배열로 변환
allMatch(), anyMatch(), noneMatch()
findFirst(), findAny()
조건검사
조건에 일치하는 요소 찾기
count(), sum(), average(), max(), min()
reduce()
스트림에 대한 통계정보 제공
스트림의 요소를 하나씩 줄여가며 누적연산 수행

-> forEach의 경우 최종연산으로 요소를 소비하면서 요소를 탐색하지만,

-> peek의 경우 중간연산으로 요소를 소비하지 않고, 요소의 탐색이 가능하다.

 

Collector를 구현한 클래스인 다양한 기능의 컬렉터 특징
toList(), toSet(), toMap(), toCollections()
counting(), summingInt(), maxBy(), minBy()
스트림을 컬렉션으로 변환
스트림의 통계정보 제공
reducing()
joining()
스트림을 리듀싱
문자열 스트림 요소를 모두 연결
partitioningBy() 스트림의 요소를 2분할
groupingBy() 스트림의 요소를 그룹화

-> 중간 연산은 여러번 중첩해서 사용가능하지만, 최종연산은 하나의 스트림당 한번만 사용가능하다.

 

 

#스트림 변환


1. int형 -> 문자열 변경하는 2가지 방법

2. 문자열로 int 표현시 "0" 처리하는 2가지 방법

3. 직접 더해보지 않고, 정렬하는 방법

import java.util.*;
class Solution {
    public String solution(int[] numbers) {
        String answer = "";
        //s1+s2 -> 정렬
        //0 제외 -> startsWith, charAt()
        //숫자들을 합칠경우 integer 범위를 넘길정도로 크기가 크므로 문자열로 변경
        int n=numbers.length;
        String[] arr=new String[n];
        for(int i=0;i<n;i++){
            //int -> String 변경 방법
            //(1) Stiring.valueOf이용
            //arr[i]=String.valueOf(numbers[i]);
            //(2) String=""+int 이용
            arr[i]=""+numbers[i];
        }
        
        //실제로 합쳐서 비교하는 것이 아니라, 합쳤을 때 크기를 비교해 정렬
        
        Arrays.sort(arr, (s1,s2)->(s2+s1).compareTo(s1+s2));
        for(String s: arr){
            answer+=s;
        }
        
        return answer.startsWith("0")?"0":answer;
    }
}

3. 예산 - 이분 탐색

https://www.acmicpc.net/problem/2512

 

2512번: 예산

첫째 줄에는 지방의 수를 의미하는 정수 N이 주어진다. N은 3 이상 10,000 이하이다. 다음 줄에는 각 지방의 예산요청을 표현하는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 값들은 모두 1 이상

www.acmicpc.net

 

(1) 일반 풀이

import java.util.*;

public class Main {
	public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        int n=in.nextInt();
		int[] budgets= new int[n];
        for(int i=0;i<n;i++){
            budgets[i]=in.nextInt();
        }
		int M =in.nextInt();
		
		System.out.println(solution(budgets, M));
	}
    // 문제 해결 순서
    //: 예산안 넘지 않는 선에서 최대 금액을 설정한다.
    
    //상한가가 정해지면,
    //(1) 상한가보다 큰 금액 -> 상한가로 치환
    //(2) 상한가보다 작은 금액 -> 그대로
    
    
    //예산이 담긴 배열 budgets과 총 예산 M
	static int solution(int[] budgets, int M) {
		//이분 탐색을 위한, 최솟값 최댓값 변수 선언
        int min=0;
        int max=0;
        
        //상한액 조건
        //1. 모든 요청이 배정될 수 있는 경우에는 요청한 금액을 그대로 배정합니다.
        //2. 모든 요청이 배정될 수 없는 경우에는 특정한 정수 상한액을 계산하여 그 이상인 예산요청에는 모두 상한액을 배정합니다. 
        //   상한액 이하의 예산요청에 대해서는 요청한 금액을 그대로 배정합니다. 
        
        //위의 조건을 모두 만족하는 상한액 리턴
        int answer=0;
        
        //1. 예산 배열을 돌면서, 가장 큰 값으로 최댓값 설정
        for(int b: budgets){
            if(b>max){
                max=b;
            }
        }
        
        //2. 최댓값과 최솟값이 같아 질때까지 반복
		while(min<=max){
            
            //이분탐색 수행하는데 이용하는 중간값 설정
            int mid=(min+max)/2;
            int sum=0;

            //상한가과 비교해, 설정한 상한가보다 큰 금액과 작은 금액으로 조건 분기
            for(int b:budgets){
                //(1) 상한가보다 큰 금액, 총합에 상한가를 더한다.
                if(b>mid){
                    sum+=mid;
                }
                //(2) 상한가보다 작은 금액, 총합에 해당값을 더한다.
                else
                    sum+=b;
            }
                //이분 탐색 수행
                //-> 총합이 최대 예산액보다 작거나 같을 때, 중간값을 상한액으로 설정하는데
                //   최댓값과 최솟값이 같아 질때까지 반복
                if(sum<=M){
                    min=mid+1;
                    answer=mid;
                }
                else
                    max=mid-1;
            
        }
		
		return answer;			
	}
}

 

(2) 스트림을 이용한 풀이

import java.util.*;
import java.util.stream.*;

public class Main {
	public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        int n=in.nextInt();
		int[] budgets= new int[n];
        for(int i=0;i<n;i++){
            budgets[i]=in.nextInt();
        }
		int M =in.nextInt();
		
		System.out.println(solution(budgets, M));
	}
    // 문제 해결 순서
    //: 예산안 넘지 않는 선에서 최대 금액을 설정한다.
    
    //상한가가 정해지면,
    //(1) 상한가보다 큰 금액 -> 상한가로 치환
    //(2) 상한가보다 작은 금액 -> 그대로
    
    
    //예산이 담긴 배열 budgets과 총 예산 M
	static int solution(int[] budgets, int M) {
		//이분 탐색을 위한, 최솟값 최댓값 변수 선언
        int min=0;
        int max=IntStream.of(budgets).max().orElse(0);
        
        //상한액 조건
        //1. 모든 요청이 배정될 수 있는 경우에는 요청한 금액을 그대로 배정합니다.
        //2. 모든 요청이 배정될 수 없는 경우에는 특정한 정수 상한액을 계산하여 그 이상인 예산요청에는 모두 상한액을 배정합니다. 
        //   상한액 이하의 예산요청에 대해서는 요청한 금액을 그대로 배정합니다. 
        
        //위의 조건을 모두 만족하는 상한액 리턴
        int answer=0;
        
        
        //2. 최댓값과 최솟값이 같아 질때까지 반복
		while(min<=max){
            
            //이분탐색 수행하는데 이용하는 중간값 설정
            final int mid=(min+max)/2;
            //-> 스트림 메서드 안에서 사용하는 변수는 가변변수가 아닌 정적변수로 선언해야하므로, final 선언

            //상한가과 비교해, 설정한 상한가보다 큰 금액과 작은 금액으로 조건 분기
            //: 기본형 int스트림으로 생성, 
            //스트림의 요소를 중간값과 비교해 작은 값을 스트림으로 변환해, 총합을 구하는 최종연산
            int sum=IntStream.of(budgets)
                .map(b->Math.min(b,mid))
                .sum();
            //(1) 상한가보다 큰 금액, 총합에 상한가를 더한다.
            //(2) 상한가보다 작은 금액, 총합에 해당값을 더한다.

            //이분 탐색 수행
            //-> 총합이 최대 예산액보다 작거나 같을 때, 중간값을 상한액으로 설정하는데
            //   최댓값과 최솟값이 같아 질때까지 반복
            if(sum<=M){
                min=mid+1;
                answer=mid;
            }
            else
                max=mid-1;

        }
		
		return answer;			
	}
}

 

(3) 재풀이

package org.algorithms.graph.minimumspanning.prim;

import java.util.Scanner;
import java.util.*;

public class Main {
    public static void main(String[] args){
        Scanner in=new Scanner(System.in);
        int n = in.nextInt();

        int[] arr = new int[n];
        for(int i=0;i<n;i++){
            arr[i]=in.nextInt();
        }
        int m= in.nextInt();

        Main main= new Main();
        System.out.println(main.solution(arr, n, m));
    }
    public int solution(int[]arr, int n, int m){
        int answer=0;
        Arrays.sort(arr);
        int lt=0;
        int rt=arr[arr.length-1];
        while(lt<=rt){
            int limit=(lt+rt)/2;
            int tmp=0;
            for(int i=0;i<n;i++){
                if(arr[i]>limit){
                    tmp+=limit;
                }else{
                    tmp+=arr[i];
                }
                if(tmp>m) break;
            }
            if(tmp<=m) {
                answer=limit;
                lt=limit+1;
            }
            else{
                rt=limit-1;
            }
        }
        return answer;
    }
}

4. 숫자 게임 - 시뮬레이션

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

 

프로그래머스

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

programmers.co.kr

 

 

전체 경우의 수에서 찾기 -> 탐색법

조건에 맞는 조합과 상황을 재현 -> 시뮬레이션

 

문제 해결 순서

  1. 최대 승점은 B가 A를 근소한 차이로 이기는 경우 발생한다.
  2. 작은 값부터 이길 수 있는 값들을 하나씩 제거하면서 계산 [시뮬레이션]

 

문제 구현 순서

  1. A배열과 B배열을 정렬 시킨다.
  2. B배열의 인덱스 값을 이용해, B배열의 끝에서부터 비교
  3. for문을 한번만 사용하기 위해 A배열의 가장 큰 값과 B배열의 가장 큰값을 비교
    1. 이긴 경우는 한칸씩 줄인다
    2. 이길 수 없는 수는 A의 다음 수와 비교

 

(1) 이중 for문으로 구현

import java.util.*;
class Solution {
    public int solution(int[] A, int[] B) {
        int answer = 0;
        
        //가장 작은 차이로 이길 수 있도록, 시뮬레이션 구현
        //1. B배열 오름차순 정렬
        //2. A 배열과 B 배열을 동시에 돌면서, 근소한 차이로 B가 이길 수 있도록
        
        //-> A의 배열을 돌면서, B배열의 가장 작은 값으로 A배열의 값을 이길 때 +1
        Arrays.sort(B);
        for(int i=0;i<A.length;i++){
            for(int j=0;j<B.length;j++){
                if(B[j]>A[i]){
                    answer++;
                    B[j]=0;
                    //B배열을 탐색할 때, 다시 이기는 경우가 없도록
                    break;
                }
            }
        }
        
        return answer;
    }
}

 

(2) for문 하나로 리팩토링 : 정렬 후, 탐색

import java.util.Arrays;

public class Solution {
	//효율성 테스트
	//1. for문을 줄인다.

	static int solution(int[] A, int[] B) {
		int answer = 0;

		// A팀을 B팀이 근소한 차이로 이기게 -> 작은 순서대로 A와 비교

		// 1.A 배열, B 배열 정렬
		//A배열의 값이 큰 순서대로 -> B배열의 값이 큰 것들을 제거해나간다.
		Arrays.sort(A);
		Arrays.sort(B);
		//오름차순정렬
		
		//인덱스값을 이용해 B배열의 끝에서부터 비교
		int index=B.length-1;

		// 2.A배열 돌면서 B배열과 비교
		//루프를 반대로 돌린다.
		for(int i=A.length-1; i>=0;i--) {
			if(A[i]<B[index]) {
			//A 배열의 가장 큰 값과, B배열의 가장 큰 값 비교
				//i) 이긴 경우는 한칸씩 줄인다.
				//ii) 이길 수 없는 숫자는 A의 다음 숫자와 비교
				
				index--;
				answer++;
			}
			
		}

		return answer;
	}

}

 

#A배열을 내림차순 정렬

: 내림차순 정렬은 Primitive형만 가능하므로,

기본 스트림을 스트림으로 변환하는 박싱과 스트림을 기본 스트림으로 변환하는언박싱 작업을 수행해 최종 내림차순 정렬int[]로 반환

Integer[] tmp = Arrays.stream(A).boxed().toArray(Integer[]::new);
Arrays.sort(tmp, Comparator.reverseOrder());
A= Arrays.stream(tmp).mapToInt(i->i).toArray();

 

import java.util.*;
class Solution {
    public int solution(int[] A, int[] B) {
        int answer = 0;
        
        //가장 작은 차이로 이길 수 있도록, 시뮬레이션 구현
        //1. A배열은 내림차순, B배열은 오름차순 정렬
        //2. A 배열과 B 배열을 동시에 돌면서, 근소한 차이로 B가 이길 수 있도록
        
        //-> A의 배열을 돌면서, B배열의 가장 작은 값으로 A배열의 값을 이길 때 +1
        
        Arrays.sort(B);
        
         //스트림 생성 -> 중간 연산 -> 최종 연산
        //1. int[] 배열로 부터 스트림 생성
        //2. boxed()로 기본 스트림을 스트림으로 변환
        //4. 최종연산 toArray()로 스트림을 배열로 변환 
        //-> 메서드 참조 return new Integer[] tmp;
        
        Integer[] tmp = Arrays.stream(A).boxed().toArray(Integer[]::new);
        Arrays.sort(tmp, Comparator.reverseOrder());
        A=Arrays.stream(tmp).mapToInt(i->i).toArray();
        
        //스트림 생성 -> 중간 연산 -> 최종 연산
        //1. Integer[] 배열로 부터 스트림 생성
        //2. mapToInt()로 스트림을 기본 int형 스트림으로 변환
        //4. 최종연산 toArray()로 기본 int형 스트림을 배열로 변환

        int index=B.length-1;
        for(int i=0;i<A.length;i++){
            if(A[i]<B[index]){
                index--;
                answer++;
            }
        }
        return answer;
    }
}

 

반응형