[프로그래머스] 6문제

36782 단어 JavaalgorithmJava

각 챕터마다 쉬운거 한 문제씩 풀었다. (dp,greedy는 문법적인 면에서는 크게 달라지는게 없을 거 같고,dfs/bfs는 어제 했으니까 귀찮아서 패스)

1. 완주하지 못한 선수

코드

import java.util.*;
class Solution {
    public String solution(String[] participant, String[] completion) {
        Arrays.sort(participant);
        Arrays.sort(completion);
        String answer = participant[participant.length-1];
        for(int i=0;i<completion.length;i++){
            if(!participant[i].equals(completion[i])){
                answer = participant[i];
                break;
            }
        }
        return answer;
    }
}

이 문제는 c++로도 풀어보고 파이썬으로 풀어보고 자바로도 풀어봤다.
하하하....
맵을 쓰지는 않았고 정렬을 이용해서 문제를 풀었다.

2. 위장

코드

import java.util.*;
class Solution {
    public HashMap<String,Integer> comb = new HashMap<String,Integer>();
    public int solution(String[][] clothes) {
        int answer = 1;
        //종류-개수 맵으로 바꾸기
        for(int i=0;i<clothes.length;i++){
            comb.put(clothes[i][1],comb.getOrDefault(clothes[i][1],0)+1);
        }
        //키셋 가져오기
        Set<String> keySet = comb.keySet(); 
        for(String k:keySet){
            answer*=(comb.get(k)+1);
        }
        //아무것도 안입는 경우의 수는 제거함
        return answer-1;
    }
}

hashMap을 사용해서 풀어주었다.
map에 key값에 여러 개의 value가 들어가게 하려면 계속 list를 갱신해줘야 하기 때문에 메모리 낭비라고 생각하여 바로 개수를 넣어주도록 했다.

getOrDefault(key,0)
key가 존재하면 값을 가져오고 아니면 0으로 넣어주는 함수이다.
요놈 요놈~~ map문제 나오면 잘 써야할 것 같네요~

keySet()
key값들을 set의 형태로 리턴해주는 함수

Map 함수 정리된 사이트

https://vaert.tistory.com/107 - 여기는 함수가 다 정리되어있고
https://wakestand.tistory.com/112 - 여기는 개념잡기 좋음

3. 기능개발

코드

import java.util.*;
class Solution {
    public Queue<Integer> days = new LinkedList<>();
    public ArrayList<Integer> answers = new ArrayList<>();
    public int[] solution(int[] progresses, int[] speeds) {
        int day = 0;
        //남은 일 수 넣기
        for(int i=0;i<speeds.length;i++){
            if((100-progresses[i])%speeds[i]!=0){
                day = (100-progresses[i])/speeds[i]+1;
            }
            else{
                day = (100-progresses[i])/speeds[i];
            }
            days.add(day);
        }
        deployment();
        int[] answer = new int[answers.size()];
        for(int i=0;i<answers.size();i++){
            answer[i]=answers.get(i);
        }
        return answer;
    }
    //계산해서answer에 값 넣어주기
    public void deployment(){
        //맨 처음 값 넣어주기 
        int day=days.poll();
        int count=1;
        int tmp=0;
        while(!days.isEmpty()){
            tmp = days.poll();
            if(day>=tmp){
                count++;
            }
            else{
                answers.add(count);
                count=1;
                day =tmp;
            }
        }
        answers.add(count);
    }
}

4. 더 맵게

코드

import java.util.*;
class Solution {
    public PriorityQueue<Integer> pq = new PriorityQueue<>();
    
    public int solution(int[] scoville, int K) {
        int answer = 0;
        int first=0;
        int second=0;
        //우선순위큐에 값 넣어주기
        for(int i=0;i<scoville.length;i++){
            pq.add(scoville[i]);
        }
        while(pq.peek()<K){
            if(pq.size()<2){
                return -1;
            }
            answer++;
            first = pq.poll();
            second = pq.poll();
            pq.add(first+(second*2));
        }
        return answer;
    }
}

우선순위큐는 지원이 되네 짜식ㅎ
-1이 리턴되는 경우도 고려를 해줘야 한다.

5. K번째 수

코드

import java.util.*;
class Solution {
    public ArrayList<Integer> li = new ArrayList<>();
    public ArrayList<Integer> answers = new ArrayList<>();
    public int[] solution(int[] array, int[][] commands) {
        int[] answer;
        for(int i=0;i<commands.length;i++){
            for(int j=commands[i][0]-1;j<commands[i][1];j++){
                li.add(array[j]); //값 넣어주기
            }
            Collections.sort(li);//오름차순 정렬
            answers.add(li.get(commands[i][2]-1));//값 넣어주기
            li.clear();
        }
        answer = new int[answers.size()];
        for(int i=0;i<answers.size();i++){
            answer[i]=answers.get(i);
        }
        return answer;

6. 입국심사

코드

import java.util.*;
class Solution {
    public long solution(int n, int[] times) {
        long answer=0;
        int tlen = times.length;
        Arrays.sort(times);//시간을 오름차순으로 정렬
        long min = times[0]; //사람 1명일 때 최소시간
        long max = (long) times[tlen-1]*n;//최대시간*사람 수 
        long mid = 0;
        long count =0;
        while(min<=max){
            count=0;
            mid = (min+max)/2;
            for(int i=0;i<tlen;i++){
                count+= mid/times[i];
            }
            if(count>=n){ //시간을 줄여라
                max = mid-1;
                answer = mid;
            }
            else{ //시간을 늘려라
                min = mid+1;
            }
        }
        
        return answer;
    }
}

형변환을 잘 해줘야 한다.
처음에는 min을 int로 했었는데 만약 min = mid+1을 해야할 때, mid가 int의 표현범위를 넘어설 수 있기 때문에 min도 long으로 해주었다.

또한 int*int를 할 때 (long) 캐스팅을 해주지 않으면 값이 잘린 형태로 long 변수에 들어가기 때문에 이 때도 캐스팅을 해줘야 한다.

벼락치기는 여기까지 할란다...그래도 오늘 stack, queue는 좀 익힌 것 같고 list->array 바꾸는 것도 배웠다.
map도 했고.. 떨어져도 쩔 수 없 지 머.....붙는 걸 바라는 게 웃긴거다 푸하하

좋은 웹페이지 즐겨찾기