-
[프로그래머스] 교점에 별 만들기 (위클리 챌린지 10주차) Swift알고리즘 2021. 10. 14. 15:50
문제 내용
n개의 직선이 주어지면,
직선의 교점 중에 정수로 표현되는 좌표만 별 표시를 해라.
Ax + By + E = 0, Cx + Dy + F = 0
이라는 두 직선의 교점이 유일하게 존재할 경우, 그 교점은
x = (BF - ED) / (AD - BC)
y = (EC - AF) / (AD - BC)
AD - BC = 0 인 경우 두 직선은 평행 또는 일치함.
전체 코드
import Foundation func solution(_ line:[[Int]]) -> [String] { // 1. x, y 위치 저장용 배열 var location: [(x: Int, y: Int)] = [] // 2. x 의 최대 최솟값과 y 의 최대 최솟값을 저장하기 위한 값 var maxX = Int.min var minX = Int.max var maxY = Int.min var minY = Int.max for i in 0..<line.count - 1 { for j in i + 1..<line.count { // 4. Ax + By + E 에서 ABE 값 let abe = line[i] // 5. Cx + Dy + F 에서 CDF 값 let cdf = line[j] // 6. AD - BC let adbc = abe[0] * cdf[1] - abe[1] * cdf[0] // 7. BF - ED let bfed = abe[1] * cdf[2] - abe[2] * cdf[1] // 8. EC - AF let ecaf = abe[2] * cdf[0] - abe[0] * cdf[2] // 9. 만약 AD - BC 는 0 이 아니고, 교점 x ( BF - ED / AD - BC ) 와 y ( EC - AF / AD - BC) 가 둘다 정수로 나눠 떨어지면 if adbc != 0 && bfed % adbc == 0 && ecaf % adbc == 0 { // 10. location 배열에 x, y 값을 추가함 location.append((bfed / adbc, ecaf / adbc)) // 11. x, y 의 최댓값과 최솟값 갱신 maxX = max(location.last!.x, maxX) minX = min (location.last!.x, minX) maxY = max(location.last!.y, maxY) minY = min(location.last!.y, minY) } } } // 12. 결과를 얻기 위해 사용할 배열 // 크기는 maxX - minX + 1 과 maxY - minY + 1 로 2차원 배열 설정함 // 가로가 X 축, 세로가 Y 축이므로 배열도 동일하게 생성 var arr = Array(repeating: Array(repeating: ".", count: maxX - minX + 1), count: maxY - minY + 1) // 13. 저장된 x, y 에 따라 배열에 값을 갱신함 for location in location { arr[location.y - minY][location.x - minX] = "*" } // 14. 결과 저장용 var result: [String] = [] // 15. swift 에서는 일반 좌표 평면처럼 좌측 하단 시작이 아닌 좌측 상단 시작이므로 // 배열을 뒤집어서 결과값을 저장해야함 for arr in arr.reversed() { result.append(arr.reduce("", +)) } return result }
결론
교점 부분이 분수로 표현될 수 있다고 생각해서 어렵게 봤는데,그 경우는 다 무시하면 되는 문제라 수월했다.
출처 : 프로그래머스 위클리 챌린지 10주차 교점에 별 만들기
https://programmers.co.kr/learn/courses/30/lessons/87377
'알고리즘' 카테고리의 다른 글
[프로그래머스] n^2 배열 자르기 (월간 코드 챌린지 시즌3) Swift (0) 2021.10.26 [프로그래머스] 피로도 (위클리 챌린지 12주차) Swift (0) 2021.10.25 [백준] 톱니바퀴 (14891번) Swift (0) 2021.10.12 [백준] 구슬 탈출 2 (13460번) Swift (0) 2021.10.11 [백준] 주사위 굴리기 (14499번) Swift (0) 2021.10.10