아이디어 핵심 키워드를 모르면 못 푼다. 방향 없는 그래프와 연결 요소가 무엇인지 알아야 한다. 먼저 다른 문제와 같이 그래프를 만들고 dfs를 이용해서 풀었다. check 혹은 visited를 만들고 for문에서 순회하면서 방문하지 않았다면 연결 요소 수치인 result를 증가시키고 방문 처리를 한다. 다음으로 dfs 함수를 돌리는데 여기서는 해당 행에서 방문하지 않은곳을 찾는다. 마지막으로 자기 자신을 재귀로 호출하면 끝에서 타고 올라가며? 처리를 한다. 해답 let input = readLine()!.split(separator: " ").map { Int(String($0))!} let N = input[0] let M = input[1] var graph = Array(repeating: Arr..
아이디어 처음에 BFS 문제라 생각했다가 생각보다 조건이 간단하여 굳이 bfs로 안 풀어도 된다고 생각했다. 문제를 오독한 탓인데 수빈이의 동생이 수빈이보다 더 왼쪽 (K < N)일 가능성을 판단하지 못하고 생각보다 while로 푸는 것이 복잡하고 단계를 많이 거쳐야 했던 탓으로 생각한다. 오답 오답을 굳이 적어야 하나 싶었지만 머리속에서 5 17이라는 예시 조건에서 어떻게 문제를 풀어가는지를 생각했었다. 힌트에서 내가 생각한 것과 똑같은 방향으로 풀렸기 때문에 더욱 그렇게 착각한듯하다. 순간이동으로 단숨에 좁히는 것이 유리하므로 순간 이동하고 x-1, x+1 좌표에 동생이 있는지 확인하게 하였다. 아니면 K가 N의 2배 이상이 아닐 경우에만 순간 이동하고 아닌 경우에는 그냥 한 칸 N-1 하여 다시 순..
아이디어 에라토스테네스의 체를 이용하여 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의 배수, 그 다음도 지워나간다. 이미 지워..
아이디어 딕셔너리의 사용법을 알아보는 문제인 거 같다. 첫 번째 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 +=..
요약 진영 씨는 듣지도 못한 사람과 보도 못한 사람을 구분하는 걸까.. 듣도 못한 사람을 먼저 입력받고 바로 보도 못한 사람을 입력하면 된다. 그 후 두 집단의 교집합을 구하면 된다. 해답 교집합을 코드로 구현하다가 Set에는 교집합을 구하는 함수가 있다는 것을 알았다. Codility 문제인가 교집합을 코드로 구현해서 풀었던 거 같은데 그게 그렇게 푸는 게 아니었을지도 모르겠다. let NM = readLine()!.split(separator: " ").map({Int(String($0))!}) let N = NM[0] let M = NM[1] var noHeard = Set() var noSaw = Set() for _ in 0..
문제 요약 언뜻 읽었을 때 이해가 되지 않았다. 어차피 마지막 사람이 인출하는것까지 카운트하면 전체 소요되는 시간은 똑같은거 아닌가? 이 문제는 각 사람이 대기한 시간까지 포함하는 문제다. 3, 2, 1의 시간이 걸린다치면 123 순으로 하면 1 + 3+ 6으로 10이 나오지만 321순으로 인출을 하면 3+ 5+ 6으로 14가 나오기 떄문에 최솟값을 구할수 없다. 해답 let N = Int(readLine()!)! var array = readLine()!.split(separator: " ").map({Int(String($0))!}) var sum:Int = 0 var result:Int = 0 array.sort() for idx in array { sum = idx + sum result = su..