본문 바로가기
프로그래머스/C

[프로그래머스/C]프로그래머스 Level 2 : 거리두기 확인하기 C언어

by starfish22 2022. 7. 12.
728x90

▶문제 : 코딩테스트 연습 - 거리두기 확인하기 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

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

programmers.co.kr

 

▶코드 작성

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

// places_rows는 2차원 배열 places의 행 길이, places_cols는 2차원 배열 places의 열 길이입니다.
int *solution(const char ***places, size_t places_rows, size_t places_cols) {
    int *answer = (int *)malloc(5 * sizeof(int));
    char **room;//대기실
    bool t;//거리두기 지킴 : true , 거리두기 지키지 않음 : false

    for (int i = 0; i < 5; i++) {
        room = places[i];//대기실 하나씩 확인
        t = true;
        for (int j = 0; j < 5 && t == true; j++) {
            for (int l = 0; l < 5 && t == true; l++) {
                if (room[j][l] == 'P') {//사람을 발견했다면
                    if (l <= 3 && room[j][l + 1] != 'X') {//오른쪽이 막히지 않았을 때
                        if (room[j][l + 1] == 'P' || l <= 2 && room[j][l + 2] == 'P' || j <= 3 && room[j + 1][l + 1] == 'P' || j >= 1 && room[j - 1][l + 1] == 'P') {
                            //오른쪽에 사람이 있다면 ||     오른쪽옆에 사람이 있다면     ||     오른대각선 아래에 사람이 있다면     ||   오른대각선 위에 사람이 있다면
                            t = false;
                            break;
                        }
                    }
                    if (j <= 3 && room[j + 1][l] != 'X') {//아래쪽이 막히지 않았을 때
                        if (room[j + 1][l] == 'P' || j <= 2 && room[j + 2][l] == 'P' || l <= 3 && room[j + 1][l + 1] == 'P') {
                            //아래에 사람이 있다면  ||     아래아래에 사람이 있다면     ||   오른대각선 아래에 사람이 있다면
                            t = false;
                            break;
                        }
                    }
                    if (l >= 1 && j <= 3 && room[j][l - 1] != 'X' && room[j + 1][l - 1] == 'P') {
                        //왼쪽이 막히지 않고 왼대각선 아래에 사람이 있다면
                        t = false;
                        break;
                    }
                    l++;//오른쪽을 확인했으므로 한칸 더 옮겨도 무관함
                }
            }
        }
        if (t == true) answer[i] = 1;
        else answer[i] = 0;
    }

    return answer;
}

 

▶해석

다양한 상황에 따라 통과 유무가 갈려서 이건 for문으로 전체 탐색을 하여 if문으로 잡아내야겠다는 생각을 하였다.

for문으로 사람을 찾고, 그 사람을 중심으로 오른쪽, 아래쪽, 왼쪽 순으로 모든 경우의 수를 조건에 넣었다.

if문이 끝나면 l++ 가 실행되는데 오른쪽은 검사를 했으므로 넘어가도 되기에 빠르게 다음으로 넘어갔다.

 

(if문 세가지 중 마지막 if문을 찾는 데까지 오래 걸렸다. for문으로 찾는 방향이 오른쪽으로 가면서 점차 아래로 향하므로 오른쪽과 아래를 중점으로 조건문을 세웠지만 OP, XP라는 예외상황이 있었다. 오른쪽은 가지 못하고 아래쪽은 X로 막혀있어 이 부분을 잡아내지 못하였다.)

728x90

댓글