Notice
Recent Posts
Recent Comments
Link
«   2025/10   »
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 29 30 31
Archives
Today
Total
관리 메뉴

언어 전공자의 NLP 로그

[구름톤 챌린지] 구름 찾기 깃발 본문

코딩테스트

[구름톤 챌린지] 구름 찾기 깃발

JohnnyNLP 2023. 8. 22. 23:56

https://level.goorm.io/exam/195689/%EA%B5%AC%EB%A6%84-%EC%B0%BE%EA%B8%B0-%EA%B9%83%EB%B0%9C/quiz/1

 

구름LEVEL

난이도별 다양한 문제를 해결함으로써 SW 역량을 향상시킬 수 있습니다.

level.goorm.io

n, k = map(int, input().split())
m = []
dic = {}

# 매트릭스 받아오기
for i in range(n):
	m.append(list(map(int, input().split())))

# k값과 그 개수를 담을 딕셔너리
for i in range(0, 9):
    dic[i]=0

# 매트릭스 m을 0으로 한 겹 둘러싼다.
padded_m = [[0]*(n+2)]
for i in m:
	padded_m += [[0]+i+[0]]
padded_m += [[0]*(n+2)]
		
# 경계 행/렬을 제외한 가운뎃부분은 8곳을 모두 참조할 수 있다.
for r in range(1, n+1):
	for c in range(1, n+1):

		if padded_m[r][c] != 1:
			# (r+1, c+1) 지점 주변 8곳을 참조하고 그 값을 temp에 더해준다.
			
			temp = 0
			temp += padded_m[r-1][c-1]
			temp += padded_m[r][c-1]
			temp += padded_m[r+1][c-1]
			temp += padded_m[r-1][c]
			temp += padded_m[r+1][c]
			temp += padded_m[r-1][c+1]
			temp += padded_m[r][c+1]
			temp += padded_m[r+1][c+1]

			dic[temp] += 1
		
print(dic[k])

예시 입력 1)

4 2

0 0 0 1

0 0 1 0

0 0 1 0

0 1 1 0

 

예시 입력 2)

5 8

0 1 1 1 1

0 1 0 1 0

0 1 1 1 1

0 1 1 0 1

0 1 0 1 0

 

흡사 지뢰 찾기 게임과 같은 문제이다.

자신을 둘러싸고 있는 8개의 칸 속 값을 참조한다.

이때 나올 수 있는 값은 0에서 8으로 한정된다.

따라서 각 셀마다 주변 값을 계산하고, 이를 딕셔너리 형태에 +=1 해주면 해당 값의 총 빈도수를 알게 된다.

 

다만 모든 셀이 8개로 둘러 있는 건 아니다.

특히 가장자리를 둘러싸고 있는 자리의 연산이 골치아팠다.

 

예를 들어

0번 row의 경우, -1번 row를 참조하게 되면 거꾸로 n-1번 row를 참조하여 계산이 오류가 나고,

n-1번 row의 경우, n번 row를 참조하게 되면 out of index error가 난다.

 

모든 케이스를 나누어 값을 계산해보는 방법도 시도해봤으나

뭔가 계산이 오류가 나서 일부 문제에서 오답이 났다.

 

그러던 중, 어차피 값이 0인 cell은 연산에 영향을 주지 않는다는 점에 착안하여

매트릭스 전체를 0으로 감싸보자는 아이디어가 떠올랐다.

그러면 예외 처리를 해주지 않아도 되어 코드 전체가 훨씬 간결해지고,

제출 결과도 막힘 없이 모두 정답을 낼 수 있다.

'코딩테스트' 카테고리의 다른 글

[그리디] ATM - 백준 11399번  (0) 2023.09.21
[그리디] 설탕 배달 - 백준 2839  (0) 2023.09.19
[구름톤 챌린지] 이진수 정렬  (0) 2023.08.18
[큐] 프로세스  (0) 2023.08.17
[스택] 올바른 괄호  (0) 2023.08.16