두 개의 문자열이 주어지면 두 문자열에 공통으로 포함된 문자를 찾아서 출력하는 프로그램을 작성한다. 각 문자열의 길이는 최대 100이다. 두 번째 문자열의 각 문자는 한 번만 사용할 수 있으며, 첫 번째 문자열을 순서대로 보면서 두 번째 문자열에서 아직 사용되지 않은 같은 문자가 있으면 결과에 포함한다.
입력 예시
첫째 줄에 첫 번째 문자열이 주어진다. 둘째 줄에 두 번째 문자열이 주어진다.
출력 예시
두 문자열의 공통 문자를 첫 번째 문자열의 순서를 기준으로 이어서 출력한다. 두 번째 문자열의 같은 위치 문자는 한 번만 사용할 수 있다.
예제 테스트케이스
예제 1
hello
world
lo
예제 2
apple
plane
aple
예제 3
mississippi
impossible
missip
정답 코드
s1 = input()
s2 = list(input())
result = []
for ch in s1:
if ch in s2:
result.append(ch)
s2.remove(ch)
print("".join(result))
1. 코드 설명
이 코드는 첫 번째 문자열을 앞에서부터 한 글자씩 보면서, 그 문자가 두 번째 문자열에도 아직 남아 있으면 결과에 넣고, 두 번째 문자열에서는 그 문자를 한 번 사용한 것으로 처리하는 방식이다.
즉, 첫 번째 문자열의 순서를 기준으로 공통 문자를 찾되, 두 번째 문자열의 각 문자는 한 번만 사용할 수 있다는 조건을 그대로 구현한 코드이다.
먼저 첫 번째 문자열과 두 번째 문자열을 입력받는다.
s1 = input()
s2 = list(input())
여기서 중요한 점은 두 번째 문자열을 그냥 문자열이 아니라 list(input())로 리스트로 바꿨다는 점이다.
이 문제에서는 두 번째 문자열의 문자를 한 번 사용하면 없애야 하므로, 나중에 remove()를 쓰기 위해 리스트로 만들어 둔 것이다.
문자열은 수정할 수 없지만, 리스트는 원소를 지울 수 있다.
그다음 공통 문자를 차례대로 저장할 result 리스트를 만든다.
result = []
이제 첫 번째 문자열을 앞에서부터 한 글자씩 확인한다.
for ch in s1:
for문은 문자열의 문자를 앞에서부터 하나씩 꺼내 반복하는 문법이다.
즉 ch에는 첫 번째 문자열의 각 문자가 순서대로 들어간다.
현재 문자 ch가 두 번째 문자열에 아직 남아 있는지 확인하는 부분은 다음과 같다.
if ch in s2:
in은 어떤 값이 리스트 안에 포함되어 있는지 검사하는 표현이다.
여기서는 첫 번째 문자열의 현재 문자 ch가 두 번째 문자열 리스트 s2 안에 남아 있는지 확인한다.
만약 있으면 그 문자는 공통 문자이므로 결과에 넣는다.
result.append(ch)
append()는 리스트 맨 뒤에 값을 추가하는 메서드이다.
따라서 공통 문자를 발견할 때마다 result에 순서대로 쌓이게 된다.
그다음 바로 이 문자를 두 번째 문자열에서 제거한다.
s2.remove(ch)
remove()는 리스트에서 같은 값을 하나 찾아 지우는 메서드이다.
이 줄이 중요한 이유는 문제에서 두 번째 문자열의 각 문자는 한 번만 사용할 수 있다고 했기 때문이다.
즉 한 번 공통 문자로 사용한 문자는 다시 쓰면 안 되므로, 사용 즉시 지워야 한다.
예를 들어 첫 번째 문자열이 apple, 두 번째 문자열이 plane이라고 하자.
처음 상태는 다음과 같다.
s1 = "apple"
s2 = ['p', 'l', 'a', 'n', 'e']
이제 s1을 앞에서부터 보면,
- a는 s2에 있으므로 결과에 넣고 s2에서 제거
- p는 s2에 있으므로 결과에 넣고 제거
- 다음 p는 이제 s2에 없으므로 넣지 않음
- l은 있으므로 넣고 제거
- e는 있으므로 넣고 제거
이 과정을 거치면 결과는 ['a', 'p', 'l', 'e']가 된다.
마지막에는 리스트에 모아 둔 문자들을 하나의 문자열로 이어서 출력한다.
print("".join(result))
"".join(result)는 리스트 안의 문자열들을 공백 없이 이어 붙이는 표현이다.
예를 들어 ['a', 'p', 'l', 'e']를 "aple"로 만들어 준다.
따라서 최종적으로 문제에서 요구한 형식대로 공통 문자를 이어 붙여 출력할 수 있다.
2. 실수하기 쉬운 부분
두 번째 문자열을 문자열 그대로 두는 경우
# 잘못된 코드
s1 = input()
s2 = input()
for ch in s1:
if ch in s2:
s2.remove(ch)
문자열에는 remove()를 사용할 수 없으므로, 두 번째 문자열은 리스트로 바꿔야 한다.
공통 문자를 찾고도 두 번째 문자열에서 지우지 않는 경우
# 잘못된 코드
s1 = input()
s2 = list(input())
result = []
for ch in s1:
if ch in s2:
result.append(ch)
print("".join(result))
이렇게 하면 두 번째 문자열의 같은 문자를 여러 번 다시 사용할 수 있어서 조건에 어긋난다.
remove()를 먼저 호출하는 경우
# 잘못된 코드
for ch in s1:
s2.remove(ch)
result.append(ch)
현재 문자가 s2에 없는 경우 오류가 나므로, 반드시 if ch in s2:로 확인한 뒤 제거해야 한다.
결과 리스트를 그대로 출력하는 경우
# 잘못된 코드
print(result)
이렇게 하면 ['l', 'o']처럼 리스트 형태로 출력되므로, "".join(result)로 문자열로 바꿔 출력해야 한다.
3. 핵심 정리
이 문제는 첫 번째 문자열을 순서대로 보면서, 현재 문자가 두 번째 문자열에 남아 있으면 결과에 넣고 두 번째 문자열에서는 바로 제거하는 방식으로 해결할 수 있다.
핵심은 첫 번째 문자열의 순서는 유지하고, 두 번째 문자열의 문자는 remove()로 한 번만 사용되도록 처리하는 것이다.
'Univ > Python Programming' 카테고리의 다른 글
| [파이썬] 1번. 특정 문자 개수 세기 (0) | 2026.06.10 |
|---|---|
| [문제 04] 별로 다이아몬드 그리기 - Python 풀이 (0) | 2026.04.18 |
| [문제 16] 주어진 숫자에서 소수 - Python 풀이 (0) | 2026.04.17 |
| [문제 15] 문자열에서 모음과 자음 세기 - Python 풀이 (1) | 2026.04.16 |
| [문제 14] 배열에서 짝수와 홀수 구분하기 - Python 풀이 (0) | 2026.04.16 |