문제설명
각 문자마다 숫자가 정해져있음 숫자가 주어지면 그걸 문자로 바꾸어 반환하라
제한사항
입출력 예
말로하는 순서도
solution 함수 선언 반환형 char포인터형 및 매개변수 int형 age 선언
숫자 자리수값을 담을 변수 size 선언
if문 age가 1000과 같다면 size에 3을 넣어라
else if 라면 99보다 age가 크다면 size에 2를 넣어라
else if 라면 9보다 age가 크다면 size에 1을 넣어라
else 라면 size에 0을 넣어라
char포인터형 answer에 char포인터형 malloc를 이용하여 size값만큼 할당하여라
for문 int형 i를 선언 size값을 넣어라 age가 0이 아니라면 i값 감소
숫자를 분리하여 한자리씩 담을 변수 int형 x선언 age를 10으로 나누어 나온 나머지값을 넣어라
age변수에 age를 10으로 나누어 몫을 넣어라
switch문 x를 기준으로함
case가 0이라면 answer의 i위치에 문자 a를 넣어라
case문 break
case가 1이라면 answer의 i위치에 문자 b를 넣어라
case문 break
case가 2이라면 answer의 i위치에 문자 c를 넣어라
case문 break
case가 3이라면 answer의 i위치에 문자 d를 넣어라
case문 break
case가 4이라면 answer의 i위치에 문자 e를 넣어라
case문 break
case가 5이라면 answer의 i위치에 문자 f를 넣어라
case문 break
case가 6이라면 answer의 i위치에 문자 g를 넣어라
case문 break
case가 7이라면 answer의 i위치에 문자 h를 넣어라
case문 break
case가 8이라면 answer의 i위치에 문자 i를 넣어라
case문 break
case가 9이라면 answer의 i위치에 문자 j를 넣어라
case문 break
answer의 size값에 1을 더한 위치에 NULL을 넣어라
최종 반환
소스코드
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
char *solution(int age)
{
// return 값은 malloc 등 동적 할당을 사용해주세요. 할당 길이는 상황에 맞게 변경해주세요.
int size;
if (age == 1000) size = 3;
else if (99 < age) size = 2;
else if (9 < age) size = 1;
else size = 0;
char *answer = (char *)malloc(size);
for (int i = size; age != 0; i--)
{
int x = age % 10;
age = age / 10;
switch (x)
{
case 0:
answer[i] = 'a';
break;
case 1:
answer[i] = 'b';
break;
case 2:
answer[i] = 'c';
break;
case 3:
answer[i] = 'd';
break;
case 4:
answer[i] = 'e';
break;
case 5:
answer[i] = 'f';
break;
case 6:
answer[i] = 'g';
break;
case 7:
answer[i] = 'h';
break;
case 8:
answer[i] = 'i';
break;
case 9:
answer[i] = 'j';
break;
}
}
answer[size + 1] = NULL;
return answer;
}
풀이
숫자를 자리마다 나누는데 흔히 사용하는 나머지와 몫으로 구하기를 이용하는 코드이다
각 숫자마다 문자가 정해져있기에 switch case문을 사용하였다
1000이라는 최대 숫자가 정해져있기에 if문을 통해서 자릿수를 정할수있다
자릿수의 숫자가 1씩 작다 생각할수 있는데 이는 0부터시작하는 부분과 또한 for문 변수에 사용하기 위함이다
나누기로 각 자릿수를 나누면 맨 뒤부터 숫자가 나오게 된다
이에 for문의 변수를 최대값에서 감소하도록 하였다
뒤 부터 각각 숫자에 맞는 문자가 들어간다
문자열이기때문에 마지막에는 맨 끝자리에 NULL을 추가한다
시행착오
만약 이문제를 풀었거나 다른 글을 본다면 더 짧은 코드가 있을것이다 근데 이 코드는 내가 처음 생각한것을 완성 시켜보고 싶어서 작성하게 되었다 for문을 0부터 시작하여 증가하면 문제가 문자가 거꾸로 들어가게 된다
아래에 설명할 코드는 답을 찾아보던중 가장 효율적이라 생각이 들어 추가해 본다
말로하는 순서도
solution 함수 선언 반환형 char포인터형 및 매개변수 int형 age 선언
char포인터형 answer에 char포인터형 malloc를 이용하여 4만큼 할당하여라
sprintf를 이용하여 answer변수에 int형 출력문자인 %d를 이용하여 age를 문자열로 변환하여 넣어라
for문 for문 변수 i를 선언 0으로 초기화 strlen을 이용하여 answer의 길이값을 구하여 i보다 작을동안 반복하여라 변수 증가
answer의 i위치의 값에 49를 더하여 넣어라
최종반환
소스코드
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
char* solution(int age) {
// return 값은 malloc 등 동적 할당을 사용해주세요. 할당 길이는 상황에 맞게 변경해주세요.
char* answer = (char*)malloc(4);
sprintf(answer,"%d",age);
for (int i=0; i<strlen(answer);i++)
{
answer[i] +=49;
}
return answer;
}
풀이
sprint를 이용하여 숫자 정수변수로 있던것을 문자열 변수로 전환하였다
또한 아스키코드를 값을 이용하여 숫자에 49를 더하면 같은 순서의 소문자 문자가 나오게 됨을 이용했다
훨씬 짧은 코드로 구현이 가능하다
출처: 프로그래머스 코딩테스트연습 입문문제, https://school.programmers.co.kr/learn/courses/30/lessons/120834
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr