본문 바로가기

프로그래머스 코딩테스트

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

첫번째 - 개미군단

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

 

입출력 예

hp result
23 5
24 6
999 201

 

 

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

int solution(int hp) {
    int answer = 0;
    answer += hp/5;
    hp -= answer*5;
    answer += hp/3;
    answer += hp%3;
    return answer;
}

장군개미는 hp를 5로 나눈 몫만큼,

병정개미는 장군개미의 체력을 뺀 hp를 3으로 나눈 몫만큼,

일개미는 나머지만큼 데리고 나가면 된다.

 

 

 

 

두번째 - 모스부호

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

 

입출력 예

letter result
".... . .-.. .-.. ---" "hello"
".--. -.-- - .... --- -." "python"

 

 

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>

// 파라미터로 주어지는 문자열은 const로 주어집니다. 변경하려면 문자열을 복사해서 사용하세요.
char* solution(const char* letter) {
    // return 값은 malloc 등 동적 할당을 사용해주세요. 할당 길이는 상황에 맞게 변경해주세요.
    char* answer = (char*)malloc(sizeof(char)*100);
    char* morse[] = {".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."};
    
    int i, j, k=0;
    char *oneMorse;
    
    oneMorse = strtok(letter, " ");
    do{
        
        for(i=0;i < 26;i++){
            if(strcmp(oneMorse, morse[i])==0)
            answer[k++]='a' + i;
            
        }
        oneMorse = strtok(NULL, " ");
    }while(oneMorse != NULL);
    answer[k]='\0';
    return answer;
}

do while 문의 조건을 찾는데에서 애를 먹었다.

'\0'값이 아닐때로 놓고 찾았더니 반복문이 멈추지 않아서...

우선 strtok 함수를 이용해서 공백을 기준으로 입력받은 모스부호를 나눠준다.

그리고 반복문을 이용하여 mores와 비교하여

같으면 morse의 인덱스 값만큼을 'a'에 더해서 그 알파벳을 answer에 넣어주면 된다.

이 과정을 oneMorse가 NULL 값이 아닐때 계속해서 반복해준다.

 

 

 

 

 

세번째 - 가위 바위 보

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

 

입출력 예

rsp result
"2" "0"
"205" "052"

 

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

// 파라미터로 주어지는 문자열은 const로 주어집니다. 변경하려면 문자열을 복사해서 사용하세요.
char* solution(const char* rsp) {
    // return 값은 malloc 등 동적 할당을 사용해주세요. 할당 길이는 상황에 맞게 변경해주세요.
    char* answer = (char*)malloc(rsp);
    
    int i;
    for(i=0;rsp[i]!='\0';i++)
        switch(rsp[i]){
            case '2': answer[i]='0'; 
                break;
            case '0' : answer[i]='5';
                break;
            case '5' : answer[i]='2';
                break;
        }
    answer[i]='\0';
    
    
    return answer;
}

switch문을 이용해서 answer[i]에 이기는 값을 넣어줬다.

 

 

 

 

 

네번째 - 구슬을 나누는 경우의 수

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

 

입출력 예

balls share result
3 2 3
5 3 10

 

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

int solution(int balls, int share) {
    unsigned long long int answer = 1;
    
    int i;
    int num = balls-share;
    if(num<share){
        for(i=0;i<num;i++){
            answer *= (balls-i);
            answer /= (i+1);
        }
    }
    else{
        for(i=0;i<share;i++){
            answer *= (balls-i);
            answer /= (i+1);
        }
    }
    
    
    return answer;
}

이 문제에서 필요한 공식은 바로 조합이다.

nCr = n! / (n-r)! / r!

nCr == nCn-r

여기서 n이 balls이고, share가 r이다.

 

문제에서 가장 다루기 힘들었던 점은 변수의 크기였다.

아무래도 팩토리얼을 다루다 보니 변수의 값이 매우 커져 자꾸만 오류가 났다.

이러한 문제를 해결하기 위해 곱셈과 나눗셈을 같이 하는 방법을 사용했다.

 

nCr과  nCn-r은 같기 때문에 share와  num중 더 작은 값만큼 반복문을 돌려

balls-i를 곱해주고, i+1을 나눠주면 된다.

정해진 공식을 따라가기보단 

우리가 현실에서 문제를 풀 때 사용하는 변형된 공식을 이용해 문제를 풀었다.