알고리즘문풀 with SWIFT 108

swift ) 백준 2981 검문 - 시간초과 극복!!!!!!!!!!!!!!!!!!!

두 가지 방법으로 코드를 작성해보았음 사실 처음 생각한 게 이번에도!!!!!!! 시간초과가 떠서.. 다른 로직을 생각해야만 했음.. 1. 몫과 나머지가 같은 경우를 비교하는 방식 더보기 생각할 필요도 없다. 똥이다. 2. 최대공약수(gcd)를 이용해보자. 사실 이건 알고리즘 분류에 '유클리드 호제법'이라고 힌트가 주어져있어서... 생각한 거지 그냥은 생각하기 어려웠을 듯............ 쌩으로 맞춘 사람들...... 똑똑하다........ 주어진 값을 같은 값 M으로 나누었을 때 나머지 r이 같은 경우를 일반항으로 만들어본다면 a = 주어진 값, M = 몫, r = 나머지 라고 할 때 a1 = Mx1 + r, a2 = Mx2 + r, ... ==> a1 - a2 = M*(x1-x2) 가 되어 r을 ..

swift ) 백준 1934 최소공배수 feat. 재귀함수&유클리드 호제법

읭 이전문제랑 똑같은데 lcm만 구하면 되네요 유클리드 호제법을 사용해 풀어줍니다. https://myios.tistory.com/11 유클리드 호제법 - 최대공약수, 최소공배수를 구해보자 최대공약수(GCD, great common divisor), 최소공배수(LCM, least common multiple)를 유클리드 호제법을 이용해 구해보자. 먼저, 유클리드 호제법의 정의는 다음과 같다. 두 수가 서로(互) 상대방 수를 나누어(除 myios.tistory.com 정리해뒀어요 코드를 작성해주면 끝 이번엔 재귀함수를 사용해서 만들어보았습니다. // 1934 최소공배수 let caseNum = Int(readLine()!)! for _ in 1...caseNum { let input = readLine()..

swift ) 백준 2609 최대공약수와 최소공배수 feat.유클리드 호제법

오........ 한국정보올림피아드 중고등부에 출제되었던 문제를 만나게 되었다. 물론 1번문제인 걸 보면 쉬운 문제인가보다 나도 응애거릴 때 이 길을 시작했다면 참 좋았을텐데.. 먼저 코드를 구현하기 전에 최대공약수(GCD, great common divisor)와 최소공배수(LCM, least common multiple)를 쉽게 구하는 방법을 알아보았다. '유클리드 호제법'이라는 것을 이용하려고 하는데 https://myios.tistory.com/11 유클리드 호제법 - 최대공약수, 최소공배수를 구해보자 최대공약수(GCD, great common divisor), 최소공배수(LCM, least common multiple)를 유클리드 호제법을 이용해 구해보자. 먼저, 유클리드 호제법의 정의는 다음과..

swift ) 백준 1037 약수

진짜 약수의 개수는 왜 주어진걸까? 스위프트 말고 다른 언어에서는 갯수를 알아야 다 입력받을 수 있는걸까 아니면 다른 정석적인(?) 풀이 방법이 있는건가 생각을 해봤는데 그냥 이게 간단하고 맞는 것 같다. // 1037 약수 let n = Int(readLine()!)! let input = readLine()!.split(separator: " ").map{Int(String($0))!} print(input.min()!*input.max()!) 주어지는 '진짜 약수'는 1과 자기 자신 n을 제외한 약수들이 주어지기 때문에 주어지는 약수의 가장 작은 값과 가장 큰 값을 곱하면 우리가 원하는 수 n을 구할 수 있다. 처음엔 주어지는 진짜 약수의 개수가 1개일 때 그 수를 제곱하는 조건문도 달아줬는데, 따..

swift ) 백준 16917 - 양념 반 후라이드 반

후라이드보다 양념을 먼저 적는 것으로 보아 백준님께서는 아주 근본있는 사람인 것이예요 처음에 진짜 말도 안되게 for문으로 코드 썼다가 이번에도 반성을 오지게 하고 다시 작성함 // 16917 양념 반 후라이드 반 let input = readLine()!.split(separator: " ").map{Int(String($0))!} let a = input[0] let b = input[1] let c = input[2]*2 let x = input[3] let y = input[4] var price = 0 if x>y { price = a+b > c ? c*y + min(a,c)*(x-y) : a*x + b*y } else { price = a+b > c ? c*x + min(b,c)*(y-x) :..

swift ) 백준 10814 나이순 정렬

그놈의... 시간초과......... 처음엔 버블정렬으로 작성해봤는데 너무나 당연하게도(?) 시간 초과가 나왔다 시간복잡도가 n²이라서 그런걸까? 스위프트에 있는.... 너무나 좋은 메소드들을... 사용하도록 노력해봅시다... // 10814 나이순 정렬 -2 , 정렬 알고리즘 따로 사용하지 않고 swift의 sort() 사용함, 184ms let caseNum = Int(readLine()!)! var data : [(Int, Int, String)] = [] for i in 1...caseNum { let input = readLine()!.split(separator: " ").map{String($0)} let age = Int(input[0])! let name = input[1] data.ap..

swift ) 백준 18870 좌표 압축

항상......은 아니고 대부분 시간 초과와의 전쟁을 벌이게 되는데..... 오늘도 역시나 처음에 작성했던 방향에서 자꾸만 시간 초과가 나왔다... 시간 초과를 벗어나기 위해.... 내가 무엇이 문제인지 고민을 해봤는데........ for문에 너무 의존하는 것..... 아는 게 없으니(....) 맨날 for문으로만 해결하려고 하는 게.... 잘못되었음을 알게 되었다...... 노오력의 결과는 아래와 같다.... // 18870 좌표 압축 let caseNum = Int(readLine()!)! let inputNum = readLine()!.split(separator: " ").map{Int(String($0))!} var numSet : Set = [] var numDict : [Int:Int] =..