2026. 3. 18. 16:54ㆍProgrammers

문제는 다음과 같다.
이 문제를 풀 때 주어진 기본 코드는 아래와 같았다.

여기서 포인트는
1. 동적할당
2. 문자열의 길이
3. *로 변환
이렇게 짚고 코드를 작성했다.
작성한 코드는 다음과 같다.
오답코드

이게 처음에 작성했던 코드이다.
당연히 오류가 나서 오답처리였다.
오류가 날 부분들을 되짚어 봤다.
오답노트
첫번째
strcpy(answer[i], '*');
strcpy는 문자열 전체를 복사하는 함수이다.
strcpy(목적지문자열, 원본문자열);
strcpy는 이런 형태로 사용해야한다.
하지만 내가 복사하려 했던 것은 answer[i]로, 문자 1칸이다. ' * ' 또한 문자 1개이다.
그래서 이 문법은 잘못된 문법이다.
이 부분은 문자 한 개를 대입해서 풀어야 했다.
고친 후 코드는 다음과 같다.
strcpy(answer[i], '*');
>> answer[i] = '*';
strcpy(answer[i], phone_number[i]);
>> answer[i] = phone_number[i];
두 번째
문자열 끝 표시가 없다.
C에서는 문자열의 마지막에 반드시 '\0'이 있어야 한다.
전화번호 길이가 만약 11이라면 문자 11개 + ' \0 ' 1개 해서 총 12칸이 필요하고 마지막은 ' \0 ' 으로 바꿔줘야 한다. 그렇지 않으면 이상한 값이 출력된다.

예상하던 숫자 후에 알 수 없는 값이 출력되는 모습이다. 따라서 마지막에
answer[len] = '\0';
다음과 같이 끝 표시를 해주는 것이다.
세 번째
malloc(12)로 고정하면 번호에 따라 바뀌는 것이 아닌 최대 숫자로 고정하는 것이다.
그래서 번호에 따라 메모리의 할당을 다르게 할 수 있도록
char* answer = (char*)malloc(12);
---------------------------------
int len = strlen(phone_number);
char* answer = (char*)malloc(len + 1);
이런식으로 바꿔, 번호가 짧으면 그 만큼 적은 메모리를 할당할 수 있도록 했다.
이렇게 변경한 후 정상적으로 작동하는 모습을 볼 수 있다.

'Programmers' 카테고리의 다른 글
| <프로그래머스 C++> 숫자 문자열과 영단어 (1) | 2026.04.21 |
|---|---|
| < 프로그래머스 C++ > 시저 암호 (0) | 2026.04.20 |
| < 프로그래머스 > 최소직사각형 (0) | 2026.04.17 |
| 백준 <주사위 세 개> (C++ 랜덤함수) (0) | 2026.04.03 |
| 프로그래머스 연습하기<제일 작은 수 제거하기> (0) | 2026.03.23 |