문자열에서 어떤 문자가 같은 형태로 정규화되는 다른 문자로 바뀔 수 있는지 판정한다.
쉬움3문자열해시맵구현문자열 매칭아직 제출이 없습니다시간 제한1초메모리 제한256 MB세상에는 아주 많은 종류의 문자가 있다. 모든 디지털 장비가 이 문자를 똑같이 다루도록 표준 인코딩인 유니코드가 만들어졌고, 지금도 갱신이 이어진다. 그 과정에서 서로 비슷하게 생긴 문자가 생겼고, 모양이 완전히 같은 문자까지 생겼다. 이를 악용하는 도메인 동형이의자 공격(IDN homograph attack)도 함께 나타났다.
한자는 여러 나라가 쓰고 나라마다 표기 방식이 달라서 동형이의자가 특히 많다. 탕수육의 한자 표기 糖水肉을 보자. 첫 글자 糖(U+FA03)은 糖(U+7CD6)과 모양이 같고, 둘째 글자 水(U+6C34)는 ⽔(U+2F54)와 모양이 같고, 셋째 글자 肉(U+8089)은 ⾁(U+2F81)과 모양이 같다. 셋 중 하나만 바꿔도 문자열은 달라지지만 화면에 찍힌 모습은 그대로여서 사용자는 두 문자열을 구분하지 못한다.
이 문제에서 두 문자의 모양이 같은지는 유니코드 문자 데이터베이스로 정한다. 아래 세 블록에 속하면서 분해(decomposition) 정보가 자기 자신과 다른 한 글자인 문자를 중복 문자라 하고, 그 한 글자를 중복 문자의 대표 문자라 하자.
중복 문자가 아닌 문자의 대표 문자는 자기 자신이다. 두 문자의 대표 문자가 같으면 두 문자는 모양이 같다. NFKC 정규화를 제공하는 환경이라면 위 세 블록에 속한 문자의 대표 문자는 그 문자를 NFKC로 정규화한 결과와 같다.
문자열이 주어질 때, 문자 하나 이상을 모양이 같은 다른 문자로 바꿔서 원래와 다른 문자열을 만들 수 있는지 판정하는 프로그램을 작성하라.
입력은 한 줄이다. 문자열을 이루는 문자는 모두 유니코드 기본 다국어 평면(BMP)에 정의된 문자이고, 문자열의 길이는 1,000 이하다.
문자열의 문자 하나 이상을 모양이 같은 다른 문자로 바꿔서 원래와 다른 문자열을 만들 수 있으면 Yes를, 만들 수 없으면 No를 출력한다.