대외교육/코딩테스트

[프로그래머스 특강]1-1. 시뮬레이션 개념과 기본 예제(웅덩이문제)

흑요석s 2023. 8. 21. 20:29

문제가 제시한 규칙에 따라 개체를 이동시키는 알고리즘.

r = row = 행

c = column = 열

 

 

dr = [-1, 0, 1, 0]  
dc = [0, 1, 0, -1]    #12시 방향에서 시계방향으로

for r in range(5):
	for c in range(5):  #2차원 배열 기본 코드
    		for k in range(4): #특정 [행,열]의 4방향 탐색
        	    nr = r + dr[k]
                    nc = c + dc[k]
                	if nr >= 0 and nr < 5 and nc >= 0 and nc <5: #정상범주 확인
            			if nums[nr][nc] <= nums[r][c]:
                			flag = False

※ 8방향 탐색방법

dr = [-1,-1,0,1,1,1,0,-1]

dc = [0,1,1,1,0,-1,-1,-1] 

 

1. 웅덩이 문제

def solution(nums):
    answer = 0
    dr = [-1, 0, 1, 0]
    dc = [0, 1, 0, -1]
    n = len(nums)
    for r in range(n):
    	for c in range(n):
        	flag = True #웅덩이
        	for k in range(4):  # [r,c] 기준 네방향 탐색
            		nr = r + dr[k]
                	nc = c + dc[k]
                	if 0 <= nr < n and 0 <= nc < n and nums[nr][nc] <= nums[r][c] : 
                    #음수일 경우 먼저 배제, 웅덩이가 아닐 조건을 탐색
                		flag = False  #웅덩이가 아님을 표시 후 다음 [r,c]로 이동
                    		break
                if flag :
                	answer += 1
    return answer

 

웅덩이라고 먼저 가정 후(flag=True), 조건문을 통해  웅덩이가 아님을 검증.

 

"상하좌우 인접한 지역의 숫자가 모두 자신보다 클 경우"

=> "상하좌우 인접한 지역의 숫자가 하나라도 자신보다 작을 경우" 로 해석하여 풀이함.

 

2.2. [프로그래머스 level0] 안전지대

https://school.programmers.co.kr/learn/courses/30/lessons/120866

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

안전한 지역의 칸수를 구해야함

=> 모든 지역을 안전하다고 가정 후, 안전하지 않은 지역 찾기(flag를 false으로)

그 후에도 flag가 True라면, 안전한 지역으로 카운트

 

def solution(board):
    dr=[-1, -1, 0, 1, 1, 1, 0, -1]
    dc=[0, 1, 1, 1, 0, -1, -1, -1]
    answer = 0
    n=len(board)
    for r in range(n):
        for c in range(n):
            flag = True     # 안전 지역으로 가정
            if board[r][c]==1:  #지뢰지역
                flag=False
            for k in range(8):	#지뢰 인접지역
                nr = r + dr[k]
                nc = c + dc[k]
                if 0 <= nr < n and 0 <= nc < n and board[nr][nc] == 1:
                    flag = False
                    break
            if flag :
                answer += 1

    return answer