백준 문제 모음
문제 링크
https://www.acmicpc.net/problem/1919
문제
두 영어 단어가 철자의 순서를 뒤바꾸어 같아질 수 있을 때, 그러한 두 단어를 서로 애너그램 관계에 있다고 한다. 예를 들면 occurs라는 영어 단어와 succor는 서로 애너그램 관계에 있는데, occurs의 각 문자들의 순서를 잘 바꾸면 succor이 되기 때문이다.
한 편, dared와 bread는 서로 애너그램 관계에 있지 않다. 하지만 dared에서 맨 앞의 d를 제거하고, bread에서 제일 앞의 b를 제거하면, ared와 read라는 서로 애너그램 관계에 있는 단어가 남게 된다.
두 개의 영어 단어가 주어졌을 때, 두 단어가 서로 애너그램 관계에 있도록 만들기 위해서 제거해야 하는 최소 개수의 문자 수를 구하는 프로그램을 작성하시오. 문자를 제거할 때에는 아무 위치에 있는 문자든지 제거할 수 있다.
입력
첫째 줄과 둘째 줄에 영어 단어가 소문자로 주어진다. 각각의 길이는 1,000자를 넘지 않으며, 적어도 한 글자로 이루어진 단어가 주어진다.
출력
첫째 줄에 답을 출력한다.
입출력 예시
알고리즘 분류
- 구현
- 문자열
문제 풀이
- Strfry와 비슷한 방식
- 두 문자열을 각각 firstString과 secondString으로 입력받는다.
- 각 알파벳의 개수를 담을 배열 arr를 생성한다.
- arr에서 (첫 번째 문자열에서 각 알파벳의 아스키코드 - 97) 번째 요소를 1 증가시킨다.
- arr에서(두 번째 문자열에서 각 알파벳의 아스키코드 - 97) 번째 요소를 1 감소시킨다.
- arr를 reduce 메서드를 사용하여 각 요소의 합을 구한다. 이때 각 요소는 abs() 메서드를 사용하여 절댓값을 더한다.
소스코드
var firstString = readLine()!
var secondString = readLine()!
var arr = Array(repeating: 0, count: 26)
for s in firstString {
arr[Int(exactly: s.asciiValue!)!-97] += 1
}
for s in secondString {
arr[Int(exactly: s.asciiValue!)!-97] -= 1
}
print(arr.reduce(0){abs($0) + abs($1)})
- 8ms 소요
다른 풀이
var arrA = readLine()!.map{ String($0) }
var arrB = readLine()!.map{ String($0) }
var res: Int = 0
for a in arrA {
if arrB.contains(a) {
if let index = arrB.firstIndex(of: a) {
arrB.remove(at: index)
}
} else {
res += 1
}
}
print(res+arrB.count)
- 8ms 소요
- 첫 번째 문자열의 알파벳이 두 번째 문자열에 있다면, 두 번째 문자열에서 해당 알파벳을 삭제한다.
- 아니라면 res 변수에 1을 더한다.
- 최종적으로 res에 두 번째 문자열의 개수를 더한 후 반환한다.
반응형
'📖 Coding Test > Baekjoon' 카테고리의 다른 글
[Swift] 백준 3273번 - 두 수의 합 (0) | 2023.03.26 |
---|---|
[Swift] 백준 1475번 - 방 번호 (0) | 2023.03.26 |
[Swift] 백준 11328번 - Strfry (0) | 2023.03.25 |
[Swift] 백준 13300번 - 방 배정 (0) | 2023.03.25 |
[Swift] 백준 10807번 - 개수 세기 (0) | 2023.03.25 |
댓글