본문 바로가기

COS pro 2급

구름 에듀 COS PRO 2급 C언어 2차 풀이

[빈칸] 문제

문제1) 최대한 많은 쌍의 장갑 갯수 구하기

문제 설명: 번호가 1부터 10까지 있는 장갑이 있다. 왼쪽 장갑과 오른쪽 장갑이 짝이 모두 맞지 않는 상황이다. 이 상황에서 번호가 똑같은 쌍을 찾아 최대한 몇 쌍의 장갑을 구할 수 있을지 알아보자

정답💌

int* func_a(int gloves[], int gloves_len){
    int* counter = (int*)malloc(sizeof(int)*(max_product_number + 1));
    for(int i = 0; i <= max_product_number; ++i)
        counter[i] = 0;
    
    for(int i = 0; i < gloves_len; ++i)
        counter[i]++;
    
    return counter;
}

정리💥

  • 장갑 번호에 따른 방에 +1씩 해주면 번호별로 장갑이 몇개 있는지 알 수 있다
  • 최대 몇 쌍인지는 solution에서 계산한다

문제2) 더 많은 배수 구하기

문제 설명: 주어진 배열에서 3과 5, 어느 숫자의 배수가 더 많이 들어있는지 알아내자

정답💌

char* solution(int arr[], int arr_len) {
    int count_three = func_c(arr, arr_len);
    int count_five = func_a(arr, arr_len);
    char* answer = func_b(count_three, count_five);
    return answer;
}

정리💥

  • fun_a() : 5의 배수 카운트
  • fun_b() : 3의 배수 갯수와 5의 배수 갯수 비교하여 더 큰 값 출력
  • fun_c() : 3의 배수 카운트

[구현] 문제

문제3) 짝수들의 제곱의 합 구하기

문제 설명: N부터 M 사이에 있는 숫자들 중, 짝수들의 제곱을 모두 더해보자

정답💌

int solution(int N, int M) {
    int answer = 0;
    for(int i = N; i<=M; i++){
			if(i%2==0) answer += i*i;
		}
    return answer;
}

정리💥

  • i는 N부터 M까지 반복
  • 짝수라면 answer에 제곱해서 더한다

문제4) 5글자 이상인 단어 배열하기

문제 설명: 주어진 배열에서 5글자 이상인 문자열 요소끼리만 더해보자

정답💌

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

char* solution(char* words[], int words_len) {
    char* answer = "";
    answer = malloc(words_len*sizeof(char));
		for(int i = 0; i<words_len; i++){
			if(strlen(words[i])>=5) strcat(answer, words[i]);
		}
	
	if(!strcmp(answer,"")) return "empty";    	
    	else return answer;
}

정리💥

  • answer이라는 주소값을 알고 있기 때문에 꼭 solution함수 안에서 메모리 해제해주지 않아도 괜찮다
  1. answer에 (배열의 길이)*(char 데이터형의 크기)로 메모리를 동적할당해준다
  2. for문으로 배열의 요소를 순환하며 문자열의 길이가 5인 요소들은
  3. strcat() 함수를 이용해 answer에 추가해준다
  4. 반복문을 벗어났는데도 answer이 빈 문자열이라면 "empty"를 return해준다
  5. 아니라면 answer retun

[빈칸] 문제

문제5) 몬스터 공격하기

문제 설명: 게임 캐릭터가 공격 몇 번만에 몬스터를 죽일 수 있을지 알아내자

정답💌

int solution(int attack, int recovery, int hp) {
    int count = 0;
    while(true){
        count += 1;
        hp -= attack;
        if(hp <= 0)
            break;
        hp += recovery;
    }
    return count;
}

정리💥

  • while문이 한 번 반복될때마다 공격 횟수 +1
  • ------------------------------------------------------------
  • 몬스터의 hp는 캐릭터의 attack만큼 줄어들고
  • recovery만큼 회복된다
  • ------------------------------------------------------------
  • hp가 0보다 작아졌다면 반복문을 종료하고
  • 캐릭터의 공격 몇 번만에 죽었는지 반환한다

문제6) 엘레베이터의 총 이동거리 구하기

문제 설명: 엘레베이터가 하루 동안 얼마나 층을 이동했는지 구한다

정답💌

int solution(int floors[], int floors_len) {
    int dist = 0;
    for(int i = 1; i<floors_len; ++i){
        if(floors[i]>floors[i-1])
            dist += floors[i] - floors[i-1];
        else
            dist += floors[i-1] - floors[i];
    }
    return dist;
}

정리💥

  • if문 안에서 [ i ]와 [ i - 1 ]를 비교하기 때문에 i는 1부터 시작해주면 된다

문제7) 섭씨, 화씨 온도 바꾸기

문제 설명: 섭씨는 화씨로, 화씨는 섭씨 온도로 바꾼다

정답💌

int solution(int value, char* unit) {
    int converted = 0;
    if (unit[0] == 'C')
        converted = (value * 1.8) + 32;
    if (unit[0] == 'F')
        converted = (value - 32) / 1.8;
    return converted;
}

정리💥

  • 연산자 우선순위가 -보다 /이 더 높기 때문에
  • 괄호()를 사용해 -의 우선순위를 높여주어야한다

문제8) 소수의 갯수 구하기

문제 설명: 주어진 긴 숫자를 쪼개서 그 안에 소수가 몇개나 있는지 구해보자

정답💌

int solution(int number) {
    int count = 0;
    while(number >= 1){
        int n = number % 10;
        if (n == 2 || n == 3 || n == 5 || n == 7)
            count += 1;
        number /= 10;
    }
    return count;
}

정리💥

  • while문의 조건을 number가 0인데도 한 번 더 반복하게 하면
  • 긴 숫자에 없는 숫자(0)을 한 번 더 반복하게 되는 꼴이 된다
  • 0이 되기 직전 숫자인 1까지만 반복을 허용해주자

문제9) 투표에 대한 후보 찾기

문제 설명: 특정 수만큼 표를 받은 후보가 몇명인지 찾아보자

정답💌

int solution(int votes[], int votes_len, int N, int K) {

	//1번
    int counter[11] = {0};
    for(int i = 0; i < votes_len; ++i)
        counter[votes[i]] += 1;
        
    //2번
    int answer = 0;
    for(int i = 0; i <= N; ++i)
        if(counter[i] == K)
            answer += 1;
            
    return answer;
}

정리💥

  1. 기호 몇 번에 몇명이 투표했는지, 해당하는 counter방에 카운트한다
  2. counter의 요소를 훑으며 K만큼 투표수를 받은 후보는 몇명인지 카운트한다

문제10) 상품권 총 지급액 구하기

문제 설명: 고객들이 각각 얼마나 구매했는지 들어있는 배열이 주어진다. 각 고객들에게 줄 상품권을 모두 더해 구한다. 

정답💌

int solution(int purchase[], int purchase_len) {
    int total = 0;
    for(int i = 0; i < purchase_len; ++i){
        if(purchase[i] >= 1000000)
            total += 50000;
        else if(purchase[i] >= 600000)
            total += 30000;
        else if(purchase[i] >= 400000)
            total += 20000;
        else if(purchase[i] >= 200000)
            total += 10000;
    }
    return total;
}

정리💥

  • 200000보다 클때라는 조건을 주지 않으면
  • 400000보다 작은 모든 수가 total += 10000;를 하게 된다

수고하셨습니다 :)

문제 풀이에 오류가 있다면 알려주세요!