[4358] 생태학

RudinP·2023년 9월 22일
0

BaekJoon

목록 보기
73/77

문제

생각

  1. class 이용
    • 나무 이름
    • 나무 개수
  2. 1번의 리스트를 생성
  3. 정렬한다.
  4. 출력한다.

코드

import Foundation

class Tree{
    var name: String
    var count: Int
    
    func add(){
        self.count += 1
    }
    
    init(_ name: String){
        self.name = name
        self.count = 1
    }
}

var treeList = [Tree]()
var totalTreeCount = 0

while let line = readLine(){
    var exist = false
    
    totalTreeCount += 1
    
    for tree in treeList{
        if(tree.name == line){
            tree.add()
            exist = true
            break
        }
    }
    
    if(!exist){
        treeList.append(Tree(line))
    }
}

let result = treeList.sorted(by: {$0.name < $1.name})

for tree in result{
    let per = round((Double(tree.count)/Double(totalTreeCount)) * 1000000)/10000
    print("\(tree.name) \(per)")
}

참고로 알고 냈지만 당연히 시간초과다..^^
딕셔너리를 쓰면 된다고한다.
아무래도 HashSet쓰니까 그렇겠지..

고친 코드

import Foundation

var treeList = [String:Double]()
var totalTreeCount = 0

while let line = readLine(){
    totalTreeCount += 1
    let tree = treeList[line] ?? 0
    treeList[line] = tree + 1
}

let result = treeList.sorted(by: {$0.key < $1.key})

for tree in result{
    let per = round((Double(tree.value)/Double(totalTreeCount)) * 1000000)/10000
    print("\(tree.key) \(per)")
}

근데 틀렸다.
아무래도 round부분을 잘못 적은듯..

또 고친 코드 (getPercentage 참고함)

import Foundation

var treeList = [String:Double]()
var totalTreeCount: Double = 0

while let line = readLine(){
    totalTreeCount += 1
    let tree = treeList[line] ?? 0
    treeList[line] = tree + 1
}

let result = treeList.sorted(by: {$0.key < $1.key})

func getPercentage(value: Double) -> String{
    let percent = value / totalTreeCount * 100
    let roundedPer = round(percent * 10000) / 10000
    return String(format: "%.4f", roundedPer)
}

for tree in result{
    print("\(tree.key) \(getPercentage(value: tree.value))")
}

profile
곰을 좋아합니다. <a href = "https://github.com/RudinP">github</a>

0개의 댓글