회문(팰린드롬) 판별기

단어나 문장을 입력하면 앞뒤로 똑같이 읽히는 회문인지 확인하고, 판별에 쓴 글자열과 뒤집은 결과까지 보여 드립니다.

한눈에 보기

회문(팰린드롬)은 앞에서 읽어도 뒤에서 읽어도 같은 단어나 문장입니다. 말놀이, 코딩 테스트 문제, 이름·상표 짓기, 숫자 퍼즐처럼 "앞뒤가 같은가"를 빠르게 확인해야 할 때 쓰는 도구입니다. 이 판별기는 공백, 문장부호, 대소문자를 지운 뒤 남은 글자를 뒤집어 원래와 비교합니다.

판별 원리

  1. 입력 전체를 소문자로 바꿉니다.
  2. 글자(한글·영문·그 밖의 문자)와 숫자만 남기고 나머지를 모두 지웁니다.
  3. 남은 글자열을 거꾸로 뒤집습니다.
  4. 원래 글자열과 뒤집은 글자열이 같으면 회문입니다.

글자열이 n개 글자라면 첫 번째와 n번째, 두 번째와 n-1번째처럼 마주 보는 쌍을 비교하면 되고, 가운데 글자 하나(홀수 길이일 때)는 비교할 필요가 없습니다. 그래서 "기러기"는 기-기 한 쌍만 확인하면 끝나고 가운데 "러"는 짝이 필요 없습니다. 결과 상자의 "뒤집은 글자열"과 불일치 위치 안내는 이 비교를 눈으로 따라가 볼 수 있게 한 것입니다.

예시 문장 판별표

아래 표는 이 페이지가 쓰는 것과 같은 방식으로 빌드할 때 계산한 결과입니다.

입력정리한 글자열글자 수뒤집은 결과판정
기러기기러기3기러기회문
토마토토마토3토마토회문
다시 합창합시다다시합창합시다7다시합창합시다회문
levellevel5level회문
A man, a plan, a canal: Panamaamanaplanacanalpanama21amanaplanacanalpanama회문
Was it a car or a cat I saw?wasitacaroracatisaw19wasitacaroracatisaw회문
1232112321512321회문
안녕하세요안녕하세요5요세하녕안회문 아님
palindromepalindrome10emordnilap회문 아님
1221 122112211221812211221회문

"다시 합창합시다"는 띄어쓰기를 지우면 "다시합창합시다"가 되어 앞뒤가 같습니다. 반면 같은 글자라도 띄어쓰기를 살려 단어 단위로 읽으면 같지 않으므로, 어떤 기준을 쓰는지 밝히는 것이 중요합니다.

숫자 회문은 몇 개나 될까

d자리 숫자에서 앞쪽 절반(올림한 자릿수)만 정하면 나머지는 거울처럼 정해집니다. 맨 앞자리는 1~9 중 9가지, 나머지 앞쪽 자리는 각각 10가지이므로 개수는 9 × 10⌈d/2⌉-1입니다. 아래 표에서 공식 값과 모든 수를 하나씩 확인한 값이 일치하는지 볼 수 있습니다.

자릿수공식 9 × 10^(⌈d/2⌉-1)전수 조사
1자리9개9개
2자리9개9개
3자리90개90개
4자리90개90개
5자리900개900개

검산된 계산 예시: 뒤집어 더하기

어떤 수에 그 수를 뒤집은 수를 더하는 과정을 반복하면 회문이 되는 경우가 많습니다. 56은 56 → 121로 1번 만에 회문이 됩니다. 89는 24번이나 걸려8813200023188에서 비로소 회문이 됩니다. 이런 반복으로도 회문이 되지 않는 수가 있는지는 10진법에서 아직 증명되지 않았고, 196이 후보로 자주 거론됩니다. 중간 결과를 이 판별기에 넣어 보는 용도로도 쓸 수 있습니다.

직접 구현할 때의 핵심 포인트

프로그래밍으로 회문을 판별할 때 가장 자주 틀리는 부분은 알고리즘이 아니라 전처리입니다. 대소문자를 통일하지 않으면 "Level"이 실패하고, 공백과 기호를 지우지 않으면 문장형 회문이 모두 실패합니다. 또 이모지나 일부 문자는 하나의 글자가 코드상 두 칸 이상을 차지하기 때문에, 글자열을 단순히 한 칸씩 뒤집으면 문자가 깨질 수 있습니다. 이 도구는 글자 단위 배열로 바꿔서 비교하기 때문에 그런 문제를 피합니다. 시간 복잡도는 글자 수 n에 대해 n에 비례하는 선형이고, 마주 보는 쌍만 확인하면 비교 횟수는 n의 절반입니다.

상황별로 이 도구를 쓰는 법

코딩 테스트를 준비할 때. 회문 판별은 입문 문제로 자주 나오지만 문제마다 "무엇을 무시하는가"가 다릅니다. 영문과 숫자만 비교하고 나머지는 지우라는 문제가 있는가 하면, 공백과 부호까지 그대로 비교하라는 문제도 있습니다. 이 도구는 앞의 방식(문자와 숫자만 남기고 소문자로 통일)을 따르므로, 내 코드의 결과가 다를 때 정리된 글자열 칸을 보면 전처리 단계에서 어긋났는지 비교 단계에서 어긋났는지 바로 구분됩니다.

말놀이·이름 짓기를 할 때. 수업 활동이나 상호·닉네임 후보로 회문을 만들 때는 먼저 글자를 가운데에서 바깥쪽으로 늘리고, 완성되면 여기에 넣어 띄어쓰기를 지운 기준으로 통과하는지 확인합니다. 띄어쓰기를 살린 채 소리 내어 읽으면 어색한 문장도 많으므로, 눈으로 보는 회문인지 소리 내어 읽는 회문인지 목적을 정해 두면 판정 논쟁이 줄어듭니다.

숫자 퍼즐·기념일을 볼 때. 1000부터 2999까지 연도 중 회문인 해는 20개입니다. 1900~2300년 사이에는1991, 2002, 2112, 2222년이 해당하고, 2002년 다음 회문 연도는 2112년입니다. 모두 빌드 시점에 전수 조사한 값입니다. 날짜를 8자리(예: 20200202)로 붙여 쓰는 회문 날짜도 같은 방식으로 이 판별기에 넣어 확인할 수 있습니다.

글자 하나만 빼면 회문이 되는 경우

"거의 회문"을 판별하는 문제(글자를 최대 하나 지워서 회문이 될 수 있는가)도 자주 쓰입니다. 효율적으로는 첫 불일치 위치에서 왼쪽 글자를 지우는 경우와 오른쪽 글자를 지우는 경우 두 가지만 다시 확인하면 되지만, 아래 표는 글자를 하나씩 빼 보는 단순한 방식으로 빌드 시 계산한 결과입니다.

입력글자 수판정
abca42번째 글자 "b"를 빼면 회문
racecars88번째 글자 "s"를 빼면 회문
deified7이미 회문
기러기야44번째 글자 "야"를 빼면 회문
토마토마41번째 글자 "토"를 빼면 회문
stella6글자 하나를 빼도 회문이 되지 않음

"토마토마"는 앞의 "토"를 지우면 "마토마"가 되어 회문이 됩니다. 반대로 "stella"처럼 어느 글자를 빼도 앞뒤가 맞지 않는 경우도 있습니다. 이 판별기는 지금 입력된 그대로만 판정하므로, 이런 근접 회문은 위 방식으로 직접 지운 뒤 다시 넣어 확인하세요.

글자를 재배열하면 회문을 만들 수 있을까

글자의 순서를 마음대로 바꿔도 된다면, 회문이 가능한지는 글자별 개수만 보면 됩니다. 각 글자는 마주 보는 쌍으로 놓여야 하므로 짝수 번 나오는 글자는 문제가 없고, 홀수 번 나오는 글자는 가운데 한 자리에만 놓일 수 있습니다. 따라서홀수 번 나오는 글자의 종류가 0개 또는 1개일 때만 재배열로 회문이 가능합니다. 전체 길이가 짝수이면 홀수 번 나오는 글자가 0종이어야 하고, 홀수이면 정확히 1종이어야 합니다.

입력글자 종류홀수 번 나오는 글자 종류재배열로 회문 가능
aabb20가능
carrace41가능
hello43불가능
토토마21가능
abcab31가능

"carrace"는 c·a·r이 각각 2번, e가 1번 나와 홀수가 e 한 종류뿐이므로 "racecar"로 재배열됩니다. 이 도구는 순서를 바꾸지 않고 입력 그대로만 판정하므로, 재배열한 결과를 넣어 보면 확인됩니다.

숫자 회문의 몇 가지 성질

뒤집어 더하기를 2자리 수 10~99(이미 회문인 수를 뺀 81개)에 모두 적용하면 회문에 이르는 단계 수가 다음처럼 나뉩니다. 대부분은 한두 번에 끝나고, 89와 98 같은 소수의 수만 많은 단계가 필요합니다.

회문이 되기까지 단계 수해당하는 2자리 수의 개수
1단계49개
2단계20개
3단계4개
4단계4개
6단계2개
24단계2개

소수이면서 회문인 수도 있습니다. 10만 미만에서 자릿수별 개수는 다음과 같습니다. 4자리가 표에 없는 것은 짝수 자리 회문이 모두 11의 배수여서, 2자리의 11을 제외하면 소수가 될 수 없기 때문입니다.

자릿수회문 소수 개수
1자리4개
2자리1개
3자리15개
5자리93개

소수 여부 자체를 알고 싶다면 소수 판별기에서 확인할 수 있습니다.

입력할 때 알아 둘 동작

흔한 실수와 한계

결과 활용법

회문이 아니라고 나오면 "처음 달라지는 위치"를 보고 어느 글자 때문에 깨지는지 확인하세요. 말놀이를 만들 때는 가운데에서 바깥쪽으로 글자를 늘려 가는 방식이 쉽습니다. 코딩 문제라면 양 끝에서 안쪽으로 좁혀 가는 두 포인터 방식이 글자열을 통째로 뒤집는 방식보다 메모리를 아낍니다. 글자 수를 세려면글자 수 세기를, 문장을 통째로 뒤집어 보려면텍스트 뒤집기를 함께 쓰세요.

같이 보면 좋은 도구

자주 묻는 질문

숫자도 회문으로 판별할 수 있나요?

네, 12321처럼 숫자로만 이루어진 입력도 같은 방식으로 판별합니다. 영문과 숫자가 섞인 입력도 가능합니다.

공백이나 문장부호가 있으면 회문이 아닌가요?

아니요. 공백, 문장부호, 대소문자를 지우고 순수한 글자와 숫자만 비교하므로 "A man a plan a canal Panama"처럼 공백이 있는 문장도 회문으로 인식됩니다.

한 글자만 입력하면 어떻게 되나요?

한 글자는 앞뒤가 같으므로 회문으로 판정됩니다. 다만 의미 있는 말놀이로 보기는 어렵습니다.

한글을 자음·모음 단위로 비교할 수도 있나요?

이 도구는 음절 단위로만 비교합니다. 자모 단위 비교가 필요하면 글자를 자모로 분해한 뒤 따로 확인해야 합니다.

일본어나 중국어도 판별되나요?

한자와 가나 같은 문자도 글자로 인식해 글자 단위로 비교합니다. 다만 발음이 아니라 글자 모양 순서를 기준으로 합니다.

글자를 재배열하면 회문이 되는지도 알 수 있나요?

이 도구는 입력한 순서 그대로만 판정합니다. 재배열 가능 여부는 위 표처럼 홀수 번 나오는 글자의 종류가 0~1개인지로 직접 따져 보고, 재배열한 글자열을 다시 넣어 확인하세요.

대소문자를 구분해서 판별할 수 있나요?

구분하지 않습니다. 입력을 모두 소문자로 바꾼 뒤 비교하므로 "Level"과 "level"은 같게 취급됩니다. 구분이 필요하면 직접 대문자 위치를 대조해야 합니다.

숫자와 문자가 섞인 12abc21 같은 입력은 어떻게 판정하나요?

숫자도 하나의 글자로 보고 앞뒤로 비교합니다. "12abc21"은 1-1, 2-2까지는 맞지만 a와 c가 달라 회문이 아니라고 나옵니다.

회문 연도는 앞으로 언제 오나요?

이 페이지의 전수 조사 기준으로 2002년 다음은 2112년이고, 그다음은 2222년입니다. 모두 네 자리 숫자를 앞뒤로 읽어 같은 해입니다.