문제 77
문자열 비교하기
두 문자열 $S$, $T$가 주어진다.
두 문자열 중 더 긴 문자열의 길이를 구하고, 두 문자열의 길이가 같은지 확인하는 프로그램을 작성하라.
입력
첫 번째 줄과 두 번째 줄에 각각 알파벳 대소문자로 이루어진 문자열 $S$, $T$가 주어진다. $(1 \le \lvert S \rvert, \lvert T \rvert \le 100)$
출력
첫 번째 줄에 두 문자열 중 더 긴 문자열의 길이를 출력한다.
두 번째 줄에 두 문자열의 길이가 같다면 $1$을, 그렇지 않다면 $0$을 출력한다.
예제 입력 1
Hello world
예제 출력 1
5 1
노트
세종대학교 인터페이스 스터디에서는 표준 문자열 처리 함수 strlen과 strcmp를 사용하지 않는다.
공식 해설
비교하는 것은 문자열의 내용이 아니라 길이이다. 각 문자열을 처음부터 끝까지 읽으며 문자 하나마다 개수를 $1$씩 늘려 길이 $a,b$를 구한다.
첫 번째 줄에는 더 긴 길이인 $\max(a,b)$를 출력한다. 두 번째 줄에는 $a=b$이면 $1$, 아니라면 $0$을 출력한다. 두 문자열의 문자가 같은지는 확인할 필요가 없다.
시간복잡도와 입력 문자열을 저장하는 공간복잡도는 $O(\lvert S\rvert+\lvert T\rvert)$이다.
구현 · 언어별 풀이
C++ 구현
C++에서는 각 string을 범위 기반 반복문으로 순회하며 길이를 직접 셀 수 있다. strlen이나 strcmp 없이 두 정수 길이만 비교하고 출력한다.
C 구현
각 char 배열을 '\0'까지 순회하여 길이를 직접 센다. strlen과 strcmp는 사용하지 않는다. 길이가 더 큰 쪽을 선택하고 같은 길이일 때의 출력 규칙을 따르며 문자 사전순을 비교하지 않는다.
Python 구현
두 문자열을 각각 순회하며 카운터를 하나씩 올린다. 이 문제의 스터디 취지를 따라 길이를 직접 세고, 비교는 그 두 정수에만 한다. 문자열 대소 비교는 사전순이므로 사용할 수 없다.
Java 구현
각 문자열의 char 배열을 순회하여 길이 카운터를 직접 센다. 두 길이를 비교해야 하며 String.compareTo()는 길이가 아니라 사전순을 비교하므로 이 판정에 사용하지 않는다.
Rust 구현
두 문자열의 bytes()를 순회하며 길이를 직접 센다. 입력은 ASCII라 바이트 수와 문자 수가 같다. str의 Ord 비교는 사전순이므로 답 선택에 사용하지 않는다.
JavaScript 구현
문자열 길이를 직접 세는 학습 조건에 맞춰 for...of로 각 입력 줄을 순회하며 개수를 센다. 이 문제의 문자는 알파벳이므로 Unicode 글자 단위와 UTF-16 길이 차이는 없다.
let a = 0, b = 0;
for (const ch of s) a++;
for (const ch of t) b++;
console.log(Math.max(a, b));
console.log(a === b ? 1 : 0);
같은 길이인지는 문자열 내용 비교가 아니라 a === b로 판단한다. 첫 줄에는 긴 길이, 두 번째 줄에는 길이가 같으면 $1$, 다르면 $0$을 출력한다. 두 줄을 읽을 때 개행 문자를 길이에 포함하지 않는다. 길이 하나를 세기 위한 class나 문자열 복사본은 필요 없다.