1) 문제
클릭▼
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





2) 코드
(개인적으로 좋아하는 다른 사람 코드)
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 이다.
'코딩 연습' 카테고리의 다른 글
[프로그래머스] K번째수 (python) (0) | 2022.06.15 |
---|---|
[카카오] 1차 비밀지도 (python) (0) | 2022.06.06 |
[프로그래머스] 체육복 (python) (0) | 2022.05.10 |
[카카오] 1차 다트 게임 (python) (0) | 2022.05.04 |
[프로그래머스] 내적 (python) (0) | 2022.04.28 |