[Java] 덧칠하기 - Lv2 프로그래머스코딩테스트/프로그래머스2023. 3. 3. 16:04
Table of Contents
728x90
728x90
https://school.programmers.co.kr/learn/courses/30/lessons/161989
문제 접근
n은 전체길이, m은 한번 칠 할 수 있는 최대 길이, section은 칠해야 하는 곳이다.
한번 페인트를 칠하려고 벽에 갖다 대면 최대 길이만큼 무조건 칠해야한다. m=4이면 반드시 연속된 4미터를 칠해야한다.
m이 4일 때, 시작지점이 2라면, 2,3,4,5 네 칸을 칠할 수 있다. m > 현재위치 - 시작위치 까지 한번에 칠할 수 있다.
풀이
배열을 단순히 배열의 처음부터 탐색하여 풀이를 진행해 보았다.
cal메서드를 재귀호출 하려고 시도해보았으나, 아직 사용이 미숙하여 while문 안에서 색칠을 다 할때까지 돌렸다..
import java.util.ArrayList;
import java.util.List;
class Solution2 {
public int solution(int n, int m, int[] section) {
int answer = 0;
List<Integer> list = new ArrayList<>(section.length);
for(int i : section) {
list.add(i);
}
List<Integer> list2 = new ArrayList<>();
boolean a = true;
while(a) {
list2 = cal(list, m);
answer ++;
if(list2.size() == 0) {
a=false;
}
}
return answer;
}
public List<Integer> cal(List<Integer> list, int m){
int start = list.get(0) + m -1; //시작 구간부터 한번에 칠 할수있는 구간까지
int tmp = 0;
if(list.size() == 1) { //마지막 하나의 경우
list.remove(0);
return list;
}
for(int i=0; i<list.size(); i++) {
if(list.get(i) > start) {
tmp = i;
break;
}
}
if(tmp == 0) { //한번에 다 될 경우
tmp = list.size();
}
for(int i=0; i<tmp; i++) {
list.remove(0);
}
return list;
}
}
통과가 되긴 했는데, 코드가 너무 길다.
피드백
아래의 코드는 장홍범 님의 풀이이다.
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;
}
}
maxPainted를 계속 조건에 맞게 값을 넣으며 maxPainted가 새롭게 갱신될 때마다 answer를 올려준다.
한번에 칠할수 있는 길이가 시작시점 + m -1이기 때문에, maxPainted는 point + m인 것 같다.
생각까지는 닿았던 문제인데 코드 짜는 수준차이가 많이 나는 것 같다.
프로그래머스 문제를 풀고 다른 사람의 풀이를 볼 때마다 뭔가 한대 맞은 것 같다
항상 쉽게 생각하고 접근하는 연습을 해야할 것 같다. 그렇게 해야 코드의 간소화를 조금이나마 할 수 있지 않을까.........
728x90
300x250
@mag1c :: 꾸준히 재밌게
2023.04 ~ 백엔드 개발자의 기록
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!