요구능력 : Math공식
코드설명 :
문제를 이해하는건 어렵지않다.
입력받는거부터 보면 단어를 떨어뜨려서 주지않고 붙여서준다.
이럴때는 한줄입력받고 그대로 for문에 넣어서 아래와 같이 쪼개주면 된다.
for i in 0..<n{
let read = readLine()!
for j in read{
arr[i].append(j)
}
}
그리고 나는 딕셔너리를 사용해서 문제를 풀것이라서 딕셔너리에 우선 키를 넣어놓기위해 for문으로 입력받은 배열을 다 돌면서 알파벳을 넣어줬다.
for i in 0..<n{
for j in 0..<arr[i].count{
dict[arr[i][j]] = 0
}
}
쉽게생각해보면 수학공식으로 풀리는 문제였다.
간단히 설명하면 만약, 아래와같은 입력이 들어왔다고 해보자.
2
ABC
DAB
만약 A가 9, B가 8, C가 7, D가 6 이었다고 치면
987 + 698이 된다.
그렇다는건 맨앞에있는 A와 D는 100의자리 수라는 의미이고
그 다음은 10의자리 그 다음은 1의자리이다.
그 말인 즉슨,
100A + 10B + C
+ 100D + 10A + B 라는 식이 성립한다는 말이고 여기서 가장 큰 수를 곱하는 알파벳이 가장 커야 최대값이 나올것이다.
그럼,
110A + 100D + 11B + C 가 나오게되는데
A = 9, D = 8, B = 7, C = 6을 넣어주면 최대의 값이 나오게된다.
딕셔너리의 value값으로
dict[A] = 110
dict[D] = 100
dict[B] = 11
dict[C] = 1 이 들어가게 된다.
그럼이제 내림차순으로 정렬해서 각 value에 9부터 1까지 곱해주고
sum에 합계를 더해주면 정답이 나오게 된다.
for i in 0..<n{
for j in 0..<arr[i].count{
dict[arr[i][j]]! += Int(pow(10, Double(arr[i].count - j - 1)))
}
}
var j = 9
for i in dict.sorted(by: {$0.value > $1.value}){
sum += i.value * j
j = j - 1
}
후기 : 처음에는 백트래킹으로 접근했는데 잘 안풀려서 구글링해보니까 되게 쉬운방법이있어서 이 방법을 채택했다.. 쉬운 방법이지만 뭔가 야매같은..? 느낌이 없지않아있어서 다음번에는 백트래킹으로 풀어봐야겠다.
import Foundation
let n = Int(String(readLine()!))!
var arr: [[Character]] = Array(repeating: [], count: n)
var dict = [Character:Int]()
var sum = 0
for i in 0..<n{
let read = readLine()!
for j in read{
arr[i].append(j)
}
}
for i in 0..<n{
for j in 0..<arr[i].count{
dict[arr[i][j]] = 0
}
}
for i in 0..<n{
for j in 0..<arr[i].count{
dict[arr[i][j]]! += Int(pow(10, Double(arr[i].count - j - 1)))
}
}
var j = 9
for i in dict.sorted(by: {$0.value > $1.value}){
sum += i.value * j
j = j - 1
}
print(sum)
'Algorithm > 문제풀이_백준' 카테고리의 다른 글
[Swift][BruteForce] 백준 14888번 (연산자 끼워넣기) (0) | 2021.12.24 |
---|---|
[Swift][DP] 백준 15989번 (1, 2, 3 더하기 4) (0) | 2021.12.18 |
[Swift][BFS][DFS] 백준 14502번 (연구소) (0) | 2021.12.16 |
[Swift][DP] 백준 11060번 (점프 점프) (0) | 2021.12.15 |
[Swift][DP] 백준 11048번 (이동하기) (0) | 2021.12.15 |
댓글