파이썬 알고리즘

[파이썬] SW 문제해결 기본 5일차 - Magnetic

뜻 지, 깨달음 오 2022. 12. 7. 20:10

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV14hwZqABsCFAYD 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

 

약간 무식하게 푼 문제... 

발상은 이러하다)

세로 줄으로 봤을때, 가장 위쪽에 있는 자성체가 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}')