1 분 소요

SWEA #1220 Level : 💣💣💣


✍Logic

테이블 위에서 자성체들이 각각의 극성에 따라 움직인 후 최종에 교착상태인 자성체들의 수를 출력하는 문제.

실제로 N,S 자성체를 옮긴다고 생각하지 않고 문제를 풀 수 있는 규칙을 찾음.

입력된 리스트에서 N자성체(1)와 S자성체(2)가 교차하는 부분의 개수만 세어주면 됨.

각 열마다 검색을 해서 idx 0번 줄부터 N-1번 줄 순으로 1과 2가 번갈아 놓인 횟수를 세줌.


💻Code


for tc in range(1, 11):
    N = int(input())
    square = [list(map(int, input().split())) for _ in range(N)]
    ans = 0

    # 열(j): 0 -> N 순서로 해당 행(i) 검색
    for j in range(N):
        # 행(i): 0 -> N 순서로 검색
        i = 0
        while i < N:
            if square[i][j] == 1:           # 1을 발견하면?
                for k in range(i + 1, N):   # 1 아래에 2가 있는지 검색
                    if square[k][j] == 2:   # 2가 나오면?(== 교착 O)
                        ans += 1                # 교착상태 +1
                        i = k                   # 2 아래부터 다시 검색
                        break
                else:                       # 2가 안나오면?(== 교착 X)
                    break                       # 다음 열(j)검사하기
            i += 1

    print(f'#{tc} {ans}')

🙋‍♀️REF

(thx to Jupearl)

같은 로직.

하지만 구현방식에서 훨씬 쉽게 푼 풀이.

zip()을 활용해서 각 열을 하나의 리스트로 만듬.

idx라는 변수를 이용해 True와 False를 번갈아 가면서 저장.

그 때마다 횟수를 세어 최종 출력.

zip()의 활약이 두드러진 코드이며, idx라는 버튼(?)을 계속 키고 끄는 모습이 그려지는 코드였음.

열 또는 행 별로 검색을 해야하는 코드에서 효과적으로 활용할 수 있는 코드라고 생각됨.


table = [input().split() for _ in range(100)]
`table_rev = list(zip(*table))`

cnt = 0
for i in range(100):
    idx = False
    for j in range(100):
        if table_rev[i][j] == '1':
            idx = True
        if table_rev[i][j] == '2' and idx:
            cnt += 1
            idx = False

카테고리:

업데이트: