https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV14hwZqABsCFAYD
약간 무식하게 푼 문제...
발상은 이러하다)
세로 줄으로 봤을때, 가장 위쪽에 있는 자성체가 S극이면 자성체는 사라진다.
가장 아래쪽에 있는 자성체가 N극이면 자성체가 사라진다.
교착상태가 생기려면, 위쪽 자성체가 N극이고, 아래쪽 자성체가 S극인 상태가 하나 이상 있어야 한다.
그래서 일단 세로 줄을 하나씩 확인했다.
for tc in range(1, 11):
N = int(input())
arr = [list(map(int, input().split())) for _ in range(N)]
cross_nums = 0
for i in range(N):
checkCol =[]
for j in range(N):
checkCol.append(arr[j][i])
checkCol이라는 배열 안에 각 세로줄을 append 했다
(이 한 줄씩 확인한다는 뜻)
그리고 이 배열을 0번째 index부터 끝까지 한번,
끝에서부터 0번째까지 한번 해서 총 두번 탐색한다.
0번째에서 탐색할때, 제일 처음 만나는 자석이 S극이면 N극으로 달라붙어서 떨어지게 된다.
근데 N극이면 안그런다.
따라서,
checkCol[i]의 값이 1일때를 제외하고는 다 빈칸이 되니까 0으로 바꿔준다.
for i in range(N):
if checkCol[i] == 1:
break
else:
checkCol[i] = 0
continue
for j in range(N-1, -1, -1):
if checkCol[j] == 2:
break
else:
checkCol[j] = 0
continue
이 for문을 두번 돌면,
교착상태가 일어날 수 있는 자성체들만 테이블 위에 남는 것을 확인할 수 있다.
마지막으로 교착상태의 수를 세어주면 된다.
N극을 만났을 때(1일때), 그 다음으로 만나는 자성체가 2이면 cross_nums에 1을 추가하면 된다.
for i in range(N):
if checkCol[i] == 1:
for j in range(i+1, N):
if checkCol[j] == 2:
checkCol[j] = 9
cross_nums += 1
break
elif checkCol[j] == 9:
break
print(f'#{tc} {cross_nums}')
전체 풀이)
for tc in range(1, 11):
N = int(input())
arr = [list(map(int, input().split())) for _ in range(N)]
cross_nums = 0
for i in range(N):
checkCol =[]
for j in range(N):
checkCol.append(arr[j][i])
for i in range(N):
if checkCol[i] == 1:
break
else:
checkCol[i] = 0
continue
for j in range(N-1, -1, -1):
if checkCol[j] == 2:
break
else:
checkCol[j] = 0
continue
for i in range(N):
if checkCol[i] == 1:
for j in range(i+1, N):
if checkCol[j] == 2:
checkCol[j] = 9
cross_nums += 1
break
elif checkCol[j] == 9:
break
print(f'#{tc} {cross_nums}')
'파이썬 알고리즘' 카테고리의 다른 글
[파이썬] SWEA 문제해결 1일차 - View (0) | 2022.12.07 |
---|---|
[파이썬] SWEA 파스칼의 삼각형 (0) | 2022.12.07 |
[파이썬] 백준 15649 N과 M (1) (0) | 2022.12.06 |
[파이썬] 백준 11047 동전 0 (0) | 2022.12.06 |
[파이썬] 백준 1436 영화감독 숌 (부르트포스) (0) | 2022.11.30 |