Swift
-
Programmers Lv3) 방문 길이Algorithm/Programmers 2020. 7. 10. 13:54
출처: programmers.co.kr/learn/courses/30/lessons/49994 분류: Lv3 접근방식 -5 ~ 5 까지의 정사각형에서 U, D, R, L 중 하나로 이동 방향들이 주어질 때, 처음 이동한 길의 개수를 세는 문제입니다. 저는 처음에 Set 로 이루어진 11x11 맵을 만들고 각 칸에 이동한 위치를 넣는 엄청나게 무식한 방법을 사용했는데, 단순히 새로운 길의 개수만 알면 되기 때문에 이럴 필요 없이 그냥 좌표만 가지고도 해결할 수 있는 문제입니다. 갈 수 있는 길이라면 그 길을 그냥 Set 에 String 으로 때려박으면 매우 간단해집니다. 주의할 점은 (0, 0) -> (0, 1) 로 이동했다면 반대로 오는 (0, 1) -> (0, 0) 도 같은 길로 체크해야 합니다. 해결..
-
BOJ 14889 스타트와 링크Algorithm/BOJ 2020. 7. 8. 16:17
출처: www.acmicpc.net/problem/14889 분류: 완전탐색 접근방식 짝수의 사람과 두 사람이 같은 팀일 때 능력치가 주어지고, 사람들을 두 팀으로 나눌 때, 능력치의 차이를 구하는 문제입니다. 핵심 포인트는 크게 두 가지로 볼 수 있습니다. 1. 사람들을 두 팀으로 나누기 2. 각 팀의 능력치를 구하기 주의할 점은 각 팀의 능력치를 구할 때 팀원 두 쌍의 능력치를 각각 모두 더해줘야 합니다. 만약 1, 3, 6이 한 팀이고 두 사람이 팀일 때 능력치를 Sij 라고 한다면, S13 + S16 S31 + S36 S61 + S63 위 6가지 경우를 모두 더해줘야 합니다. 해결방법 팀을 나누는 건 3명을 뽑으면 나머지 팀은 자동으로 완성되므로 3명을 뽑을 때까지 재귀로 구현했습니다. func ..
-
~= 연산자 in SwiftSwift 2020. 7. 7. 16:52
오늘은 ~= 연산자에 대해서 알아보겠습니다. ~= 연산자 ~= 연산자는 대상이 특정 범위에 속하는지 범위를 체크하는 연산자 입니다. 저희가 많이 사용하는 switch 구문에 바로 이 ~= 연산자가 사용됩니다. case 의 범위를 확인할 때 내부적으로 ~= 연산자가 불려서 사용되고 있는 것이죠. ~= 연산자는 비교 연산자 == 의 변형? 확장된 상태로 생각할 수 있겠습니다. 두 대상이 같은지 단순 비교할 때 == 연산자와 달리 대상이 어떤 범위에 속하는지 확인합니다. 숫자 5가 0~ 10 사이일 때 10을 곱해주려면 이렇게 할 수 있습니다. var n = 5 if 0.. Bool { if "a"..."z" ~= str { // str contain lowercased alpabet return true }..
-
백준 1041 주사위Algorithm/BOJ 2020. 6. 30. 15:37
출처: www.acmicpc.net/problem/1041 분류: Greedy 접근방식 주사위를 쌓아서 정육면체를 만들 때 각 주사위에서 서로 마주보는 면이 동시에 보일 수는 없습니다. 따라서 마주보는 면이 안 나오게 잘 계산해서 최소값을 구해줘야 합니다. 주어진 도면에서 각 주사위의 마주보는 면은 (0, 5), (1, 4), (2, 3) 입니다. (주사위 1개인 경우 제외) 만들어진 정육면체에서 각 주사위는 3가지 케이스 밖에 생기지 않고 각 케이스의 개수는 아래와 같습니다. 세 면이 보이는 경우 4개 ( 각 모서리 위쪽 ) 두 면이 보이는 경우 4(N-1) + 4(N-2) (옆면 모서리 + 위쪽 모서리) 한 면이 보이는 경우 4N(N-2) + (N-2)(N-2) (테두리를 제외한 옆면 + 테두리를 제..
-
Hashable in Swift 5Swift 2020. 6. 25. 19:48
요즘 CS193p 강의를 다시 보고 있는데 이런 내용이 있었나 와 정말 이렇게 알찬 강의였나 라는 생각이 계속 드네요 너무도 배울게 많고 부족했던게 많았구나를 알려주는 강의인 것 같습니다. protocol 쪽을 보다가 Hashable에 대해 잠깐 짚어보고 넘어가려고 합니다 :) 새로운 구조체나 클래스를 정의해서 객체를 만들었는데, 얘네들을 비교하고 싶다? 그럴 때 Hashable protocol 을 사용합니다. 그럼 Hashable protocol은 뭘까요? Hashable protocol Hashable 을 뭐라고 설명하는지 먼저 살펴볼까요? integer hash value를 생성하는 Hasher로 hash 될 수 있는 타입. 한 마디로 Hashable protocol을 상속 받는다는 건 hash 될..
-
BOJ 1439 뒤집기Algorithm/BOJ 2020. 6. 22. 15:42
출처: www.acmicpc.net/problem/status/1439/74/1 분류: Greedy 접근방식 0이 연속되는 구간, 1이 연속되는 구간을 계산해서 더 작은 구간을 다 뒤집으면 되니까 더 적은 구간을 출력해주면 되는 문제입니다. 해결방법 let str = readLine()! var zeroSection = 0 var oneSection = 0 var current: Character? for char in str { guard let curr = current else { current = char continue } if char != curr { if char == "0" { zeroSection += 1 } else { oneSection += 1 } current = char } }..
-
백준 2812 크게 만들기Algorithm/BOJ 2020. 6. 22. 15:27
출처: www.acmicpc.net/problem/2812 분류: Greedy 접근방식 주어진 수에서 k개를 지워서 가장 큰 수를 만들어야 하는 문제입니다. 앞에서부터 스택에 담는데, 스택의 뒤에서부터 해당 수보다 작은 수는 다 지워내고 추가합니다. 저희는 k개를 지워야 하므로 지울 때마다 k의 개수를 줄여나갑니다. k가 0이 되었다면 더이상 지울만큼 지웠으므로 그냥 스택에 담아줍니다. 정리해보면 주어진 문자열에서 현재 확인할 숫자 n을 가지고 스택을 뒤에서부터 확인하면서 크거나 같을 때까지 반복합니다. // 현재 대상이 되는 수 n // stack의 뒤에서부터 확인하는 인덱스 i while i >= 0 { if n = 0 { if cuttedNumber[idx] >= originChar { // 비교대..
-
백준 3019 빵집Algorithm/BOJ 2020. 6. 18. 15:35
출처: www.acmicpc.net/problem/3109 분류: 그리디, DFS 접근방식 첫번째 열부터 차례대로 연결할 수 있는지 탐색하면 되는 문제입니다. 처음에 그냥 풀었다가 시간초과가 나고.. dfs를 사용해서 풀었는데, 주의할 건, 다음으로 연결할 수 있는 경우는 오른쪽, 오른쪽 위, 오른쪽 아래 3가지라서 다음 경우까지 모두 해봐야 하기 때문에 dfs에서 결과를 그냥 리턴하면 안되고 true일 경우에만 리턴해야 합니다. 해결방법 let n = readLine()!.split(separator: " ").map{Int($0)!} var map = [[Bool]]() for _ in 0.. Bool { return r >= 0 && c >= 0 && r < n[0] && c < n[1] } var..