• 티스토리 홈
  • 프로필사진
    2료일
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
2료일
  • 프로필사진
    2료일
    • 분류 전체보기 (118)
      • SWIFT개발 (29)
      • 알고리즘 (25)
      • Design (6)
      • ARkit (1)
      • 면접준비 (32)
      • UIkit (2)
      • Vapor-Server with swift (3)
      • 디자인패턴 (5)
      • 반응형프로그래밍 (12)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • 12980좋아하는 수열 - swift
        2024년 11월 13일
        • 2료일
        • 작성자
        • 2024.11.13.:08

        https://www.acmicpc.net/problem/12980

        흠..이 문제는 풀이가 없는 것 같아서 내가 먼저 올린다. 그래야 조회슈 ㅎ...는 농담이고 문제가 재밌다.

        문제분석

        1. 순열의 크기 n이 주어진다. 그리고 1..N까지 써야하는 배열이 있다.  이 배열에는 0이 있는데 이는 지워졌다는 것을 의미한다.

        2. 즉 0자리에는 이미 배열에 있는 수 말고 1..N까지의 수 중 아무거나 사용할 수 있다.

        3. 하지만 S 점수를 맞추는 경우의 수를 구해야한다.

        4. 점수? [1,2,3] 이라고 보면 [1,2] , [1,3], [2,3]의 케이스가 가능하기에 총 3점이다. 이런식으로 배열의 인덱스와 값을 비교해  i < j이면서 S[i] < S[j]의 쌍의 개수이다.

        문제접근

        1. 0인 곳에 남은 수로 채워서 모든 경우를 구해보자.2. 그 케이스별로 계산을 하여 합이 S가 되는 경우가 있으면 정답+=1해주면 되겟다.3. 하지만 시간 효율을 위해 백트래킹을 적용하여 0을 이미 다 채웠을때 더 이상은 돌지 않도록 리턴해주었다. 또한 그 때 계산하여 합이 S면 정답 += 1해주었다.

        코드

        import Foundation
        let ns = readLine()!.split(separator: " ").map{Int(String($0))!}, n = ns[0], s = ns[1]
        let arrs = readLine()!.split(separator: " ").map{Int(String($0))!}
        
        func countPermutationsWithScore(n: Int, s: Int, initialArray: [Int]) -> Int {
            var possibleValues = Set(1...n)
            var zeroinDices = [Int]()
            for value in initialArray where value != 0 {
                possibleValues.remove(value)
            }
            for (index, value ) in initialArray.enumerated() where value == 0 {
                zeroinDices.append(index)
            }
            let possibleArray = Array(possibleValues)
        
            var cnt = 0
            func calculateScore(_ array: [Int]) -> Int {
                var score = 0
                for i in 0..<array.count {
                    for j in (i+1)..<array.count {
                        if array[i] < array[j] {
                            score += 1
                        }
                    }
                }
                return score
            }
            // 0인 곳에 하나씩 채워보자.
            func backTracking(_ index: Int, _ currentAraay: [Int], _ usedNums: Set<Int>) {
                if index == zeroinDices.count {
                    if calculateScore(currentAraay) == s {
                        cnt += 1
                    }
                    return
                }
                let position = zeroinDices[index]
                for value in possibleArray {
                    if usedNums.contains(value){
                        continue
                    }
                    var newArr = currentAraay
                    newArr[position] = value
                    var newUsedNums  = usedNums
                    newUsedNums.insert(value)
                    backTracking(index + 1 , newArr, newUsedNums)
                }
            }
            let initialUsedNumbers = Set(initialArray.filter { $0 != 0 })
            backTracking(0, initialArray,initialUsedNumbers)
            return cnt
        }
        print(countPermutationsWithScore(n: n, s: s, initialArray: arrs))

        먼저 n이 들어왔을때 1..n까지의 값

        이 가능하기에 그 중 이미 사용된 값을 제거해준다. 그러면 실제 0인 곳에 넣을 수 있는 배열을 만든다.

        그 후 두번째줄에 온 배열중에 어디가 0인지를 알기 위해 zeroindices를 만들어 인덱스를 저장한다.

        그 후 백트래킹으로 0인 곳에 가능한숫자 하나씩 넣어보며 경우를 구해주는 방식이다.

        안타깝게도 다른 풀이가 없다 헷 첨이다. 원조 맛집을 외칠 수 있다.

        '알고리즘' 카테고리의 다른 글

        22968-균형(swift풀이)  (0) 2024.12.26
        산모양타일링 - swift  (1) 2024.11.15
        상담원인원-Swift풀이  (1) 2024.11.12
        17298-Swift백준골드4  (2) 2024.10.08
        9251-Swift알고리즘  (1) 2024.03.17
        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바