bit가 눈 앞에서 왔다갔다

Py) SWEA 15612 체스판 위의 룩 배치 본문

카테고리 없음

Py) SWEA 15612 체스판 위의 룩 배치

헬린인형 2022. 11. 9. 18:26

https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=3&contestProbId=AYOBfxwaAXsDFATW&categoryId=AYOBfxwaAXsDFATW&categoryType=CODE&problemTitle=&orderBy=FIRST_REG_DATETIME&selectCodeLang=PYTHON&select-1=3&pageSize=10&pageIndex=1 

 

SW Expert Academy

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

swexpertacademy.com

 

1차(성공): 38분

 

0. 입출력

 

1. 김예고리즘

1-1. 알고리즘
1) 원본 리스트를 반영해 O -> 1, . -> 0으로 이루어진 2차원 리스트 하나 만든다
     (그닥 필요하지 않은 것 같지만 그래도 어제 푼 문제, 코드랑 비슷해서 일단 그대로 가봄)
2) check 함수 (이것도 그냥 그대로 해봄)에서 1이 발견된 좌표를 기준으로 행, 열을 비교해본다
3) 다른 룩이 있다면 return 'no'

 

1-1-1. 중간 피드백, 생각하지 못한 부분

##########1차 틀림##########
# 숫자로 바꿨는데 여전히 문자로 비교하고 있었음.. 박제.. '1'도 마찬가지임..
# if blist[i][j] == 'O':      # 행, 열을 모두 검사해야함
#     for x in range(i+1, N):
#         if blist[x][j] == 'O': 
#             return 'no'
#     for y in range(j+1, N):
#         if blist[i][y] == 'O': 
#             return 'no'
# else: continue

##########2차 틀림##########
if blist[i][j] == 1:      # 행, 열을 모두 검사해야함
    for x in range(i+1, N):
        if blist[x][j] == 1:
            return 'no'
    for y in range(j+1, N):
        if blist[i][y] == '1': 
            return 'no'
else: continue

1) 1, 0으로 바꿔서 리스트를 넘겼는데 'O'를 찾고 있었다. 당연히 조건식 안들어가고 return yes가 나오겠죠
2) 숫자로 바꾼답시고 O만 지워서 '1'을 찾고 있었다. ㅎ..
3) 테스트 케이스 잘 좀 보자. 3번 테케를 보니 내가 생각하고 있던 방식대로 하면 안먹힌다는 것을 -> 아니야, 애초에 x,y를 잘 해줬으면 기존 생각도 틀릴 일 없었다.
4) 문제 잘 좀 보자. 아예 없으면 안된다는 것, 정확히 8개여야 한다는 것을 고려 안해줬다ㅠ
5) 그 밖에도 result = check(blist, N)를 반복문 안에 넣어버리는 멋진 짓도 했다. 난 멋져.

이와 같은 과정을 거치다가 알고리즘을 좀 수정했다.
다른 룩이 있으면 그 즉시 return을 했는데, 그것보다는 행, 열의 룩 개수를 세고 1개를 초과할 경우 return no를 하도록 코딩하는게 더 나은거 같았다.

 

1-2. 코드 (정답)

def check(blist, N):
    for i in range(N):
        for j in range(N):
            if blist[i][j] == 1:
                r = 0
                c = 0
                for x in range(j+1, N):
                    if blist[i][x] == 1:    # 행 검사
                        r += 1
                    if r > 0: return 'no'
                for y in range(i+1, N):     # 열 검사
                    if blist[y][j] == 1:
                        c += 1
                    if c > 0: return 'no'
    return 'yes'

t = int(input())

for case in range(1, t+1):
    N = 8
    rook = 0
    blist = [[0 for _ in range(8)] for _ in range(8)]

    for i in range(N):
        comp = list(input().split())
        for j in range(N):
            if comp[0][j] == 'O':      # 1차원 리스트에서 '..'은 하나로 인식된다. . 하나 .하나 이렇게 안됨
                blist[i][j] = 1
                rook += 1
                
    if rook == 0 or rook != 8: 
        result = 'no'
    else:
        result = check(blist, N)            # blist를 반복문 안에서 넣어버림...

    print('#{} {}'.format(case, result))

 

1-2-1. 내가 하고 싶은데로 다시 푼 코드 -> 테스트 케이스 65개 중 58개만 맞는다고 뜬다..

t = int(input())

for case in range(1, t+1):
    rook = 0
    blist = [input() for _ in range(8)]
    answer = 'yes'
    for x in range(0, 8):
        for y in range(0, 8):
            if blist[x][y] == 'O':      # rook 발견
                cx = 0
                cy = 0                  # 해당 스팟부터 확인한다.
                for check in range(y, 8):     # row 확인
                    if blist[x][check] == 'O':
                        cx += 1
                for check in range(x, 8):
                    if blist[check][y] == 'O':
                        cy += 1
                if cx > 1 or cy > 1:
                    answer = 'no'
                    break
        if answer == 'no':
            break
    
    for i in range(8):
        rook += blist[i].count('O')
    # print(rook)
            
    if rook != 8: 
        result = 'no'

    print('#{} {}'.format(case, answer))

룩을 안세어줘서 그런가 해서 다시 해봤지만 그것도 아니었다. -> answer인데 result라고 해줘서 틀린거였음.

 

2. 피드백 (치명적이라 따로 빼기)
1)

for x in range(j+1, N):
    if blist[i][x] == 1:    # 행 검사
        r += 1
    if r > 0: return 'no'
for y in range(i+1, N):     # 열 검사
    if blist[y][j] == 1:
        c += 1
    if c > 0: return 'no'

여기서 blist[i][x]를 blist[x][i]로, blist[y][j]를 blist[j][y]로 적어버림..
1번 테케 첫번째 라인에서 O가 6번 인덱스에서 발견되는데 (좌표로 생각하면 (0, 6)) 그 6을 행에 넣었으니 의도하지 않은 방향으로 검사가 진행되고 이상해짐.

 

2) 문자열로 된 리스트 받기

blist = [input() for _ in range(8)]

결과: ['......O.', '.......O', '...O....', 'O.......', '....O...', '..O.....', '.O......', '.....O..']

이 상태로 2차원 리스트 접근하듯 접근하면 되는데 2차원 리스트 받는 식으로 해버려서
[['......O.'], ['.......O'],....] 이렇게 되어버림

 

 

풀었는데 다르게 또 풀고 될때까지 계속 푼 나 자신 멋져.

 

반응형
Comments