sggnology
하늘속에서IT
sggnology
전체 방문자
오늘
어제
  • 분류 전체보기 (83)
    • Algorithm (31)
      • Programmers (27)
      • Baekjoon (4)
    • WIKI (4)
      • VirtualBox (1)
      • Power Toys (1)
    • NodeJS (4)
      • nvm (1)
      • React (1)
      • Vue (1)
    • Dev Language (3)
      • Java (2)
      • Kotlin (1)
    • Spring Boot (17)
      • Gradle (1)
      • JPA (3)
    • DB (4)
      • MariaDB (3)
      • Redis (0)
    • Android (6)
      • Debug (3)
    • Nginx (3)
      • Debug (1)
    • Intellij (0)
    • Network (1)
    • Git (2)
      • GitHub (2)
    • Chrome Extension (0)
    • ETC (5)
      • Monitoring (2)
    • Linux (1)
      • WSL (1)
    • Visual Studio (1)
    • Side Project (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 티스토리챌린지
  • spring boot
  • nginx
  • Android Studio
  • 안드로이드 스튜디오
  • 백준
  • DB
  • docker
  • java
  • 알고리즘
  • kotlin
  • 레벨3
  • 오블완
  • 레벨2
  • JPA
  • mariadb
  • 연습문제
  • 고득점 Kit
  • 프로그래머스
  • 고득점KIT

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
sggnology

하늘속에서IT

Programmers :: 2021 카카오 채용연계형 인턴십 :: 거리두기 확인하기
Algorithm/Programmers

Programmers :: 2021 카카오 채용연계형 인턴십 :: 거리두기 확인하기

2022. 8. 16. 22:42
728x90

문제 설명 이미지

풀이

/**
 * 설명
 * - 프로그래머스 > 2021 카카오 채용연계형 인턴십
 * - 경로 : https://school.programmers.co.kr/learn/courses/30/lessons/81302
 *
 * */
class 거리두기확인하기 {
    fun solution(places: Array<Array<String>>): IntArray{

        /**
         * 로직설명
         * - 코테설명 이미지를 보고 힌트를 얻었다.
         * - 이미지에 따르면 패턴이 존재한다는 것을 알 수 있다.
         * - 해당 패턴은 예를들면 다음과 같다. "PP", "POP"
         * */

        var answer: IntArray = IntArray(places.size){0}

        places.forEachIndexed { index, place ->
            var colPlace = generateColPlaces(place)
            var diagonalPlace = generateDiagonalPlaces(place)

            if(casePPORPOP(place) || casePPORPOP(colPlace) || caseDiagonal(diagonalPlace)){
                answer[index] = 0
            }
            else{
                answer[index] = 1
            }
        }

        print(answer.toList())

        return answer
    }

    /**
     * 설명
     * - 면접장의 열을 나타내는 string 배열입니다.
     * */
    fun generateColPlaces(place: Array<String>): Array<String>{
        val colPlaces = mutableListOf<String>()

        for(i in place.indices){

            var tmpString = ""

            for(rowPlace in place){
                tmpString += rowPlace[i]
            }

            colPlaces.add(tmpString)
        }

        return colPlaces.toTypedArray()
    }

    /**
     * 설명
     * - 면접장에서 나올수 있는 2*2 사각형의 모든 경우에 수 에 대한 string 배열입니다.
     * - 0,1 인덱스는 2*2 사각형의 첫번째 행을 의미합니다.
     * - 1,2 인덱스는 2*2 사각형의 두번째 행을 의미합니다.
     * */
    fun generateDiagonalPlaces(place: Array<String>): Array<String>{
        val diagonalPlaces = mutableListOf<String>()

        val size = (place.size - 1)*(place.size - 1)
        
        var xCoordinate = 0
        var yCoordinate = 0

        var startingPoint = 0;

        var tmpString = ""
        
        for(i in 0 until size){
            xCoordinate = i%4
            yCoordinate = i/4

            tmpString = "" +
                    "${place[xCoordinate][yCoordinate]}" +
                    "${place[xCoordinate][yCoordinate+1]}" +
                    "${place[xCoordinate+1][yCoordinate]}" +
                    "${place[xCoordinate+1][yCoordinate+1]}"

            diagonalPlaces.add(tmpString)
        }

        return diagonalPlaces.toTypedArray()
    }

    /**
     * 설명
     * - PP, POP 패턴일 경우 거리두기를 지키지 않은 것입니다.
     * */
    fun casePPORPOP(place: Array<String>): Boolean{
        val casePP = "PP"
        val casePOP = "POP"

        for(placeString in place){
            if(placeString.contains(casePP)){
                return true
            }
            if(placeString.contains(casePOP)){
                return true
            }
        }

        return false
    }

    /**
     * 설명
     * - 아래의 case1~case6 까지의 경우 2*2 사각형 에서 경우를 지키지 않은 경우입니다.
     * */
    fun caseDiagonal(place: Array<String>): Boolean{
        val case1 = "POOP"
        val case2 = "POXP"
        val case3 = "PXOP"
        val case4 = "OPPO"
        val case5 = "OPPX"
        val case6 = "XPPO"

        for(diagonalPlace in place){
            if(diagonalPlace.contains(case1) ||
                diagonalPlace.contains(case2) ||
                diagonalPlace.contains(case3) ||
                diagonalPlace.contains(case4) ||
                diagonalPlace.contains(case5) ||
                diagonalPlace.contains(case6)){
                return true
            }
        }

        return false
    }
}

출처

 

프로그래머스

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

programmers.co.kr


문제 풀이 코드

 

GitHub - sggnology/programmers-algorithm: 프로그래머스 알고리즘 코드 정리입니다.

프로그래머스 알고리즘 코드 정리입니다. Contribute to sggnology/programmers-algorithm development by creating an account on GitHub.

github.com

 

728x90

'Algorithm > Programmers' 카테고리의 다른 글

Programmers :: 연습문제 :: 최솟값  (0) 2022.09.17
Programmers :: 2022 tech internship :: 두 큐 합 같게 만들기  (0) 2022.08.30
Programmers :: Summer/Winter Coding(2019) :: 멀쩡한 사각형  (0) 2022.08.04
Programmers 동적계획법 :: 레벨3 :: N 으로 표현  (0) 2022.07.26
Programmers DFS/BFS :: 레벨 2 :: 게임 맵 최단거리  (0) 2022.07.20
    'Algorithm/Programmers' 카테고리의 다른 글
    • Programmers :: 연습문제 :: 최솟값
    • Programmers :: 2022 tech internship :: 두 큐 합 같게 만들기
    • Programmers :: Summer/Winter Coding(2019) :: 멀쩡한 사각형
    • Programmers 동적계획법 :: 레벨3 :: N 으로 표현
    sggnology
    sggnology
    하늘은 파란색이니까 내 삶도 파란색이길 ㅎㅎ

    티스토리툴바