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
'프로그래머스 > C' 카테고리의 다른 글
프로그래머스 Level 1 : 햄버거 만들기 C언어 (0) | 2022.10.29 |
---|---|
프로그래머스 Level 1 : 옹알이 (2) C언어 (2) | 2022.10.29 |
프로그래머스 Level 1 : 콜라 문제 C언어 (0) | 2022.10.24 |
프로그래머스 Level 1 : 삼총사 C언어 (0) | 2022.10.24 |
프로그래머스 Level 2 : 두 큐 합 같게 만들기 C언어 (0) | 2022.08.23 |
댓글