ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Programmers Lv2) 파일명 정렬
    Algorithm/Programmers 2020. 8. 28. 15:42

    출처: 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)
                }
            }
        }
    }
    

     

    배운점

    어렵지 않은 문제였다.

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

    댓글

Designed by Tistory.