clamp
Clamp
clamp
글쓰기 관리
전체 방문자
오늘
어제
  • 분류 전체보기 (509)
    • IOS (85)
    • SwiftUI+TCA+Combine (9)
    • RxSwift + MVVM (56)
    • Clean Architecture (12)
    • SWIFT (56)
    • iOS - TDD (2)
    • 디자인패턴 (4)
    • CS (56)
      • 알고리즘 (29)
      • 운영체제 (15)
      • 자료구조 (2)
      • 네트워킹 (4)
      • 기타 (6)
    • 회고 (0)
    • Firebase (18)
    • SwiftUI (10)
    • iOS - UIKit (11)
    • iOS - 오픈소스 (6)
    • 코딩테스트 (166)
      • 프로그래머스 (164)
    • 정보처리기사 (14)
    • GitHub (2)
글쓰기 / 관리자

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • ㅅ
  • uikit
  • Swift
  • Q

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
clamp

Clamp

코딩테스트/프로그래머스

프로그래머스 - 거리두기 확인하기 Swift(구현)

2023. 2. 21. 10:41

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이 및 소스코드

 

허드슨 거리가 2라면 조건은 해선 안되는 포지션은 아래와 같다

행이 같을경우 

POP -> 탈락

 

열이 같을 경우

P

O

P   -> 탈락

 

행과 열이 다를경우(대각선인경우)

P?     

?P   -> ?가 하나라도 O일경우 탈락

 

1차원 String배열로 1개의 맵이 주어지기 때문에 이를 2차원 배열로 바꿔줘야한다.

 

1개의 1차원배열에 대하여 2차원 Character배열로 바꾼다.

for place in places {
        var map = [[Character]]()
        
        for pArr in place{
            map.append(Array(pArr))
        }
  }

이렇게하면 map엔 1개의 위치정보가 담기고 for pArr아래에서 한개의 맵에대한 검사를 할 수 있다.

두개의 배열을 생성해서 검사를 시작한다.

P의 x, y,좌표를 담을 배열 parr과 

해당 맵이 거리두기를 지키고 있는지 저장할 isSafe배열이다.

 

import Foundation

//맨해튼 거리가 2 이하로 앉지말아
//파티션으로 막힌경우 허용
//응시자 P
//빈테이블 O
//파티션 X
func solution(_ places:[[String]]) -> [Int] {
    var result = [Int]()
    
    for place in places {
        //1차원 지도를 2차원 지도로 변환---
        var map = [[Character]]()
        
        for pArr in place{
            map.append(Array(pArr))
        }
        //--------------
        
        var parr = [[Int]]() //P가담긴 x, y,좌표를 담을 배열
        var isSafe = true    //현재 검사중인 map이 안전수칙을 지키고있는지
        
        for x in 0..<map.count{//x, y의 좌표를 추가
            for y in 0..<map[0].count{
                if map[x][y] == Character("P"){
                    parr.append([x, y])
                }
            }
        }
        
        //전체 P를 서로 검사한다.
        for start in 0..<parr.count{
            if !isSafe { break }
            
            for next in start+1..<parr.count{
                let first = parr[start]
                let second = parr[next]
                let distance = abs(first[0] - second[0]) + abs(first[1] - second[1]) //허드슨
                
                if distance > 2{ continue }
                
                if distance == 1{
                    isSafe = false
                    break
                }
                
                //거리가 2인경우 검사
                if distance == 2{
                    //행이 같은 경우
                    if (first[0] == second[0]) {
                        if map[first[0]][min(first[1], second[1]) + 1] == Character("O"){
                            isSafe = false
                            break
                        }
                    }else if (first[1] == second[1]) {
                        //열이 같은경우
                        if map[min(first[0], second[0]) + 1][first[1]] == Character("O"){
                            isSafe = false
                            break
                        }
                    }else{
                        //대각선일경우
                        if map[first[0]][second[1]] == Character("O") || map[second[0]][first[1]] == Character("O"){
                            isSafe = false
                            break
                        }
                    }
                }
            }
        }
        
        if isSafe == false{
            result.append(0)
        }else{
            result.append(1)
        }
    }
    
    
    return result
}
저작자표시 비영리 동일조건 (새창열림)
    '코딩테스트/프로그래머스' 카테고리의 다른 글
    • 프로그래머스 - 문자열 압축 Swift(구현)
    • 프로그래머스 - 택배상자 Swift (스택, 구현)
    • 프로그래머스 - 가장 큰 정사각형 Swift(DP)
    • 프로그래머스 - 두 큐 합 같게 만들기 Swift
    clamp
    clamp
    주니어 iOS개발자의 발악!!!!!!!

    티스토리툴바