본문 바로가기
알고리즘/프로그래머스

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

by KDW999 2023. 3. 24.

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

 

프로그래머스

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

programmers.co.kr

 

문제 접근

색칠해야 될 부분을 일일이 찾지 않아도 간단하게 문제를 풀 수 있을 거 같은 느낌이었는데 찾아가는 과정에서 정답 60점에서 막혀서 갈아엎고 그냥 다시 풀었다.

 

n 크기의 boolean 배열 생성 후 색칠해야될 구역은 true로 표시

반복문 돌면서 true를 발견하면 해당 인덱스부터 + m 만큼 색칠해준다.

이 색칠한 횟수를 카운팅 후 return

class Solution {
     public int solution(int n, int m, int[] section) {
	        int answer = 0;
	        
	        boolean[] wallLength = new boolean[n+1]; // 0 ~ n;
	        for(int i=0; i<section.length; i++) wallLength[section[i]] = true;
	        
	        for(int i=1; i<wallLength.length; i++) {
	        	if(wallLength[i] == true) {
	        		if(i+m > wallLength.length) {
                               for(int j=i; j<wallLength.length; j++) wallLength[j] = false;
                            }
	        		else for(int j=i; j<i+m; j++) wallLength[j] = false;
	        		
	        		answer++;
	        	}
	        }
	        return answer;
     }
}

 

다른 사람 풀이

현재 칠할 곳이 이전에 칠했던 범위에 포함되어있는지 확인하는 코드가 인상적

 

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]) { // 시작 지점도 칠해야 되서 roller + m에 - 1해줌
                cnt++;
                roller = section[i];
            }
        }
        return cnt;
    }
}

댓글