문제 요약 테스트 케이스가 1인 경우와 cnt가 500을 넘어갈 때에 대한 처리를 하고 나머지 경우에 대해 문제에서 요구하는 대로 나머지 연산을 통하여 계산한다. 해답 func solution(_ num:Int) -> Int { var tmp = num var cnt = 0 if tmp == 1{ return 0 } while true { guard cnt < 500 else { return -1 } if tmp % 2 == 0 { tmp = tmp / 2 cnt += 1 } else if tmp % 2 == 1 { tmp = tmp*3 + 1 cnt += 1 } if tmp == 1 { return cnt } } }
문제 요약 Int로는 평균을 구할 수 없으니 Double을 사용하여 연산한다. 해답 func solution(_ arr:[Int]) -> Double { var sum_arr: Double = 0 for member in arr { sum_arr += Double(member) } return sum_arr / Double(arr.count) }
문제 요약 이 문제를 통하여 자릿수를 추출하는 방법 중 하나를 배울 수 있었다. 다양한 방법이 존재하지만 String으로 만들고 각 자리의 문자를 가져온 후 이를 다시 String 하고 Int로 변환한다. 왜 String으로 굳이 하냐면 해당 요소는 아마도 String.Element 인가로 되어 있을 것이다. (스위프트에서 문자를 다루는 방식을 알 수 있다.) 다음으로, 나머지가 있는지 없는지를 판단하고 true 혹은 false를 리턴한다. 해답 func solution(_ x:Int) -> Bool { var result: Int = 0 for ch in String(x) { result += Int(String(ch))! } return x % result == 0 ? true : false }
문제 요약 뒷 네 자리만 제외하고 전부 마스킹하면 된다. 이를 위해서 startIndex의 위치를 알아내고 문자열의 길이에 맞춰 마스킹된 애스터리스크를 생성하여 출력하고 원본 숫자 네 자리를 출력한다. 해답 func solution(_ phone_number:String) -> String { let startindex = phone_number.index(phone_number.endIndex, offsetBy: -4) return String(repeating: "*", count: phone_number.count-4) + phone_number[startindex...] }
문제 요약 이중 배열을 알아보는 문제였다. 이중 배열을 다룰 때 빈 배열을 더해서 다뤄야지 없는 배열에 접근하여 다루는 것은 불가능한 것에 주의. 해답 func solution(_ arr1:[[Int]], _ arr2:[[Int]]) -> [[Int]] { var result: [[Int]] = [] for i in 0..
문제 요약 입력과 출력 방법을 공부하는 문제 해답 import Foundation let n = readLine()!.components(separatedBy: [" "]).map { Int($0)! } let (a, b) = (n[0], n[1]) for i in 1...b { print(String(repeating: "*", count: a)) }
아이디어 딕셔너리의 사용법을 알아보는 문제인 거 같다. 첫 번째 for문에서 딕셔너리에 데이터를 삽입한다. 그다음으로 SellCnt의 최댓값을 알아낸다. 다음 for문에서 key들 중 최댓값을 가진 key가 누가 있는지를 알아낸다. 이렇게 처리하는 이유는 같은 판매량을 가진 책들이 있을 경우 사전 순으로 정렬해서 출력해야 하기 때문이다. 배열에 key들을 넣고 여기서 정렬하여 첫 번째에 있는 책의 제목을 출력한다. 해답 let N = Int(readLine()!)! var SellCnt: [String: Int] = [:] var bestSellers: [String] = [] for _ in 0 ..< N { let temp = readLine()! if !SellCnt.keys.contains(tem..
아이디어 프로그래머스의 스파이 문제와 같다! 마찬가지로 딕셔너리를 이용하여 풀었다. 이 문제에서 옷의 종류는 중요하지만 옷의 이름은 중요하지 않다. 중복이 없으므로 어차피 다른 종류가 들어올 것이다. 1. 딕셔너리에 해당 옷 종류가 없으면 0으로 초기화한다. 2. 들어오는 문자열을 분석해서 옷의 종류에 따라 값을 증가시킨다. ([ "headgear": 1, eyewear: 2 ] 이런 식으로 들어감) 3. 머리나 얼굴에 아무것도 안 쓴 상태가 존재할 수도 있다. 이를 위해 각 케이스에 1을 더하여 딕셔너리에 있는 경우의 수를 모두 곱한다. 4. 하지만 알몸인 상태가 있으면 안 되므로 결과값에서 1을 빼고 출력한다. 해답 import Foundation let N = Int(readLine()!)! var..
아이디어 자꾸 시간 초과가 떠서 당황했었다. 결국 구조 자체를 구글을 참고하여 변경했다. IOI를 규칙에 맞게 생성하여 비교하면 시간초과가 나는 시스템인듯하다. 이 문제는 일단 IOI를 찾고 발견하게 되면 인덱스를 하나 뒤로 가서 IOI를 다시 확인한다. 해당 반복 과정에서 cnt 변수를 통하여 IOI의 길이 = N을 체크하게 된다. 확인하게 되면 result를 증가시켜 반영한다. 해답 let N = Int(readLine()!)! let M = Int(readLine()!)! let S = Array(readLine()!) var cnt = 0 var i = 0 var result = 0 while i < M - 2 { if String(S[i...i+2]) == "IOI" { cnt += 1 i +=..