본문 바로가기

Java/프로그래머스

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

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

 

프로그래머스

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

programmers.co.kr

 

 

 

 

 

 

 

 

[프로그래머스] 덧칠하기 - 자바(Java) (tistory.com)

 

[프로그래머스] 덧칠하기 - 자바(Java)

문제 링크 https://school.programmers.co.kr/learn/courses/30/lessons/161989 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁

ittrue.tistory.com

 

- section[0] 구역부터 시작하여 m-1까지 한번에 칠할 수 있다.

- 다시 칠하기로 한 영역(point)이 한 번에 칠할 수 있는 영역을 벗어나면 한 번 더 칠해야 한다. 

- section 배열을 순회하여 point가 size보다 큰 지 판단한다. 

- point가 size보다 작거나 같은 경우 한 번에 칠할 수 있는 영역 안에 속하므로 다시 칠하지 않아도 된다. 

- point가 한 번에 칠할 수 있는 영역 size를 벗어나면 한 번 더 칠해야 한다, (answer++)

- 다시 칠해야 하는 지점 point부터 m-1까지 한 번에 다시 칠할 수 있다. (size = point+m-1)

 

정답 

 

class Solution {
    public int solution(int n, int m, int[] section) {
        int answer = 1;
        
        //롤러 크기
        int size = section[0]+m-1;
        
        for(int point : section)
        {
            //point가 한 번에 칠할 수 있는 영역보다 크면 
            if(point>size)
            {
                //한번 더 칠하기 
                answer++;
                //한 번에 칠할 수 있는 영역 갱신
                size = point+m-1;
            }
        }
        return answer;
    }
}

 

 

 

다른 사람의 풀이 

 

1)

class Solution {
    public int solution(int n, int m, int[] section) {
        int roller = section[0];
        int cnt = 1;
        for(int i = 1; i < section.length; i++) {
            if(roller + m - 1 < section[i]) {
                cnt++;
                roller = section[i];
            }
        }
        return cnt;
    }
}

 

 

2)

 

class Solution {
    public int solution(int n, int m, int[] section) {
        int maxPainted = 0, cntPaint = 0;
        for (int point : section) {
            if (maxPainted <= point) {
                maxPainted = point + m;
                cntPaint++;
            }
        }
        return cntPaint;
    }
}