[프로그래머스] Lv1 - 덧칠하기

김멉덥·2023년 8월 5일
0

알고리즘 공부

목록 보기
78/171
post-thumbnail
post-custom-banner

문제

프로그래머스 연습문제


코드 구현

def solution(n, m, section):
    answer = 0

    wall = [1 for _ in range(n)]    # n 구역의 벽 배열 (기본으로는 다 1)

    for s in section:       # 색을 다시 칠해야 하는 부분은 0 으로 지정
        wall[s - 1] = 0

    for i in range(len(wall)):
        if (wall[i] == 0):              # 벽을 둘러면서 0인 부분을 만나면 -> 다시 칠해야함
            for j in range(i, i + m):   # 해당 섹션부터 롤러 크기가 닿는 곳까지 하나씩 칠하기
                if(j >= len(wall)):     # 만약 롤러가 벽의 크기를 벗어나면 -> 그만 칠하기
                    break
                wall[j] = 1
            answer += 1         # 페인트칠 했으니 횟수에 +1

    return answer


if __name__ == '__main__':
    print(solution(8, 4, [2, 3, 6]))
    print(solution(5, 4, [1, 3]))
    print(solution(4, 1, [1, 2, 3, 4]))
    print(solution(4, 2, [3, 4]))           # 1
    print(solution(5, 2, [1, 2, 5]))        # 2

풀이

  • 문제의 의도대로 풀진 못한 것 같다 ㅠ,ㅠ
  • wall 배열 설정 → section에 나온 다시 칠해야 하는 부분은 0으로 설정, 그 외는 1로 설정
    • ex) section = [2, 3, 6] , wall = [1, 0, 0, 1, 1, 0, 1, 1]
  • 처음에 i + m 부분에서 wall 배열의 길이보다 커지게 되어 런타임 에러가 발생하였다.
  • 따라서 wall 배열보다 크기가 큰 부분이라면 → 더 이상 칠하지 못하니 break 해주어야 한다.
  • 그 전까지는 wall[j] = 1 로 페인트칠을 해준다. → answer + 1
  • wall 배열을 다 훑고 나면 → 정답 리턴

What I learned

다른 사람 정답 코드, for문을 하나만 돌기 때문에 효율이 더 좋을 것 같다.

def solution(n, m, section):
    answer = 1
    prev = section[0]
    for sec in section:
        if sec - prev >= m:
            prev = sec
            answer += 1

    return answer

비슷한 코드인데 이 코드가 더 이해가 잘되는 것 같다.
출처 : https://beomcoder.tistory.com/52

def solution(n, m, section):
    paint, answer = section[0]-1, 0
    for v in section:
        if paint < v:
            paint = v+m-1
            answer += 1
            
    return answer
  • 범위 별로 칠하는 방법
  • paint = 페인트칠 하고 나서의 인덱스
  • 만약 칠해야하는 섹션의 인덱스가 페인트칠 할 수 있는 범위면 → 페인트칠 한다 (answer + 1) → 페인트는 칠하고 나서의 위치로 이동
profile
데굴데굴 뚝딱뚝딱 개발기록
post-custom-banner

1개의 댓글

comment-user-thumbnail
2023년 8월 5일

훌륭한 글 감사드립니다.

답글 달기