문제
앞에서부터 읽을 때와 뒤에서부터 읽을 때 똑같은 단어를 팰린드롬(palindrome)이라고 합니다. 예를들어서 racecar, 10201은 팰린드롬 입니다.
두 자연수 n, m이 매개변수로 주어질 때, n 이상 m 이하의 자연수 중 팰린드롬인 숫자의 개수를 return 하도록 solution 함수를 완성해 주세요.
제한사항
- m은 500,000이하의 자연수이며, n은 m 이하의 자연수입니다.
입출력 예
n | m | result |
---|---|---|
1 | 100 | 18 |
100 | 300 | 20 |
입출력 예 설명
입출력 예 #1
1 이상 100 이하의 팰린드롬은 다음과 같이 18개가 있습니다.
1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, 44, 55, 66, 77, 88, 99
입출력 예 #2
100 이상 300 이하의 팰린드롬은 다음과 같이 20개가 있습니다.
101, 111, 121, 131, 141, 151, 161, 171, 181, 191, 202, 212, 222, 232, 242, 252, 262, 272, 282, 292
풀이
#include <iostream>
#include <string>
using namespace std;
int solution(int n, int m)
{
int answer = 0;
/* 구현 시작부 */
string num;
for (int i = n; i <= m; i++)
{
// C++11 이상
num = to_string(i);
// C++11 미만은 아래 코드 사용
// stringstream ss;
// ss << i;
// num = ss.str();
bool isPalindrome = true;
for (int j = 0; j < num.size() / 2; j++)
{
char s = num.at(j);
char e = num.at(num.size() - 1 - j);
if (s != e)
{
isPalindrome = false;
break;
}
}
answer += isPalindrome;
}
/* 구현 종료부 */
return answer;
}
int main()
{
cout << solution(100, 300) << endl;
}
코드를 보면 각각의 100~300 사이 숫자들을 string 형태로 변환하여 사용하였는데 각 자리수를 뽑아내는 방법이야 있겠지만 접근성..?이 string으로 할 때 더 쉬울 것 같다.
그리고 제시된 코드에서 string 헤더가 추가되어 있길래 쓰라는 힌트라 생각..
to_string이나 stringstream을 사용하여 100, 101, 102 등과 같은 숫자들을 string으로 변환시키고
for문을 사용하여 각 자리수(인덱스 0~끝까지) 비교한다.
예를 들어 1234567이면, 0번 인덱스(1)와 마지막 6번 인덱스(7)
그다음 1번 인덱스(2)와 5번 인덱스(6).. 이런식으로 가다보면 당연히 중간 값 num.size() / 2 까지 해야되겠다는 감이 온다..
중간에 같지 않으면 플래그(isPalindrome)를 false(0)로 변환시키고 아니면 초기 값 true(1)를 answer에 더해준다.
출처
프로그래머스
'Algorithm' 카테고리의 다른 글
방 예약자 출력하기 (0) | 2018.12.27 |
---|---|
최대 곱의 집합 (0) | 2018.12.27 |
가장 큰 정사각형 구하기 (0) | 2018.12.27 |
숫자를 연속된 덧셈으로 표현하는 알고리즘 (0) | 2018.12.27 |
2진수의 1개수가 같은 다음 수 찾기 (0) | 2018.12.27 |