1) 문제

클릭▼


2) 코드

 (개인적으로 좋아하는 다른 사람 코드)

출처 : https://velog.io/@fftl/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EA%B1%B0%EB%A6%AC%EB%91%90%EA%B8%B0-%ED%99%95%EC%9D%B8%ED%95%98%EA%B8%B0-%ED%8C%8C%EC%9D%B4%EC%8D%AC 

 

def solution(places):
    answer = []
    for p in places:
        key = False
        nowArr = []
        for n in p:
            nowArr.append(list(n))
        for i in range(5):
            if key:
                break;
            for j in range(5):
                if key:
                    break;
                if nowArr[i][j] == "P":
                    if i+1<5:
                        if nowArr[i+1][j] == "P":
                            key = True;
                            break;
                        elif nowArr[i+1][j] == "O":
                            if i+2<5:
                                if nowArr[i+2][j] == "P":
                                    key = True;
                                    break;
                    if j+1<5:
                        if nowArr[i][j+1] == "P":
                            key = True;
                            break;
                        if nowArr[i][j+1] == "O":
                            if j+2<5:
                                if nowArr[i][j+2] == "P":
                                    key = True;
                                    break;
                    if i+1<5 and j+1<5:
                            if nowArr[i+1][j+1] == "P" and (nowArr[i+1][j] == "O" or nowArr[i][j+1] == "O"):
                                key = True;
                                break;
                    if i+1<5 and j-1>=0:
                            if nowArr[i+1][j-1] == "P" and (nowArr[i+1][j] == "O" or nowArr[i][j-1] == "O"):
                                key = True;
                                break;
        if key:
            answer.append(0);
        else:
            answer.append(1);
                                             
    return answer

3) 결과


3) 코드 설명

    for p in places:
        key = False
        nowArr = []
        for n in p:
            nowArr.append(list(n))

 

- key는 거리두기가 지켜지지 않음을 확인하면 바로 반복을 멈추기 위해 사용되고 처음에는 False로 둔다. 

  ( key = True는 거리두기가 지켜지고 있지 않다. key = False 거리두기가 잘 지켜지고 있다. )

- places의 요소를 하나씩 꺼내보면 아래의 결과가 나온다.

 

 

 

 

- p의 요소를 하나씩 꺼내서 nowArr에 넣고 결과를 출력하면 아래와 같이 나온다. 

 

 

 

- 하지만 우리는 알파벳 하나씩을 사용해야 하기때문에 리스트 형식으로 nowArr에 넣어야 한다.

 

 

- 그럼 첫번째 줄 부터 matrix 형태로 나타내보자.

 

 

 

 

        for i in range(5):
            if key:
                break;
            for j in range(5):
                if key:
                    break;

 

- i = 0, 1, 2, 3, 4 그리고 j = 0, 1, 2, 3, 4 를 사용하면 for문을 돌린다

- 만약에 key가 있다면 ( key = True ) break를 하라고 했지만 현재는 False 이므로 for문을 돌린다.

 

                if nowArr[i][j] == "P":
                    if i+1<5:
                        if nowArr[i+1][j] == "P":
                            key = True;
                            break;
                        elif nowArr[i+1][j] == "O":
                            if i+2<5:
                                if nowArr[i+2][j] == "P":
                                    key = True;
                                    break;
                    if j+1<5:
                        if nowArr[i][j+1] == "P":
                            key = True;
                            break;
                        if nowArr[i][j+1] == "O":
                            if j+2<5:
                                if nowArr[i][j+2] == "P":
                                    key = True;
                                    break;
                    if i+1<5 and j+1<5:
                            if nowArr[i+1][j+1] == "P" and (nowArr[i+1][j] == "O" or nowArr[i][j+1] == "O"):
                                key = True;
                                break;
                    if i+1<5 and j-1>=0:
                            if nowArr[i+1][j-1] == "P" and (nowArr[i+1][j] == "O" or nowArr[i][j-1] == "O"):
                                key = True;
                                break;

 

 

- if nowArr[i][j] == "P" 이면 그 뒤로 오는 for문을 돌린다.

- i = 0, j = 0 을 넣고 nowArr[0][0] 값을 확인한다.

 

 

 

 

 

 

- 위의 표와 같이 nowArr[0][0] 값은 "P" 이다. 그럼 i = 0, j = 0 을 가지고 for문을 돌린다.

 

 

 

 

- 위에 그림에서 을 보면 0 + 1 < 5 가 성립하므로 로 간다.

- 의 결과를 보면 nowArr[0+1][0] 는 "P"가 아니므로 elif로 간다.

- 의 결과를 보면  nowArr[0+1][0] == "O" 이므로 로 간다.

- 에서 0 + 2 < 5가 성립하지만 nowArr[0+2][0] 은 "P" 가 아니라 "O" 이므로 key는 바뀌지 않고 False 이다.

 

 

 

 

- 위에 그림에서을 보면 0 + 1 < 5 가 성립하므로 로 간다.

- 의 결과를 보면 nowArr[0][0+1] 는 "P"가 아니므로 로 간다.

- 의 결과를 보면  nowArr[0][0+1] == "O" 이므로 로 간다.

- 에서 0 + 2 < 5가 성립하므로 nowArr[0][0+2] 은 "P" 가 아니라 "O" 이므로 key는 바뀌지 않고 False 이다.

 

 

 

- 위에 그림에서 을 보면 i = 0, j = 0 이므로 0 + 1 < 5, 0 + 1 < 5가 성립한다. 으로 간다. 

- 을 보면 nowArr[0+1][0+1]의 값이 "P"가 아니므로 로 간다. 

- 에서 0 + 1 < 5 and 0 -1 >= 0 이 성립하지 않으므로 로 가지 않는다. 

- key는 바뀌지 않고 False 이다.

★★

- 사실 ⑨ ~ ⑫ 코드는 좌측 제일 밑 부분과 우측 제일 밑 부분을 위한 코드이다. (밑에 노란색 부분)

 

 

 

- 예를들어 ↓ 리스트의 녹색 부분을 보면 nowArr[3][3] == "P" 이고 대각선으로 nowArr[4][4] == "P" 이므로 

  거리두기가 지켜지지 않았다.

 

 

 

- 자 그럼 i = 3, j = 3으로 for문을 돌려보자.

 

 

 

 

- 위에 그림에서 을 보면 3 + 1 < 5 가 성립하므로 로 간다.

- 의 결과를 보면 nowArr[3+1][3] 는 "P"가 아니므로  elif로 간다.

- 의 결과를 보면  nowArr[3+1][3] == "O" 이므로 로 간다.

- 에서 3 + 2 < 5가 성립하지 않으므로 밑에 if문이 돌아가지 않고 key는 바뀌지 않고 False 이다.

 

 

 

 

- 위에 그림에서 을 보면 3 + 1 < 5 가 성립하므로 로 간다.

- 의 결과를 보면 nowArr[3][3+1] 는 "P"가 아니므로 로 간다.

- 의 결과를 보면  nowArr[3][3+1] == "O" 이므로 로 간다.

- 에서 3 + 2 < 5가 성립하지 않으므로 밑에 if문이 돌아가지 않고 key는 바뀌지 않고 False 이다.

- 여기까지만 보면 이 리스트가 거리두기가 지켜지지 않고 있다는것을 찾아 낼 수가 없다.

 

 

 

 

- 위에 그림에서 을 보면 3 + 1 < 5, 3 + 1 < 5가 성립한다. 으로 간다. 

- 을 보면 nowArr[3+1][3+1]의 값이 "P"이고  nowArr[3+1][3] == "O", nowArr[3][3+1] == "O" 이므로

   여기서 key = True로 바뀌면서 break가 걸렸다. 

 

- 그럼 이제 i = 0, j = 0일때는 끝나고 i = 0, j = 1 부터 다시 보도록 하자.

 

 

 

- i = 0, j = 4 일때 "P" 이므로 i = 0, j = 4 을 이용하여 계산해보자.

 

 

 

 

- 위에 그림에서 을 보면 0 + 1 < 5 가 성립하므로 로 간다.

- 의 결과를 보면 nowArr[0+1][4] 는 "P"가 아니므로  elif로 간다.

- 의 결과를 보면  nowArr[0+1][4] 는 "O" 이므로 로 가지않는다.

- key는 바뀌지 않고 False 이다.

 

 

 

 

- 위에 그림에서 을 보면 j = 4 이므로 4 + 1 < 5 가 성립하지 않아 ⑧ 로 가지 않는다.

- key는 바뀌지 않고 False 이다.

 

 

 

 

- 위에 그림에서 을 보면 j = 4 이므로 4 + 1 < 5가 성립되지 않는다. 으로 가지않고 로 간다. 

- ⑪ 에서 0 + 1 < 5 and 4 -1 >= 0 이 성립하므로 로 간다.

- 의 결과를 보면 nowAr[i+1][j-1]의 값이 "P" 가 아니므로 key는 바뀌지 않고 False 이다.

 

 

+ Recent posts