본문 바로가기
📖 Coding Test/Baekjoon

[Swift] 백준 1919번 - 애너그램 만들기

by hyebin (Helia) 2023. 3. 25.
백준 문제 모음

문제 링크

https://www.acmicpc.net/problem/1919

 

1919번: 애너그램 만들기

두 영어 단어가 철자의 순서를 뒤바꾸어 같아질 수 있을 때, 그러한 두 단어를 서로 애너그램 관계에 있다고 한다. 예를 들면 occurs 라는 영어 단어와 succor 는 서로 애너그램 관계에 있는데, occurs

www.acmicpc.net

 

문제

두 영어 단어가 철자의 순서를 뒤바꾸어 같아질 수 있을 때, 그러한 두 단어를 서로 애너그램 관계에 있다고 한다. 예를 들면 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에 두 번째 문자열의 개수를 더한 후 반환한다.
반응형

댓글