안녕하세요 오묘집사입니다.
최근 이사하고, 인터넷 연결을 못해서 글을 쓰지 못했네요..
오늘은 앞 뒤가 똑같은 전화번호~ 가 아니라
앞뒤가 같은 숫자를 판별하는 코드문제입니다.
거꾸로 써도 똑같은 숫자를 말합니다.
예를들어 입력값 x 가 12321
일 경우 이는 true 이고,
1234 일 경우 false인 것이죠.
-121 은 121- 이라서 false라고 합니다.
조건은 아래와 같습니다.
Constraints:
- -2^31 <= x <= 2^31 - 1
이는 c로 어떻게 짤까요?
이 int형을 string으로 바꾸면 쉽게 풀수도 있지만, 만약 int형 그대로 푼다면 어떻게 풀어야 할까요?
bool isPalindrome(int x){
int n = x;
int r = 0;
if (x<0 || ((x%10 == 0)&& x != 0))
return false;
else
while(n>r){
r=r*10 + n%10;
n = n/10;
}
return n == r || n == r/10;
}
풀이를 시작해보겠습니다.
코딩에서 보통 나눗셈을 /, % 두가지로 나타내죠.
/ 는 몫이 결과값이고, %는 나머지가 결과값입니다.
이를 이용해서 숫자를 뒤집을 수 있습니다.
x % 10 을 하면, 1의자리 숫자가 나오겠죠.
그리고 그에 10을 곱하면서, 원래 숫자는 /10을 해주는 일을 반복하면 결국
1234 가
4321로 바뀌게 됩니다.
근데 여기서 이렇게 하나하나 다 바꾸면 시간이 오래 걸리게 되죠.
실제로 우리는 절반을 놓고 확인하면 됩니다.
12와 43이 같냐 를 보면된다는 것이죠.
가운데에 숫자가 있다면, 이는 빼면 그만입니다.
그래서 위와 같은 코드가 나오게 되었습니다.
예를들어 12322 라는 숫자라고 치면,
n = 12
r = 223 이 되겠죠?
여기서 12와 223/10, 22는 같지 않으므로 조건문이 0이 되어 false 를 return 받게 됩니다.
만약 12321 이라면 12 = 12가 되어 true가 되겠죠.
감사합니다.
'코딩공부' 카테고리의 다른 글
LeetCode easy 14번 Longest Common Prefix 문제 C언어 풀이 (0) | 2021.11.21 |
---|---|
LeetCode easy 13번 Roman to Integer 문제 C언어 풀이 (0) | 2021.11.20 |
Leet Code Easy 1번 Two Sum 문제 C언어 풀이 (0) | 2021.11.20 |
댓글