코딩테스트 DAY9

차준우·2022년 12월 15일
0
post-thumbnail

프로그래머스 코딩테스트 입문 - DAY9

😒개미 군단

개미 군단이 사냥을 나가려고 합니다. 개미군단은 사냥감의 체력에 딱 맞는 병력을 데리고 나가려고 합니다. 장군개미는 5의 공격력을, 병정개미는 3의 공격력을 일개미는 1의 공격력을 가지고 있습니다. 예를 들어 체력 23의 여치를 사냥하려고 할 때, 일개미 23마리를 데리고 가도 되지만, 장군개미 네 마리와 병정개미 한 마리를 데리고 간다면 더 적은 병력으로 사냥할 수 있습니다. 사냥감의 체력 hp가 매개변수로 주어질 때, 사냥감의 체력에 딱 맞게 최소한의 병력을 구성하려면 몇 마리의 개미가 필요한지를 return하도록 solution 함수를 완성해주세요.

테스트 케이스

hpresult
235
246
999201
class Solution {
    public int solution(int hp) {
        int answer = 0;
        int ja = 0; //장군개미
        int by = 0; //병정개미
        int il = 0; //일개미
        if(hp >= 5) {
            ja = hp / 5;
            hp %= 5;
        }
        if(hp >=3) {
            by = hp / 3;
            hp %= 3;
        }
        il = hp;
        answer += ja+by+il;
        
        return answer;
    }
}

😒모스부호(1)

머쓱이는 친구에게 모스부호를 이용한 편지를 받았습니다. 그냥은 읽을 수 없어 이를 해독하는 프로그램을 만들려고 합니다. 문자열 letter가 매개변수로 주어질 때, letter를 영어 소문자로 바꾼 문자열을 return 하도록 solution 함수를 완성해보세요.
모스부호는 다음과 같습니다.

morse = { 
    '.-':'a','-...':'b','-.-.':'c','-..':'d','.':'e','..-.':'f',
    '--.':'g','....':'h','..':'i','.---':'j','-.-':'k','.-..':'l',
    '--':'m','-.':'n','---':'o','.--.':'p','--.-':'q','.-.':'r',
    '...':'s','-':'t','..-':'u','...-':'v','.--':'w','-..-':'x',
    '-.--':'y','--..':'z'
}

테스트 케이스

letterresult
".... . .-.. .-.. ---""hello"
".--. -.-- - .... --- -.""python"
import java.util.*;
class Solution {
    public String solution(String letter) {
        String answer = "";
        String[] morse={".-","a","-...","b","-.-.","c","-..","d",".","e","..-.","f","--.","g","....","h","..","i",".---","j","-.-","k",".-..","l","--","m","-.","n","---","o",".--.","p","--.-","q",".-.","r","...","s","-","t","..-","u","...-","v",".--","w","-..-","x","-.--","y","--..","z"};
        String[] letter_ar=letter.split(" ");
        String[] answer_array=new String[letter_ar.length];
        for(int i=0;i<letter_ar.length;i++){
            for(int j=0;j<morse.length;j++){
                if(letter_ar[i].equals(morse[j])){
                    answer_array[i]=morse[j+1];
                }
            }
        }
        String joinString = String.join("", answer_array);
        answer=joinString;
        return answer;
    }
}

1.공백으로 구분하여 배열화한다.
2.반복문으로 하나씩 비교해서 배열을 완성한다.
3.String.join으로 배열을 문자화한다. + return answer

import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Map;
class Solution {
    public String solution(String letter) {
        HashMap<String,String> map = new HashMap<String,String>(){
            {
                put(".-","a");   put("-...","b");
                put("-.-.","c"); put("-..","d");
                put(".","e");    put("..-.","f");
                put("--.","g");  put("....","h");
                put("..","i");   put("---","j");
                put("-.-","k");  put(".-..","l");
                put("--","m");   put("-.","n");
                put("---","o");  put(".--.","p");
                put("--.-","q"); put(".-.","r");
                put("...","s");  put("-","t");
                put("..-","u");  put("...-","v");
                put(".--","w");  put("-..-","x");
                put("-.--","y"); put("--..","z");
            }
        };
        //공백을 기준으로 판단
        String ans = "";
        String[] arr = letter.split(" ");
        for(int i=0;i<arr.length;i++) {
            for (Entry<String, String> entrySet : map.entrySet()) {
                if(arr[i].equals(entrySet.getKey())) {
                    ans+= entrySet.getValue();
                }        
            }
        }
        return ans;
    }
}

이처럼 Map을 사용해도 가능하다.(유사 디렉토리(?))
entrySet은 map전체를 순회한다. entrySet()은 key value모두 필요할 때 사용하며, 마침 이 상황과 어울린다. key값(모스부호)과 같으면 해당 모스부호에 맞는 value값을 꺼내 문자열 ans에 더한다(이어붙인다).

😒가위바위보

가위는 2 바위는 0 보는 5로 표현합니다. 가위 바위 보를 내는 순서대로 나타낸 문자열 rsp가 매개변수로 주어질 때, rsp에 저장된 가위 바위 보를 모두 이기는 경우를 순서대로 나타낸 문자열을 return하도록 solution 함수를 완성해보세요.

테스트 케이스

rspresult
"2""0"
"205""052"
class Solution {
    public String solution(String rsp) {
        String answer = "";
        String[] arr = rsp.split("");
        String ans = "";
        for(int i=0;i<arr.length;i++) {
            if(arr[i].equals("2")) {
                ans += "0";
            }
            else if(arr[i].equals("0")) {
                ans += "5";
            }
            else if(arr[i].equals("5")) {
                ans += "2";
            }
        }
        return ans;
    }
}

😒구슬을 나누는 경우의 수

머쓱이는 구슬을 친구들에게 나누어주려고 합니다. 구슬은 모두 다르게 생겼습니다. 머쓱이가 갖고 있는 구슬의 개수 balls와 친구들에게 나누어 줄 구슬 개수 share이 매개변수로 주어질 때, balls개의 구슬 중 share개의 구슬을 고르는 가능한 모든 경우의 수를 return 하는 solution 함수를 완성해주세요.

테스트 케이스

ballsshare
32
53

힌트

import java.math.BigInteger;

class Solution {
    public BigInteger solution(int balls, int share) {
        BigInteger b = BigInteger.valueOf(balls);
        BigInteger s = BigInteger.valueOf(share);
        BigInteger n = new BigInteger("1"); //balls의 팩토리얼 값
        BigInteger m = new BigInteger("1"); //share의 팩토리얼 값
        BigInteger nm = new BigInteger("1"); //balls - share의 팩토리얼 값 
        BigInteger a = new BigInteger("1"); //로직 제어용
        BigInteger n_m = b.subtract(s);
        System.out.println(n_m);
        while(a.compareTo(b)==-1) {
            n = n.multiply(b);
            b = b.subtract(BigInteger.valueOf(1));
        } 
        while(a.compareTo(s)==-1) { // share의 팩토리얼 값
            m = m.multiply(s);
            s = s.subtract(BigInteger.valueOf(1));
        } 
        while(a.compareTo(n_m)==-1) { // balls - share의 팩토리얼
            nm = nm.multiply(n_m);
            n_m = n_m.subtract(BigInteger.valueOf(1));
        }
        return n.divide(nm.multiply(m));
    }
}

30팩토리얼처럼 너무 큰 값은 int와 long으로 담을 수 없기 때문에 BigInteger를 사용해야했다. 설명은 주석에 간단하게 포함했습니다.

출처 : https://school.programmers.co.kr/learn/challenges
이미지 출처 : 작가 storyset 출처 Freepik

profile
개애발

0개의 댓글