본문 바로가기
프로그래머스/C

[프로그래머스/C]프로그래머스 Level 1 : 숫자 짝꿍 C언어

by starfish22 2022. 10. 28.
728x90

▶문제 : 코딩테스트 연습 - 숫자 짝꿍 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

▶코드 작성

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

int numX[10], numY[10];

char *solution(const char *X, const char *Y) {
    char *answer;
    int x_len, y_len;
    for (x_len = 0; X[x_len] != '\0'; x_len++) numX[X[x_len] - '0']++;
    //X문자열의 각 숫자 개수 가져오기
    for (y_len = 0; Y[y_len] != '\0'; y_len++) numY[Y[y_len] - '0']++;
    //Y문자열의 각 숫자 개수 가져오기
    answer = (x_len > y_len) ? (char *)malloc(y_len) : (char *)malloc(x_len);
    //두 문자열 중 더 작은 배열길이로 동적할당

    int len = 0;
    for (int i = 9; i >= 0; i--) {//큰 값부터 입력해야됨
        int n = (numX[i] > numY[i]) ? numY[i] : numX[i];//공통되는 개수
        for (int j = 0; j < n; j++) answer[len++] = '0' + i;
        //공통되는 개수만큼 반복하여 입력
    }
    
    if(len==0){//공통되는 수가 없을 때
        answer[len++] = '-';
        answer[len++] = '1';
    }
    else if(answer[0]=='0') len=1;//공통되는 수가 0밖에 없을 때
    answer[len] = '\0';//마지막에 널문자

    return answer;
}

 

▶해석

공통되는 숫자를 찾기 위해 각 문자열 숫자들의 개수 총합을 numX, numY에 저장하였다.

예를 들면 numX [8] 값이 5라면 X문자열에 있는 8의 개수가 5개이다.

 

두 문자열이 가질 수 있는 공통되는 숫자들의 최대 개수는 두 문자열의 길이 중 더 작은 길이이다.

따라서 동적 할당의 크기를 더 작은 길이로 하였다.

 

공통되는 숫자들로 만들 수 있는 가장 큰 정수를 만들어야 하므로 i=9부터 반복을 시작한다.

변수 n에 공통되는 숫자를 대입하는데 numX배열과 numY배열 중 더 적은 값이 공통되는 숫자이다.

(공통되는 숫자가 없더라도 numX, numY 배열들은 전역 변수이기에 기본값이 0이므로 n=0이 된다)

 

문자열 입력은 for 문으로 answer에 숫자 i를 n번 대입한다.

 

공통되는 숫자가 없을 때 또는 0밖에 없을 때의 조건을 작성하고,

문자열의 끝을 알려주기 위해 answer [len]에 널값을 추가해주면 끝.

728x90

댓글