프로그래머스 lv1 0704

HyeJi9908·2022년 7월 4일
0

[JAVA] 프로그래머스

목록 보기
4/11

🔎 개념

소수 판별 ( 에라토스테네스의 체)

  1. 인덱스 숫자가 소수인지 판별하는 함수
	public void isPrime() {

		// true로 초기화
		for (int i = 2; i <= 3000; i++) {
			sieve[i] = true;
		}

		for (int i = 2; i <= (int) Math.sqrt(3000); i++) {
			for (int j = i * i; j <= 3000; j += i) { 		// i*i 미만은 이미 소수판단이 되었음
				sieve[j] = false;
			}
		}

	}
  1. 소수로만 이루어진 ArrayList
List<Integer> sieve = new ArrayList<Integer>();
int num =1000;
int err=0;

for(int i=2;i<num;i++){
	for(int j=2;j<i;j++){
    	if(i%j==0){ err++;break; }
    }
    if ( !err ) {
    	sieve.add(i);
    }else{
        err=0;
    }
}
    

조합 구현 (dfs) : 배열에서 특정 원소 3개를 더한값 구하기

	public void dfs(int[] arr, int depth, int start, int sum) {
		if (depth == 3) {	
			if (sieve[sum])
				answer++;
			return;
		}

		for (int i = start; i < arr.length; i++) {
			dfs(arr, depth + 1, i + 1, sum + arr[i]);
		}
	}

배열에서 특정 값이 있는 지 확인

Arrays.asList(리스트).contains(값)

HashMap

HashMap<Integer,String> map = new HashMap<>(); // 선언

map.put(1,"사과"); // 값 추가
map.put(2,"바나나");

map.get(1);        // key값 1의 value얻기

map.put(1,map.getOrDefault(1,0)+1); 
// map.get(key) 에 값이 있다면 map.get(key)+1, 값이 없었다면 디폴트로 0 +1

// 해시맵값을 수정하고 싶을 경우
map.put(1, map.get(1)-1);

map.containKey(1); // key중에 1이 있는지 bool 반환

map.remove(1);    // key값으로 1인 요소 제거
map.clear();      // 모든 요소 제거

//for문
for (String key : map.keySet()) {}

배열 특정 부분 자르기

//인덱스 start부터 end 까지만 남긴다면 
int[] arr = Arrays.copyOfRange(array,start-1,end); 

배열의 오름차순/내림차순 정렬

int arr[] = {4, 33, 24, 15, 17, 21};
    
Arrays.sort(arr); // 배열 오름차순 정렬
Arrays.sort(arr, Collections.reverseOrder()); // 내림차순 정렬

Arrays.sort(arr, 0, 4); // 인덱스 0부터 4까지 부분정렬

배열 내 최댓값 찾기

int max=Arrays.stream(answer).max().getAsInt();

📚 소수 만들기 - DFS

class java0703_6 {

	public int answer = 0; // 클래스 내의 어느 함수에서도 접근가능하도록
	public boolean[] sieve; // 주의) 
    //여기서 = new boolean[n] 하면 안됨 main에서 해야함

	public int solution(int[] nums) {

		sieve = new boolean[3001]; 		
        // 각 원소의 최댓값이 1000, 근데 3개 조합이기에 3000까지 소수 판별 해놔야 함

		isPrime(); // sieve 인덱스 숫자의 소수 여부 판별

		dfs(nums, 0, 0, 0); 
        // 조합한 뒤 그 수의 인덱스가 소수이면 answer에 1증가

		return answer;
	}

	public void isPrime() {

		// true로 초기화
		for (int i = 2; i <= 3000; i++) {
			sieve[i] = true;
		}

		for (int i = 2; i <= (int) Math.sqrt(3000); i++) {
			for (int j = i * i; j <= 3000; j += i) { 		
            // i*i 미만은 이미 소수판단이 되었음
				sieve[j] = false;
			}
		}

	}

	public void dfs(int[] arr, int depth, int start, int sum) {
		if (depth == 3) {
			if (sieve[sum])
				answer++;
			return;
		}

		for (int i = start; i < arr.length; i++) {
			dfs(arr, depth + 1, i + 1, sum + arr[i]);
		}
	}

}

📚 완주하지 못한 선수 - Hash

import java.util.HashMap;

public class java0704_1 {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        
        HashMap<String,Integer> map = new HashMap<>();
        
        // 초기화
        for(String c: participant) 
        	map.put(c,map.getOrDefault(c, 0)+1);
            // map.get(c) 에 값이 있다면 기존값, 값이 없었다면 디폴트로 0 
        
        for(String c: completion) {
        	map.put(c, map.get(c)-1);
        }        
        
        for(String key:map.keySet()) {
        	if(map.get(key)>0) 
        		answer=key;
        }
        
        return answer;
    }

📚 K번째 수

import java.util.Arrays;

public class java0704_2 {
    public int[] solution(int[] array, int[][] commands) {
        int[] answer = new int[commands.length];
        
        for(int i=0; i<commands.length;i++) {
        	int[] arr = Arrays.copyOfRange(array,commands[i][0]-1,commands[i][1]); 
        	// 인덱스 commands[i][0]부터 commands[i][1] 까지만 남기기 
        	
        	Arrays.sort(arr); // 배열 오름차순 정렬
        	answer[i] = arr[commands[i][2]-1]; //  이런식으로 추가하는게..?
        }
        return answer;
    }
}

📚 모의고사

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

public class java0704_3 {
    public List<Integer> solution(int[] answers) {
    	
    	int[] answer = {0,0,0};
    	
    	int[] stu1 = {1,2,3,4,5};
    	int[] stu2 = {2,1,2,3,2,4,2,5};
    	int[] stu3 = {3,3,1,1,2,2,4,4,5,5};
    	
    	for(int i=0;i<answers.length;i++) {
    		if(answers[i]==stu1[i%stu1.length]) answer[0]+=1;
    		if(answers[i]==stu2[i%stu2.length]) answer[1]+=1;
    		if(answers[i]==stu3[i%stu3.length]) answer[2]+=1;
    	}
    	
    	int max=Arrays.stream(answer).max().getAsInt(); // 배열 내 최댓값 찾기
    	List<Integer> ans = new ArrayList<Integer>();
    	
    	for(int i=0;i<answer.length;i++) {
    		if(answer[i]==max) ans.add(i+1); // 순서가 1부터 시작
    	}
        
        return ans;
    }
 }

0개의 댓글