SWEA (SW Expert Academy)/D3

[SWEA/D3] 15612 체스판 위의 룩 위치

hellosonic 2023. 3. 19. 13:54

문제 바로가기

 

SW Expert Academy

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

swexpertacademy.com

나의 코드 및 설명 (맞았습니다!!)

 

  • 어떠한 행에 룩이 있다면, 룩의 위치를 기준으로 밑의 열을 확인한다. 만약 룩이 있다면, 룩이 있을 때 마다 임시로 초기화해둔 temp_ok 값을 1만큼 증가시킨다. 8열까지 확인 후, temp_ok에 1이 저장되어 있다면, 그 행에는 룩이 현재 위치 밖에 없는 것이므로, ok를 1 증가시킨다.
  • 이 후 반복적으로 1열~8열까지 같은 방법으로 확인한다. 만약 8열 문제의 조건들을 만족한다면, ok 값은 8이 될 것이고, yes를 출력한다.

t = int(input())

for test_case in range(1, t+1):
    chess = []
    ok = 0
    temp_ok = 0
    #입력받은 체스판 채우기
    for i in range(8):
        chess.append(list(input()))
    #체스판 좌표 하나하나 살펴보기   
    #y축 중 x좌표에 해당하는 체스판 정보를 확인
    for i in range(8): #Y측 
        for j in range(8): #x측 
        	#임시 값, 현재 위치의 y좌표값을 변동 시키면서 확인하기 위함.
            temp_ok = 0
			#특정 열에 놓인 룩의 개수가 한 개일 때만
            if chess[i].count("O") == 1: 
            	#특정 열/ 행(가로,세로) 좌표에 해당하는 룩이 있는 칸에서
                if chess[i][j] == "O": 
                	#현재 칸 포함, 8열까지 살펴본다.
                    for k in range(i,8):
                    	#만약 룩이 또 있다면
                        if chess[k][j] == "O":
                        	#사전에 초기화해둔 임시 값을 1씩 증가시킨다.
                            temp_ok += 1
                    #임시 값이 1이라면(현재 칸 빼고는 룩이 놓여져있지 않다면)
                    if temp_ok == 1:
                    	#ok에 1씩 증가시킨다.
                        ok += 1
                else:
                    continue
    if ok == 8:
        print("#{} {}".format(test_case, "yes"))
        
    else:
        print("#{} {}".format(test_case, "no"))

나의 코드 및 설명 (테스트케이스 65개 중 42개만 맞은 코드)

  • 처음에 접근했던 풀이 방식으로, 주어진 문제의 조건들을 다 만족하지 못하여 실패가 난 코드이다. 체스판 위에 룩이 있는지 행과 열 따로따로 비교하였고, 행 기준으로 룩이 하나씩 놓여져 있는지 확인, 열 기준으로 룩이 하나씩 놓여져 있는지 확인, 그 후 if조건의 and 연산자로 묶어서 행과 열 모두 룩이 하나씩 놓여져 있다면 yes를 출력했다.
  • 문제의 조건들을 다 만족하지 못해서 풀이에 실패하였고, 결국 다른 방법을 찾다가 위의 방법으로 문제를 해결하였다.
garo_ok = 0
sero_ok = 0
sero = 0
def check():
    global garo_ok, sero_ok, sero
    #가로 체크 
    garo_ok = 0
    for i in range(8):
        if chess[i].count("O") == 1:
            garo_ok += 1
        else:
            continue
    #세로 체크
    for i in range(8):
        sero = 0
        for j in range(8):
            if chess[j][i] == "O":
                sero += 1
        if sero == 1:
            sero_ok += 1
    if garo_ok == 8 and sero_ok == 8:
        return True
    else:
        return False

t = int(input())

for test_case in range(1, t+1):
    chess = []
    rook = 0
    for i in range(8):
        chess.append(list(input()))
    for i in range(8):
        rook += chess[i].count("O")
    if rook == 8 and check() == True:
        print("#{} {}".format(test_case, "yes"))
    else:
        print("#{} {}".format(test_case, "no"))

피드백

처음에 접근했던 풀이 방법이 틀리자 다른 방법을 찾아 문제를 해결했는데, 내 힘으로 풀게되어 엄청 뿌듯했다. 앞으로 비슷한 문제가 나올 경우에도 for문을 여러 개 사용할 때 값을 임시로 저장할 변수를 초기화하는 방법을 사용해야겠다.