본문 바로가기

프로그래머스 코딩테스트

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

첫번째 - 배열 자르기

정수 배열 numbers와 정수 num1num2가 매개변수로 주어질 때, numbers의 num1번 째 인덱스부터 num2번째 인덱스까지 자른 정수 배열을 return 하도록 solution 함수를 완성해보세요.

 

입출력 예

number num1 num2 result
[1, 2, 3, 4, 5] 1 3 [2, 3, 4]
[1, 3, 5] 1 2 [3, 5]

 

 

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

// numbers_len은 배열 numbers의 길이입니다.
int* solution(int numbers[], size_t numbers_len, int num1, int num2) {
    // return 값은 malloc 등 동적 할당을 사용해주세요. 할당 길이는 상황에 맞게 변경해주세요.
    int* answer = (int*)malloc(numbers);
    int i, j=0;
    for(i=num1;i<=num2;i++){
        answer[j]=numbers[i];
        j++;
    }
    answer[j]='\0';
    return answer;
}

answer의 인덱스를 따로 변수로 두고

number의 num1부터 num2까지를 answer에 넣어주면 된다

 

 

 

 

두번째 - 외계행성의 나이

우주여행을 하던 머쓱이는 엔진 고장으로 PROGRAMMERS-962 행성에 불시착하게 됐습니다. 입국심사에서 나이를 말해야 하는데, PROGRAMMERS-962 행성에서는 나이를 알파벳으로 말하고 있습니다. a는 0, b는 1, c는 2, ..., j는 9입니다. 예를 들어 23살은 cd, 51살은 fb로 표현합니다. 나이 age가 매개변수로 주어질 때 PROGRAMMER-962식 나이를 return하도록 solution 함수를 완성해주세요.

 

입출력 예

age result
23 "cd"
51 "fb"
100 "baa"

 

 

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

char* solution(int age) {
    // return 값은 malloc 등 동적 할당을 사용해주세요. 할당 길이는 상황에 맞게 변경해주세요.
    char* answer = (char*)malloc(sizeof(char)*4);
    sprintf(answer, "%d", age);
    
    for(int i=0;i<strlen(answer);i++)
        answer[i] += 49;
    
    return answer;
}

sprintf함수를 이용하여 age의 숫자를 answer에 문자열로 저장한다

* sprintf(저장될 위치, "포맷",포맷에 해당하는 데이터)

그리고 문자로 저장된 숫자를 알파벳으로 만들기 위해서 각 문자에 49씩 더한다

 

왜 49씩 더하는가?

그 이유는 바로 아스키코드에 있다!

아스키코드표를 보면 '0'이 48,

'a'가 97이기 때문에 '0'을 'a'로 바꿔주려면

97-48=49 만큼 더해줘야하기 때문이

 

 

 

세번째 - 진료순서 정하기

외과의사 머쓱이는 응급실에 온 환자의 응급도를 기준으로 진료 순서를 정하려고 합니다. 정수 배열 emergency가 매개변수로 주어질 때 응급도가 높은 순서대로 진료 순서를 정한 배열을 return하도록 solution 함수를 완성해주세요.

 

입출력 예

emergency result
[3, 76, 24] [3, 1, 2]
[1, 2, 3, 4, 5, 6, 7] [7, 6, 5, 4, 3, 2, 1]
[30, 10, 23, 6, 100] [2, 4, 3, 5, 1]

 

 

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

// emergency_len은 배열 emergency의 길이입니다.
int* solution(int emergency[], size_t emergency_len) {
    // return 값은 malloc 등 동적 할당을 사용해주세요. 할당 길이는 상황에 맞게 변경해주세요.
    int* answer = (int*)malloc(emergency);
    int i, j, maxIndx=0;
    int n=1;
    for(j=0;j<emergency_len;j++){
        answer[j]=1;
        for(i=0;i<emergency_len;i++)
            if(emergency[j]<emergency[i])
                answer[j]++;
    
    }
    return answer;
}

 

 

인덱스가 i, j 두가지가 있는데 같은 인덱스 번호를 같은 사람이라고 생각하자

중첩반복문을 사용하여 emergency의 i값과 j의 값을 비교했을 때

j가 i보다 작으면 j의 순서가 하나씩 뒤로 밀리는 것으로 표현해주면 된다

-> answer[j]의 값 하나씩 증가

 

 

 

 

네번째 - 순서쌍의 개수

순서쌍이란 두 개의 숫자를 순서를 정하여 짝지어 나타낸 쌍으로 (a, b)로 표기합니다. 자연수 n이 매개변수로 주어질 때 두 숫자의 곱이 n인 자연수 순서쌍의 개수를 return하도록 solution 함수를 완성해주세요.

 

입출력 예

n result
20 6
100 9

 

 

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

int solution(int n) {
    int answer = 0;
    int i, count=0;
    for(i=1;i<=n;i++){
        if(n%i==0)
            answer++;
    }

    return answer;
}

두 숫자의 곱이 n인 순서쌍의 개수를 구하라는 것은

n의 약수의 개수를 구하라는 것과 같은 의미이다