문제
문제 설명
선분 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
입출력 예
lines | result |
[[0, 1], [2, 5], [3, 9]] | 2 |
[[-1, 1], [1, 3], [3, 9]] | 0 |
[[0, 5], [3, 9], [1, 10]] | 8 |
입출력 예 설명
입출력 예 #1
- 두 번째, 세 번째 선분 [2, 5], [3, 9]가 [3, 5] 구간에 겹쳐있으므로 2를 return 합니다.
입출력 예 #2
- 겹친 선분이 없으므로 0을 return 합니다.
입출력 예 #3
- 첫 번째와 두 번째 선분이 [3, 5] 구간에서 겹칩니다.
- 첫 번째와 세 번째 선분 [1, 5] 구간에서 겹칩니다.
- 두 번째와 세 번째 선분 [3, 9] 구간에서 겹칩니다.
- 따라서 [1, 9] 구간에 두 개 이상의 선분이 겹쳐있으므로, 8을 return 합니다.
풀이
풀이 접근 과정
선이 지나가는 부분을 체크해서 중복되는 것만 걸러내면 된다고 생각했다.
그러면 연달아서 중복되는 건? 그냥 한번만 체크하면 되지 않을까?
나의 풀이
class Solution {
fun solution(lines: Array<IntArray>): Int {
val map = mutableMapOf<Int, Boolean>()
lines.forEach {
for (i in it[0] until it[1]) {
map[i] = map[i] != null
}
}
return map.filter { it.value }.size
}
}
- 선이 지나가는 것을 기록할 map을 선언한다.
- 선은 시작점부터 끝점까지 차례로 map에 넣는다.
- 만약 처음 지나가는 지점이면 boolean 값을 false로 처리한다. (겹치지 않음)
- 이미 map에 값이 존재하면, 겹치는 부분이므로 true로 변경한다.
- map에 true인 값의 개수를 뽑아서 리턴한다.
Comment
레벨 0라서 만만하게 봤는데, 만만치 않아서 당황했던 문제였다 ㅋㅋㅋㅋ
그래도 바로 접근해서 금방 풀리긴 했음 !!
'프로그래머스 > Kotlin | Level1' 카테고리의 다른 글
[프로그래머스/Kotlin]Lv1 - 햄버거 만들기 (3) | 2024.11.08 |
---|---|
[프로그래머스/Kotlin]Lv0 - 안전지대 (0) | 2024.09.20 |
[프로그래머스/Kotlin]Lv1 - 숫자 문자열과 영단어 (0) | 2024.08.02 |
[프로그래머스/Kotlin]Lv1 - 부족한 금액 계산하기 (0) | 2024.07.17 |
[프로그래머스/Kotlin]Lv1 - 명예의 전당(1) (0) | 2024.07.11 |