Solver 2차 배포를 완료했다. 수정사항은 오류 수정과 UI 업데이트가 있다. 오류 수정SwiftData 가 업데이트 되면서 Data race 오류를 수정했다. [Project-Solver] Data race 오류 기록문제 상황앱에서 fetch를 연속적으로 하게 되면 위와 같이 data race가 발생하는 것을 확인했습니다. 해결 과정문제 파악간단한 Top100Store 부터 살펴보니 fetch() 함수 부분에서 top100 = fetchedTop100 이 fetswift-library.tistory.com UI 업데이트1. 기존 문제점- 스크롤 위치를 추적하면서 바뀌는 요소들이 너무 많아 UI 업데이트가 버벅거리는 현상이 발생했다.- 계정 탭에 이름 바꾸기 항목밖에 없어 필요가 없었다.- 티어 뱃지..
전체 글
문제 소개https://www.acmicpc.net/problem/16565 해결과정접근 방법완전 수학문제이다. 경우의 수를 구하는 문제이다. 포카드 4장을 뽑아야 이기는 경우의 수니까 만약 5장의 카드를 뽑는다면 무조건 포카드를 뽑아야 하므로 4장은 포카드, 나머지 1장을 (52장 - 4장)에서 고를 수 있는 경우의 수이다. 그렇다면 8장을 뽑는다면 어떻게 될까? 우선 이기려면 4장은 포카드 나머지 4장을 (52장 - 4장)에서 고르는 경우의 수가 있는데 여기서 하나를 더 고려해야 한다. 포카드를 2세트를 뽑았을 때는 경우의 수가 중복이 된다는 것을 알 수 있다. 왜냐하면 포카드 1세트를 고르고 나머지 4장으로 경우의 수를 돌렸는데 4장이 포카 들어가 나올 경우가 생긴다. 이 경우가 중복이 된다. 따라..
문제 소개해결 과정첫 번째 풀이 (50점)최대, 최솟값을 결정하고 나머지는 2^n으로 최대 최소일 경우 몇 번의 경우가 있는지를 구하면 되는 문제였다. 문제는 모듈러 연산... 처음에 2의 n제곱을 구하는데 모듈러 연산을 안 해줘서 자꾸 런타임 오류가 났었다. let fileIO = FileIO()let n = fileIO.readInt()let mod = 1_000_000_007var answer = 0var sco = [Int]()for _ in 0..하지만 이 풀이의 문제점은 2중 반복문이 들어가기 때문에 n = 300,000 일때 90000,000,000의 연산을 하기 때문에 시간초과가 발생한다.정답 (250점)생각해보면 단순했다. 굳이 최대 최소를 결정할 필요 없이 하나의 메뉴가 있다면 최대일 ..
문제 소개https://www.acmicpc.net/problem/13334문제 풀이가장 간단한 풀이방법은 철로를 계속 한 칸씩 옮겨가면서 확인해 보기. 하지만 이 방법은 철로를 옮길 때마다 새롭게 그곳에 포함되는 선을 찾아야 한다는 점이다. 그렇다면 이 문제는 포함되는 선을 최대한 가져가면서 갱신해 주는 방식으로 사용하면 된다! 1. 철로를 어떻게 옮겨야 효율적으로 옮길까?주어진 것은 집의 x좌표와 오피스의 x좌표이다. 이것을 기준으로 철로를 옮겨가면 되겠다는 생각을 했다. 어자피 철로의 길이는 마지막에 주어진 d보다만 작으면 최대로 포함만 한다면 길이는 상관없다. 그렇다면 집의 좌표, 오피스의 좌표로 옮겨가면서 철로의 길이가 d 이내인 두 점으로 순서대로 옮겨보면 되겠다고 생각했다. 2. 어떠한 식으..
문제 상황앱에서 fetch를 연속적으로 하게 되면 위와 같이 data race가 발생하는 것을 확인했습니다. 해결 과정문제 파악간단한 Top100Store 부터 살펴보니 fetch() 함수 부분에서 top100 = fetchedTop100 이 fetch 마다 호출이 되기 때문에 발생하는 문제였습니다. 비동기적으로 top100 이 여러 번 업데이트되면서 동시성 문제가 발생하기 때문입니다.@Observablefinal class Top100Store { let useCase = FetchUseCase() var top100: Top100Entity? @ObservationIgnored @AppStorage("userId") var userId = "" init..
문제 소개문제 자체는 아주 간단하지만 N이 10억이하의 자연수라는 조건이 있기 때문에 1부터 숫자를 늘려가며 판별하면 무조건 시간 초과가 걸린다. 문제 풀이let input = readLine()! let a = Array(input.reversed()).map { Int(String($0))! } let n = Int(input)! var ans = Array(repeating: 0, count: 10) for (i, e) in a.enumerated() { let p = Int(pow(10.0, Double(i))) for j in 0...9 { ans[j] += n / (p * 10) * p } if e > 0 { for j in 1..
문제 소개도넛 모양 그래프, 막대 모양 그래프, 8자 모양 그래프들이 있습니다. 이 그래프들은 1개 이상의 정점과, 정점들을 연결하는 단방향 간선으로 이루어져 있습니다. 크기가 n인 도넛 모양 그래프는 n개의 정점과 n개의 간선이 있습니다. 도넛 모양 그래프의 아무 한 정점에서 출발해 이용한 적 없는 간선을 계속 따라가면 나머지 n-1개의 정점들을 한 번씩 방문한 뒤 원래 출발했던 정점으로 돌아오게 됩니다. 도넛 모양 그래프의 형태는 다음과 같습니다.크기가 n인 막대 모양 그래프는 n개의 정점과 n-1개의 간선이 있습니다. 막대 모양 그래프는 임의의 한 정점에서 출발해 간선을 계속 따라가면 나머지 n-1개의 정점을 한 번씩 방문하게 되는 정점이 단 하나 존재합니다. 막대 모양 그래프의 형태는 다음과 같습..
Bitmask란?Bitmask는 단어 그대로 비트에 마스킹을 한다라는 뜻인데, 비트 연산을 활용하여 데이터를 효율적으로 저장하고 조작하는 방법이다. 비트(Bit)는 컴퓨터 과학에서 정보의 가장 작은 단위이다. 비트는 이진법(Binary System)을 기반으로 하며, 두 가지 값(0, 1) 중 하나를 가질 수 있다. 비트연산Bitmask를 하기 전에 비트 연산에 대해서 알아야 한다. 비트 연산에는 AND, OR, XOR, NOT, Shift연산이 있다. 아래와 같은 게이트들을 접해봤을 것이다. (직접 그려봤는데 생각보다 그리기 힘들다 😅)처음에는 OR과 XOR이 약간 헷갈렸는데 아래의 개념으로 생각한다면 아주 이해가 쏙쏙 된다.AND 연산 ( & )1101 & 1011 을 하게 되면 두 비트가 모두 1..