일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 어렵다
- 휴학
- level3
- level4
- 내휴학생활중의아주큰일
- SQL
- 컴퓨터비전
- 자바
- py
- java
- Python
- 다시풀기
- 프로그래머스
- androidstudio
- SWEA
- LEVEL2
- 대학원
- 대학원일기
- WebOS
- Matrix Factorization
- BFS
- 컨트리뷰톤
- level1
- git
- D3
- 파이썬
- 안드로이드스튜디오
- build
- Github
- MSBuild
- Today
- Total
bit가 눈 앞에서 왔다갔다
Py) SWEA 15612 체스판 위의 룩 배치 본문
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'],....] 이렇게 되어버림