for i, j, k in commands:
answer.append(list(sorted(array[i-1:j]))[k-1])
# commands 에서 i, j, k 를 출력해보자.
# 이해하기 쉽게 i, j, k 를 하나씩 출력해보자.
# answer.append(list(sorted(array[i-1:j]))[k-1]) 를 쪼개서 살펴보면 우선 array를 [k-1:j] 로 슬라이싱 해서 출력해보자.
# i-1로 하는 이유는 인덱스는 0부터 시작하므로 array = [1, 5, 2, 6, 3, 7, 4] 에서 2번째 숫자는 5이고 인덱스로 나타면 array[1]의 위치이기 때문에 i-1로 슬라이싱 한다. # j는 -1을 하지 않는 이유는 슬라이싱 할때 만약 array[1:5] 라면 밑에 그림과 같이array 1번째 ~ 4번째 까지 출력되기 때문에 j에는 -1을 할 필요가 없다.
# sorted() 함수는 숫자를 순서대로 정렬해주는 함수이다.
# 슬라이싱한 리스트에서 [k-1] 번째 숫자를 출력한다. i와 마찬가지로 -1을 해준다.
# 위의 출력 결과를 좀 더 쉽게 설명하면 슬라이싱해서 sorted() 한 결과 [2, 3, 5, 6]를 apple 변수에 넣고 apple의 [k-1]번째 즉, apple[2]의 결과를 출력하라는 의미이다.
defsolution(places):
answer = []
for p in places:
key = False
nowArr = []
for n in p:
nowArr.append(list(n))
for i inrange(5):
if key:
break;
for j inrange(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<5and 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<5and 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 inrange(5):
if key:
break;
for j inrange(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<5and 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<5and 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 이다.