https://school.programmers.co.kr/learn/courses/30/lessons/120876
문제
선분 3개가 평행하게 놓여 있습니다. 세 선분의 시작과 끝 좌표가 [[start, end], [start, end], [start, end]] 형태로 들어있는 2차원 배열 lines가 매개변수로 주어질 때, 두 개 이상의 선분이 겹치는 부분의 길이를 return 하도록 solution 함수를 완성해 보세요.
lines가 [[0, 2], [-3, -1], [-2, 1]]일 때 그림으로 나타내면 다음과 같습니다.
선분이 두 개 이상 겹친 곳은 [-2, -1], [0, 1]로 길이 2만큼 겹쳐있습니다.
제한사항
lines의 길이 = 3
lines의 원소의 길이 = 2
모든 선분은 길이가 1 이상입니다.
lines의 원소는 [a, b] 형태이며, a, b는 각각 선분의 양 끝점입니다.
-100 ≤ a < b ≤ 100
풀이 1
class Solution {
fun solution(lines: Array<IntArray>): Int {
val list1 = (lines[0][0] until lines[0][1]).intersect(lines[1][0] until lines[1][1])
val list2 = (lines[0][0] until lines[0][1]).intersect(lines[2][0] until lines[2][1])
val list3 = (lines[1][0] until lines[1][1]).intersect(lines[2][0] until lines[2][1])
return list1.union(list2).union(list3).size
}
}
- 해당문제를 처음 보았을 때 푼 문제입니다. 이 당시에는 해당문제를 수학적으로 바라보았기 때문에 교집합으로 풀면 되는 것이 아닌 가라는 생각을 하며 set을이용한 집합으로 풀어보았습니다. 지금 보았을 때는 해당풀이는 가독성이 좋지만 집합의 로직이 무겁기 때문에 메모리나 속도등을 고려한 다른 풀이가 필요해 보입니다.
결과 1
풀이 2
class Solution {
fun solution(lines: Array<IntArray>): Int {
val arr = IntArray(200)//-100 ~ 99
lines.forEach { ints ->
val front = ints[0] + 100
val back = ints[1] + 100
for (n in front until back) {
arr[n]++
}
}
return arr.count { it > 1 }
}
}
- 수정부분을 생각하다 나온 결론은 a와 b의 범위가 짧음으로 해당범위의 크기를 가진 배열을 만들어 line의 범위만큼 1씩 키워준다면 결과적으로는 1보다 큰 값을 가지값을 가지고 있는 곳은 겹쳐져있는 구간을 의미한다는 것이었습니다. 그렇게 이를 응용하여 코드를 작성해 보았습니다.
결과 2
'코틀린 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] - 안전지대(Kotlin) (0) | 2023.08.01 |
---|---|
[프로그래머스] - 캐릭터의 좌표(Kotlin) (0) | 2023.08.01 |
[프로그래머스] - 캐릭터의 좌표(Kotlin) (0) | 2023.07.31 |
[프로그래머스] - 영어가 싫어요 (Kotlin) (0) | 2023.07.29 |
[프로그래머스] - 2차원으로 만들기 (Kotlin) (0) | 2023.07.29 |