[SWEA] #1220 Magnetic
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