728x90
20365번: 블로그2
neighbor 블로그를 운영하는 일우는 매일 아침 풀고 싶은 문제를 미리 정해놓고 글을 올린다. 그리고 매일 밤 각각의 문제에 대하여, 해결한 경우 파란색, 해결하지 못한 경우 빨간색으로 칠한
www.acmicpc.net
GitHub - minyoung529/AlgorithmStudy: 여러 알고리즘 문제를 푸는 저장소입니다.
여러 알고리즘 문제를 푸는 저장소입니다. Contribute to minyoung529/AlgorithmStudy development by creating an account on GitHub.
github.com
간단하고 귀여운 문제였다.
형광팬 색깔을 바꾸는 작업을 최대한 덜 해야하므로, 처음에 모든 글을 하나의 색으로 칠한 다음, 칠한 색과 다른 부분을 부분을 작업하면 된다고 생각했다.
그러려면, 최대한 작업량이 많은 색을 처음에 한꺼번에 칠해야 한다.
알고리즘 설계
1. 파란색으로 바꾸는 작업, 빨간색으로 바꾸는 작업의 수를 각각 계산한다.
2. 위에 구한 둘을 비교해서 더 많은 작업이 필요한 색을 처음에 한꺼번에 칠한다.
- 이때 작업량은 1이다.
3. 칠하지 않은 색을 모두 칠한다.
- 작업량은 1 + 해당 색의 작업량의 수
알기 쉽게 경우를 따져서 그림으로 표현해봤다.

코드!
#include <iostream>
using namespace std;
#define RED 1
#define BLUE 2
int main()
{
int len, red = 0, blue = 0;
int state = 0;
char input;
cin >> len;
for (int i = 0; i < len; i++)
{
cin >> input;
if (input == 'R')
{
// 이전 색이 빨강이 아니라면
// 색을 바꾸는 작업 횟수 증가
if (state != RED) red++;
state = RED;
}
else
{
if (state != BLUE) blue++;
state = BLUE;
}
}
// 1(처음에 모두 칠한 횟수) + (더 적은 작업 횟수)
if (red >= blue)
cout << 1 + blue;
else
cout << 1 + red;
}
간단하게 구현한 것 같다.
처음, 한번에 색을 모두 칠하는 방법이 신기하고 효율적인 해결법이라고 생각한다. 재미있었다!
728x90
'알고리즘 문제풀이 > 그리디' 카테고리의 다른 글
| [백준][C++] 21314 민겸 수 (0) | 2022.11.04 |
|---|---|
| [백준][C++] 1931 A → B (0) | 2022.11.04 |
| [백준][C++] 1541 잃어버린 괄호 (0) | 2022.11.04 |
| [백준][C++] 1931 회의실 배정 (0) | 2022.11.04 |
| [백준][C++] 11047 동전 0 (0) | 2022.11.04 |