본문 바로가기
Problem Solving

[Swift] 프로그래머스 평행(lv. 0)

by DuncanKim 2023. 1. 11.
728x90

[Swift] 프로그래머스 평행(lv. 0)

 

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/120875

 

2. 접근

 

두 점을 공통으로 지나는 '일차함수'를 생각해보았다. 선분을 일차함수로 생각해본다면, 두 점 사이의 기울기를 비교하고 그 기울기가 같으면 1을 리턴하고 그렇지 않으면 0을 리턴하면 된다.

 

(x1, y1), (x2, y2) 좌표가 있을 경우, 그 기울기는 아래와 같다.

기울기 = (y1 - y2) / (x1 - x2) 

 

모든 좌표를 서로 대조해보아야 하기 때문에, 반복문을 돌면서 모든 점들의 기울기 쌍을 구해본다.

 

아래에서는 tempDotsArray 라는 dots의 원소 타입을 Double로 바꾸어 배열을 만든다.

이중 반복문을 활용하여 이차원 배열의 인덱스를 구해준다.

바깥 반복문은 dots.count - 2 까지 인덱스를 구한다. inclinationA의 x1, y1 기울기를 구하는 것과 같다.

안쪽 반복문은 dots.count - 1 까지 인덱스를 구한다. inclinationA의 x2, y2 기울기를 구하는 것과 같다.

 

안쪽 반복문 안에는 (x1, y1) (x2, y2)의 인덱스가 구해져있다. tempDotsArray에서 그 좌표들을 제거해주면 나머지 좌표들이 남아있게 된다. 그 좌표들은 inclinationB의 기울기를 구하는 것에 사용된다.

 

비교를 해서 만약 같다면, return 1을 해주고, 반복문을 전부 돌았는데도 리턴이 되지 않는다면, 평행하는 선분이 없는 것이기에 return 0을 해준다.

 

삼항 연산자를 사용한 이유는 분모가 0이 되어 런타임 오류를 일으키는 것을 방지하기 위함이다.

 

 

3. 코드

 

import Foundation

func solution(_ dots:[[Int]]) -> Int {
    for i in 0 ... dots.count - 2 {
        var inclinationA = 0.0
        var inclinationB = 0.0
        
        for j in i + 1 ... dots.count - 1 {
            var tempDotsArray = dots.compactMap({ $0.compactMap({ Double($0) }) })
            inclinationA = (tempDotsArray[i][0] - tempDotsArray[j][0]) != 0 ? (tempDotsArray[i][1] - tempDotsArray[j][1]) / (tempDotsArray[i][0] - tempDotsArray[j][0]) : 0.0
            tempDotsArray.remove(at: i)
            tempDotsArray.remove(at: tempDotsArray.count == 3 ? j - 1 : j)
            inclinationB = (tempDotsArray[0][0] - tempDotsArray[1][0]) != 0 ? (tempDotsArray[0][1] - tempDotsArray[1][1]) / (tempDotsArray[0][0] - tempDotsArray[1][0]) : 0.0
            
            if inclinationA == inclinationB {
                return 1
            }
        }
    }
    return 0
}
728x90

댓글