-
카카오_프로그래머스_거리두기 확인하기 swift알고리즘/알고리즘 문제풀이 2022. 2. 21. 15:35
https://programmers.co.kr/learn/courses/30/lessons/81302?language=swift
코딩테스트 연습 - 거리두기 확인하기
[["POOOP", "OXXOX", "OPXPX", "OOXOX", "POXXP"], ["POOPX", "OXPXP", "PXXXO", "OXXXO", "OOOPP"], ["PXOPX", "OXOXP", "OXPOX", "OXXOP", "PXPOX"], ["OOOXX", "XOOOX", "OOOXX", "OXOOX", "OOOOO"], ["PXPXP", "XPXPX", "PXPXP", "XPXPX", "PXPXP"]] [1, 0, 1, 1, 1]
programmers.co.kr
문제접근
- 각 대기실의 거리두기 평가를 시행
- 대기실의 데이터를 행렬로 변환치 아니하고, 2중 반복을 사용하여 P,X의 좌표를 각각 참여자들, 파티션 Array에 추가.
- 각 참여자 상호간의 맨해튼거리를 연산, 2이하일 경우, 좌표 관계( 같은 행, 같은 열, 대각선 여부)에 따른 파티션 유무 확인
- 3에 따른 결과를 Array에 append해 return.
성능
더보기테스트 1 〉 통과 (0.23ms, 16.2MB) 테스트 2 〉 통과 (0.18ms, 16.4MB) 테스트 3 〉 통과 (0.18ms, 16.3MB) 테스트 4 〉 통과 (0.19ms, 16.4MB) 테스트 5 〉 통과 (0.16ms, 16.4MB) 테스트 6 〉 통과 (0.25ms, 16.4MB) 테스트 7 〉 통과 (0.17ms, 16.4MB) 테스트 8 〉 통과 (0.27ms, 16.3MB) 테스트 9 〉 통과 (0.17ms, 16.4MB) 테스트 10 〉 통과 (0.17ms, 16.3MB) 테스트 11 〉 통과 (0.17ms, 16.3MB) 테스트 12 〉 통과 (0.17ms, 16.5MB) 테스트 13 〉 통과 (0.16ms, 16.3MB) 테스트 14 〉 통과 (0.16ms, 16.3MB) 테스트 15 〉 통과 (0.18ms, 16.3MB) 테스트 16 〉 통과 (0.20ms, 16.4MB) 테스트 17 〉 통과 (0.18ms, 16.1MB) 테스트 18 〉 통과 (0.16ms, 16.4MB) 테스트 19 〉 통과 (0.16ms, 16.3MB) 테스트 20 〉 통과 (0.18ms, 16.2MB) 테스트 21 〉 통과 (0.18ms, 16.3MB) 테스트 22 〉 통과 (0.18ms, 16.4MB) 테스트 23 〉 통과 (0.14ms, 15.9MB) 테스트 24 〉 통과 (0.15ms, 16.2MB) 테스트 25 〉 통과 (0.10ms, 16.4MB) 테스트 26 〉 통과 (0.14ms, 16.3MB) 테스트 27 〉 통과 (0.20ms, 16MB) 테스트 28 〉 통과 (0.22ms, 16.4MB) 테스트 29 〉 통과 (0.25ms, 16MB) 테스트 30 〉 통과 (0.16ms, 16.1MB) 정답 코드
더보기import Foundation func solution(_ places:[[String]]) -> [Int] { func manhattanDistance(_ lhs: [Int], _ rhs: [Int]) -> Int { return abs(lhs[0]-rhs[0]) + abs(lhs[1]-rhs[1]) } func isKeepDistance(_ input: [String]) -> Int { var participants: [[Int]] = [] var partition: [[Int]] = [] for (i, str) in input.enumerated() { for (ii,char) in str.enumerated() { switch char { case "P": participants.append([i,ii]) case "X": partition.append([i,ii]) default: continue } } } for i in 0..<participants.count { for ii in i+1..<participants.count { let lhs = participants[i] let rhs = participants[ii] let distance = manhattanDistance(lhs, rhs) if distance <= 2 { if lhs[0] == rhs[0] && !partition.contains([lhs[0],(lhs[1] + rhs[1]) / 2]) { // 같은 행 return 0 } else if lhs[1] == rhs[1] && !partition.contains([(lhs[0] + rhs[0]) / 2, lhs[1]]) { return 0 } else if (lhs[0] != rhs[0]) && (lhs[1] != rhs[1]) && (!partition.contains([lhs[0],rhs[1]]) || !partition.contains([rhs[0],lhs[1]])) { return 0 } } } } return 1 } var ans : [Int] = [] for place in places { let result = isKeepDistance(place) ans.append(result) } return ans }
'알고리즘 > 알고리즘 문제풀이' 카테고리의 다른 글
카카오_프로그래머스_양궁대회 swift (0) 2022.02.28 hash,string,sort_LeetCode_49.GroupAnangram swift (0) 2022.02.21 그래프_백준_11724 swift (0) 2022.01.25 행렬_Leetcode_130.Surrounded Region Swift (0) 2022.01.25 행렬_백준_1012 (0) 2022.01.25