현제의 현재이야기

[SWExpertAcademy] 15612. 체스판 위의 룩 배치 본문

algorithm

[SWExpertAcademy] 15612. 체스판 위의 룩 배치

현재의 현제 2022. 11. 6. 22:23
 

SW Expert Academy

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

swexpertacademy.com

n = int(input())
result = []
for _ in range(n):
    arr = [input() for _ in range(8)]
    check_x = [0] * 8
    check_y = [0] * 8
    cnt = 0
    rst = 0
    for i in range(8):
        for j in range(8):
            if arr[i][j] == 'O':
                cnt += 1
                if check_x[j] == 1 or check_y[i] == 1 or cnt > 8:
                    result.append(0)
                    rst = 1
                    break
                else:
                    check_x[j] = 1
                    check_y[i] = 1
        if rst == 1:
            break

    if rst != 1 and cnt < 8:
        result.append(0)
    elif rst != 1 and cnt == 8:
        result.append(1)

result_cnt = 0
for target in result:
    result_cnt += 1
    if target == 0:
        print(f"#{result_cnt} no")
    else:
        print(f"#{result_cnt} yes")

| 알고리즘

  • check x, check y 배열을 만들어서 이중 for문을 통해서 그래프 탐색
  • 만약에 'O'를 만나면 cnt('O'의 개수) 하나를 추가하고 해당 좌표에 x축, y축에 이미 1이 존재하는지 확인
  • 만약 1이 존재하면 해당 직선에 (+ 로) 룩이 존재하는 것이기 때문에 result에 0을 넣어주고 rst를 1로 설정하고 break
  • 추후 이 rst는 이중 for문을 빠져나갈 때 사용
  • 만약 해당 x, y 배열에 1이 아니라 0이라면 그 곳을 1로 변경
  • for 문을 다 돈 뒤, break문을 통해 빠져나왔지 않고 룩의 개수가 8개 미만이면 result에 0을 삽입 (실패)
  • break문을 통해 빠져나왔지 않고 룩의 개수가 8개면 result에 성공을 추가

| 알게된 점

이중 for문을 빠져나올 때, rst를 활용하여 두번 빠져나오면 효과적으로 빠져나올 수 있다.

for i in range(n):
	for j in range(n):
        if j == i:
            rst = 1
            break
    if rst == 1:
    	break

이런 식으로 if의 위치를 설정한다.

삼성 문제는 처음 풀어보는데 생각보다 시간, 메모리가 넉넉한 것 같다. 

'algorithm' 카테고리의 다른 글

[SWExpertAcademy] 14692. 통나무 자르기  (0) 2022.11.19
[백준/python] 2302 - 극장 좌석  (0) 2022.11.08
[백준/python] 11047 - 동전0  (0) 2022.10.04
[백준/python] 2468 - 안전 영역  (1) 2022.10.01
[백준/python] 5430 - AC  (1) 2022.09.30
Comments