Algorithm/Programmers

Programmers Lv2) 파일명 정렬

삼쓰 웅쓰 2020. 8. 28. 15:42
728x90

출처: programmers.co.kr/learn/courses/30/lessons/17686

분류: Lv2, 카카오 블라인드 2018 3차


접근방식

주어진 조건으로 파일을 정렬하는 문제입니다.

문제에서 head, number, tail 3부분으로 나눠서 정렬하라고 하고 있는데요, 
하라는 대로 분류해서 head, number, tail 을 프로퍼티로 갖는 File 이라는 struct를 만들고 정렬했습니다.

저는 File을 만들 때 Init 에서 바로 분류 해줬는데요,
분류할 때는 정규표현식을 쓸 수도 있을 것 같은데 중간에 숫자있는 부분만 number로 만들어주면 되어서
current 변수를 하나 두고 처음부터 읽어가면서 분류해줬습니다.

mutating func parseFile(_ file: String) {
  // 0: head, 1: number, 2: tail
  var current = 0

  for char in file.lowercased() {
    if current == 0 {
      if let _ = Int(String(char)) {
        number.append(char)
        current += 1
      } else {
      	head.append(char)
      }
    } else if current == 1 {
      if let _ = Int(String(char)) {
      	number.append(char)
      } else {
        tail.append(char)
        current += 1
      }
    } else {
    	tail.append(char)
    }
  }
}

 

해결방법



func solution(_ files:[String]) -> [String] {
    var fileList = [File]()
    for file in files {
        fileList.append(File(text: file))
    }
    fileList.sort { (f1, f2) -> Bool in
        if f1.head == f2.head {
            let n1 = Int(f1.number)!
            let n2 = Int(f2.number)!
            return n1 == n2 ? false : n1 < n2
        } else {
            return f1.head < f2.head
        }
    }
    return fileList.map { $0.text }
}

struct File {
    var text: String
    var head: String = ""
    var number: String = ""
    var tail: String = ""
    
    init(text: String) {
        self.text = text
        self.parseFile(text)
    }
    
    mutating func parseFile(_ file: String) {
        // 0: head, 1: number, 2: tail
        var current = 0
        
        for char in file.lowercased() {
            if current == 0 {
                if let _ = Int(String(char)) {
                    number.append(char)
                    current += 1
                } else {
                    head.append(char)
                }
            } else if current == 1 {
                if let _ = Int(String(char)) {
                    number.append(char)
                } else {
                    tail.append(char)
                    current += 1
                }
            } else {
                tail.append(char)
            }
        }
    }
}

 

배운점

어렵지 않은 문제였다.

정규표현식으로도 한번 풀어보자!!!