CHashtag

[프로그래머스] [C#] 거리두기 확인하기 본문

알고리즘

[프로그래머스] [C#] 거리두기 확인하기

HyoSeong 2022. 1. 10. 00:52
반응형

안녕하세요.

 

오늘은 프로그래머스 코딩테스트 연습 문제인 "거리두기 확인하기"를 풀어보았습니다.

 

해당 문제는 "2021 카카오 채용연계형 인턴십" 문제인데요, 저는 인턴십은 관심없지만, 문제가 흥미로워 풀어보았네요 ㅎㅎ

 

문제에 대한 정보는 아래 링크를 확인해주세요.

 

 

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

 

코딩테스트 연습 - 거리두기 확인하기

[["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

 

풀이방법


풀이는 간단합니다.

 

모든 자리를 돌면서 자기 자리와 인접한 자리에 다른 사람이 앉아있는지 확인하고, 칸막이가 잘 쳐져있는지 확인합니다.

 

효율적으로 확인하기 위해 저는 아래의 로직을 선택하였습니다.

 

1. 0,0 부터 4,4까지 반복합니다.

2. 자기자신과 인접한 8개의 자리를 확인합니다.

2-1. 대각선에 위치한 자리는 최단거리가 2개이니 주의해야 합니다.

3. 거리두기를 지키지 않았다면 0을 RETURN, 다음 대기실로 이동합니다.

 

 

또한 이번에는 중복코드 방지와 메모리 할당을 줄이기 위해 P, O를 상수로 선언해 두었습니다.

 

코드


using System;

public class Solution
{
    private const char P = 'P';
    private const char O = 'O';
    private const int WRONG = 0;

    public int[] solution(string[,] places)
    {
        int[] answer = new int[5];

        for (int i = 0; i < 5; i++)
        {
            string[] tempArray = new string[5];

            tempArray[0] = places[i, 0];
            tempArray[1] = places[i, 1];
            tempArray[2] = places[i, 2];
            tempArray[3] = places[i, 3];
            tempArray[4] = places[i, 4];

            answer[i] = KeepDistanceWell(tempArray);
        }

        return answer;
    }

    public int KeepDistanceWell(string[] place)
    {
        for (int i = 0; i < 5; i++)
        {
            for (int j = 0; j < 5; j++)
            {
                if (place[i][j] == P)
                {
                    // 위쪽 확인
                    if (i - 1 >= 0)
                    {
                        if (place[i - 1][j] == P) { return WRONG; }
                        if (place[i - 1][j] == O)
                        {
                            if (i - 2 >= 0 && place[i - 2][j] == P) { return WRONG; }
                            if (j + 1 <= 4 && place[i - 1][j + 1] == P) { return WRONG; }
                        }
                    }

                    // 오른쪽 확인
                    if (j + 1 <= 4)
                    {
                        if (place[i][j + 1] == P) { return WRONG; }
                        if (place[i][j + 1] == O)
                        {
                            if (j + 2 <= 4 && place[i][j + 2] == P) { return WRONG; }
                            if (i + 1 <= 4 && place[i + 1][j + 1] == P) { return WRONG; }
                            if (i - 1 >= 0 && place[i - 1][j + 1] == P) { return WRONG; }
                        }
                    }

                    // 아래쪽 확인
                    if (i + 1 <= 4)
                    {
                        if (place[i + 1][j] == P) { return WRONG; }
                        if (place[i + 1][j] == O)
                        {
                            if (i + 2 <= 4 && place[i + 2][j] == P) { return WRONG; }
                            if (j + 1 <= 4 && place[i + 1][j + 1] == P) { return WRONG; }
                        }
                    }
                }
            }
        }

        return 1;
    }
}

 

감사합니다.

반응형