아이디어 주어지는 n을 3진법으로 만들고 이를 뒤집은 후 다시 10진법으로 변환시키는 로직이다. radix를 사용하면 쉽게 구현이 가능하다. 먼저 n을 3진법 String으로 만들고 이를 reversed하여 순서를 바꾸고 다시 Int로 바꾼다. 여기서 주목해야 할것은 Int형의 n을 10진법이 아닌 다른 진법 (2진법, 3진법 등)으로 바꿀 때는 String으로 형변환을 하면서 하는데 그대로 역으로 다시 10진법으로 형변환을 하고 할 경우 기존 변경된 진법을 입력하고 Int(n, radix: 3)!으로 해야한다는 것이다. Int로 형변환 할때 옵셔널로 들어가니까 강제 언래핑 하는것은 물론이다. 해답 import Foundation func solution(_ n:Int) -> Int { return In..
아이디어 에라토스테네스를 이용하여 풀었다. 특이한 점은 array를 1로 초기화하는 부분에서 처음에는 i의 값을 대입하고 다시 for문을 통해서 cnt를 체크해서 리턴하는 방법을 썼었는데 효율성에서 탈락했다. 때문에, 소수는 1로 체크하고 reduce를 이용하여 모든 요소를 합쳐버리는 방식으로 소수의 개수를 추출했더니 통과했다. 해답 import Foundation func solution(_ n:Int) -> Int { var array = Array(repeating: 0, count: n + 1) for i in 2 ... n { array[i] = 1 } for i in 2 ... n { if array[i] == 0 { continue } for j in stride(from: i + i, th..
아이디어 에라토스테네스의 체를 이용하여 num(4000000)까지 소수를 생성하고 A와 B 사이에서만 소수를 찾은 다음 D와 소수를 String으로 만들어 contains 함수를 이용하여 요소로 가지고 있는지를 탐색하였다. 이때, A와 B에서 에라토스테네스의 체를 생성하려고 할 수 있는데 에라토스테네스의 체는 특정 구간에서부터가 아니라 2부터 순서대로 해야 하는 방식이라 그런 방식은 통하지 않는다. 해답 import Foundation let input = readLine()!.components(separatedBy: " ").map { Int(String($0))! } let A = input[0] let B = input[1] let D = input[2] var cnt = 0 var num = 4..
아이디어 바로 이전에 K번째 소수를 풀고 푼 문제이기 때문에 자연스럽게 에라토스테네스의 체를 이용하였다. N보다 넉넉하게 큰 수를 설정하고 그만큼 소수를 찾아 놓은 후, N보다 큰 소수를 찾아 String으로 만든 후 팰린드롬 여부를 판단하였다. 문자열로 만들면 뒤로 뒤집어서 확인해도 팰린드롬인지 확인이 가능하므로 이를 이용하여 풀었다. 에라토스테네스의 체의 경우 위의 링크를 참조하시길.. 해답 let N = Int(readLine()!)! var num = 3_000_000 var numArray = Array(repeating: 0, count: num + 1) var cnt = 0 func isPalindrome (_ num: Int ) -> Bool { let str = String(num) re..
아이디어 서브 테스트가 존재하는 문제이며 이를 통해 효율성과 관련 있는 문제라는 것을 알 수 있다. 이제까지 소수를 구하던 방법으로 이중 for문을 통하여 반복해가며 제곱근에 닿을 때까지 연산을 거듭하는 방식으로 풀려고 했으나 실패했다. 다음으로 찾아낸 방식은 에라토스테네스의 체이다. 넉넉하게 천만까지 소수를 판별하도록 하였다. 에라토스테네스의 체에 대해 짧게 서술하면 쉽게 구현이 가능하면서도 충분히 빠른 방법이다. 1. 원하는 숫자까지 배열로 세팅을 완료하고 애매한 숫자인 1을 제거한다. (여기서 제거라는 것은 배열에서는 0이나 false로 값을 변경하면 된다) 2. 다음으로 2와 3의 배수를 제거하되 자기 자신은 그대로 둔다. 3. 이와 같이 5의 배수, 7의 배수, 그 다음도 지워나간다. 이미 지워..
문제 요약 1. p, y, P, Y이 s에 포함되어 있지 않으면 true를 리턴 2. 다음으로 p와 y의 갯수를 센다. 서로 동일하면 true와 아니면 false를 리턴한다. 해답 import Foundation func solution(_ s:String) -> Bool { var pCnt = 0 var yCnt = 0 if !s.contains("p") && !s.contains("y") && !s.contains("P") && !s.contains("Y") { return true } for i in s { if i == "p" || i == "P" { pCnt += 1 } else if i == "Y" || i == "y" { yCnt += 1 } } if pCnt == yCnt { return ..
아이디어 홀짝을 판단하고 그에 맞춰서 수와 박을 넣는다. 유용한 문법 요소는 joined이다. 해답 func solution(_ n:Int) -> String { var result: [String] = [] for i in 1 ... n { if i % 2 == 0 { result.append("박") } else { result.append("수") } } return result.joined(separator: "") }