문제 풀기/C#

59. 덧칠하기

kagan-draca 2025. 2. 7. 16:09

 

기본 틀 :

using System;

public class Solution {
    public int solution(int n, int m, int[] section) {
        int answer = 0;
        return answer;
    }
}

 

문제를 어떻게 하면 더 깔끔하고 쉽게 문제를 풀 수 있지...

 

고민하다가 뇌에 과부하가 온 것 같다...

 

풀이 1) 

 

매개변수 section에 있는 요소를 Queue에 넣는다.

 

while 문을 사용해서 queue.Count != 0 아니면

 

queue.Dequeue()로 값을 가져온다.

 

그리고 다시 while문으로 queue.Count가 0보다 크고,

 

queue.Peek()값이 Dequeue()로 뽑은 값 + m 보다 작을 경우

 

계속 Dequeue()로 제거한다.

 

using System;
using System.Collections.Generic;

public class Solution {
    public int solution(int n, int m, int[] section) 
    {
        Queue<int> queue = new Queue<int>(section);
        
        int count = 0;
        
        while(queue.Count != 0)
        {
            int current = queue.Dequeue();
            count++;
            while(queue.Count > 0 &&queue.Peek() < current + m) queue.Dequeue();
        }
        
        return count;
    }
}

 

옛날에 JavaScript로 푼 방법을 바탕으로 C# 코드를 작성해보니

 

풀이 2)

 

벽을 칠하지 않아도 되는 구간은 false, 칠해야 하는 구간을 true로 

 

bool 타입 배열을 만든다.

 

반복문을 활용해 check[i]가 true이면

 

count를 증가시키고,

 

i += m - 1로 m 만큼 색칠할 수 있는 영역을 스킵하고 지나간다.

 

using System;

public class Solution {
    public int solution(int n, int m, int[] section) 
    {
        int count = 0;
        
        bool[] check = new bool[n];
        
        for(int i = 0; i < section.Length; i++)
            check[section[i] - 1] = true;
        
        
        for(int i = 0; i < check.Length; i++)
        {
            if(check[i])
            {
                count++;
                i += m -1;
            }
        }
        return count;
    }
}

 

 

과거의 내가 지금의 나 보다 코딩을 더 잘하는 것 같다...

'문제 풀기 > C#' 카테고리의 다른 글

61. (중요)로또의 최고 순위와 최저 순위(Intersect, Union, Except)  (0) 2025.02.10
60. 기사단원의 무기  (0) 2025.02.10
58. 소수 만들기  (0) 2025.02.07
57. 모의고사  (0) 2025.02.07
56. 과일 장수  (0) 2025.02.06