훌이
후리스콜링개발
훌이

블로그 메뉴

  • 왈 (iOS APP)
  • Github
전체 방문자
오늘
어제
  • 전체 (171)
    • ⭐️ 개발 (140)
      • JAVA (4)
      • Web (5)
      • iOS & Swift (94)
      • iOS Concurrency (4)
      • Rx (18)
      • Git (6)
      • WWDC (1)
      • Code Refactor (3)
      • Server (1)
    • ⭐️ Computer Science (22)
      • 운영체제 (10)
      • 네트워크 (5)
      • PS (7)
    • 경제시사상식 (8)
    • 기타 등등 (0)

인기 글

최근 글

05-29 12:32

티스토리

hELLO · Designed By 정상우.
훌이

후리스콜링개발

⭐️ Computer Science/PS

[PS] 백트래킹 - n과m(9) 15663 어려움 시간초과 이슈 악

2023. 4. 19. 22:19
728x90
반응형

15663 (9) 시간초과 이슈
8개 중 8개를 고를 수 있어서 8^8 시간복잡도인데 내가 푼 방식은 contains 부분에서 시간복잡도가 추가로 증가하게 된다. 그래서 시간초과 이슈가 생긴다.

import Foundation

let nm = readLine()!.split(separator: " ").map { Int(String($0))! }
let n = nm[0]
let m = nm[1]
var array = readLine()!.split(separator: " ").map { Int(String($0))! }.sorted(by: <)

var answer = [String]()
var result = ""

var visited = Array(repeating: false, count: n)

func backtracking() {
    if answer.count == m && !result.contains(answer.joined(separator: " ")) {
        result += answer.joined(separator: " ")
        result += "\n"
        return
    }
    
    for (index, i) in array.enumerated() {
        if !visited[index] {
            answer.append("\(i)")
            visited[index] = true
            backtracking()
            visited[index] = false
            answer.removeLast()
        }
    }
}

backtracking()
print(result)

 
아 도무지 다른 방식으로는 안풀려서 지피티의 도움을 받고 전혀 다른 방법의 풀이를 참고했다... 왤케 어려움;;
개빡춍

let nm = readLine()!.split(separator: " ").map { Int($0)! }
let n = nm[0], m = nm[1]

let nums = readLine()!.split(separator: " ").map { Int($0)! }.sorted()
var visited = Array(repeating: false, count: n)
var output = Array(repeating: 0, count: m)

func backtrack(_ index: Int) {
    if index == m {
        print(output.map { String($0) }.joined(separator: " "))
        return
    }
    
    var used = Set<Int>()
    
    for i in 0..<n {
        if !visited[i] && !used.contains(nums[i]) {
            visited[i] = true
            output[index] = nums[i]
            used.insert(nums[i])
            backtrack(index + 1)
            visited[i] = false
        }
    }
}

backtrack(0)

used라는 집합을 만들어서 중복 숫자를 거르는 용도로 사용한다.
dkdkddkdkdk 나는 왜 이거가 머리에서 자연스럽게 안돌아가지? 하ㅠㅠㅠㅠ 
이해가 잘 안돼....
근데 그냥.. 생각해보면,, 훔...... nums[i]가 1 7 9 9 중 9라고 할 때 선택한 숫자를 used에 넣어주는 것이라고 보면된다...
그래서 저렇게 처리를 하는 건데.. 사실 잘 이해가 안간다.... 다음주에 다시 풀자...

728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'⭐️ Computer Science > PS' 카테고리의 다른 글

[PS] 백트래킹 9663번 N-Queen 답지 참고  (0) 2023.04.24
[PS] 백트래킹 - n과m(11) (12), 부분수열의 합 1182  (0) 2023.04.22
[PS] 백트래킹 20문제 풀기 - 0. 개념, 1. n과m(1) ~ (4)  (0) 2023.04.17
[PS] BOJ - 7576 토마토 골드5  (0) 2023.03.05
[PS] 3/2 - BOJ 2644 촌수계산 - DFS  (0) 2023.03.02
    '⭐️ Computer Science/PS' 카테고리의 다른 글
    • [PS] 백트래킹 9663번 N-Queen 답지 참고
    • [PS] 백트래킹 - n과m(11) (12), 부분수열의 합 1182
    • [PS] 백트래킹 20문제 풀기 - 0. 개념, 1. n과m(1) ~ (4)
    • [PS] BOJ - 7576 토마토 골드5
    훌이
    훌이

    티스토리툴바