반응형
친구의 과제를 도와주다가 씨플플에서 문자를 정수로 char를 int로 바꿔야할 일이 생겼다.
예전에 씨플플로 알고리즘을 조금 풀었을 때 자주 썼던 방법인데 기억이 안나서 정리를 해두려고 한다.
C++에서 문자를 정수로, 정수를 문자로 바꾸기
아주 간단하다 문자를 정수로 바꿀 경우 -'0'을 해주고 정수를 문자로 바꿀 경우 +'0'을 해주면 된다.
int main(){
char test = '1'; // 문자 1
int intTest = test - '0'; // 숫자 1
int test2 = '2'; // 숫자 2
char charTest2 = '2' + '0'; // 문자 2
return 0;
}
요런식..!
과제의 내용
우선 과제의 문제는 1부터 50까지의 369를 출력하는데 3, 6, 9는 *로 대체하는 문제이다. 33 처럼 두개가 해당하면 **로 대체한다.
출력 예시는 아래와 같다.
1 2 * 4 5 * 7 8 * 10
11 12 * 14 15 * 17 18 * 20
21 22 * 24 25 * 27 28 * *
* * ** * * ** * * ** 40
41 42 * 44 45 * 47 48 * 50
내가 쓴 코드
#include <iostream>
using namespace std;
int main() {
for (int i = 1; i <= 50; i++) {
// 1자리 수일 때
if (i <= 10){
if (i % 3 == 0) cout << "*" << " ";
else cout << i << " ";
}
// 2자리 수일 때
else{
string x = to_string(i);
int fir = x[0] -'0';
int sec = x[1] - '0';
// 1번째 자리 혹은 2번째 자리에 3의 배수가 존재한다면 0이 아닐 때
int cnt = 0;
if (fir != 0 && fir % 3 == 0) cnt++;
if (sec != 0 && sec %3 == 0) cnt++;
if (cnt > 0) {
for (int j = 0; j < cnt; j++) cout << "*";
cout << " ";
}
else cout << i << " ";
}
if (i % 10 == 0) cout << "\n";
}
return 0;
}
굉장히 비효율적으로 작성한 것 같다 기능 구현에만 급급해서... 문자열 관련 알고리즘을 많이 풀어서 그런지 문자열로 접근을 했다... 2자리 수면 문자열로 전환 후 그 문자열을 인덱스로 나눠 각각의 문자로 바꾸고 다시 정수로 바꾸어 준 후 생각했다.
작성한 코드를 다시보니 정말... 충분히 더 압축할 수 있을 것 같은데...머저리 같은 코드이지만... 처음 작성한 그대로를 올렸다!
친구가 보낸 정답 코드
#include <stdio.h>
int main() {
int N = 50, cnt = 0;
for (int n = 1; n <= N; n++) {
int ten = n / 10;
int one = n % 10;
if (((ten != 0) && (ten % 3 == 0)) || ((one != 0) && (one % 3 == 0))) {
printf(" *");
if (((ten != 0) && (ten % 3 == 0)) && ((one != 0) && (one % 3 == 0))) {
printf("*");
cnt++;
}
}
else {
printf(" %3d", n);
}
if (n % 10 == 0) printf("\n");
}
return 0;
}
친구가 보낸 정답 코드는 주어진 수를 10으로 나누어 몫, 나머지로 자릿수를 구분했다... 이게 훨씬 효율적인 것 같은데
반성...
분명히 예전에도 이렇게 자릿수를 몫과 나머지로 구분해서 풀 수 있다고 몇 번 느꼈던 것 같은데 문제를 보자마자 문자열로 접근해 버렸다... 알고리즘 문제들이 문자열 관련 구현문제들이 많아서 나쁜 버릇은 아닐 것이라고 생각되는데 그래도 조금 더 효율적으로 접근하고 구현했으면 어떨까 하는 생각이 든다. 흐음... 스스로에게 조금 실망스럽다...
반응형
'오늘 배운 것[Today_I_Learned]' 카테고리의 다른 글
PHP strtotime 함수를 사용하여 날짜 계산간 소수점이 출력되는 문제(floor 함수를 이용하여 해결) (0) | 2022.04.12 |
---|---|
버블 정렬(Bubble Sort) 구현 Python / C++ / JAVA / Kotlin / PHP (0) | 2022.03.24 |
코틀린[Kotlin] toInt(), toIntOrNull() (0) | 2022.02.24 |
코틀린[Kotlin] readlnOrNull / isNullOrBlank (0) | 2022.02.04 |
코틀린[Kotlin] 기본 입력(공백을 기준으로 입력 받기, 정수로 입력 받기) (0) | 2022.02.03 |
최근댓글