2022. 1. 8. 23:36ㆍPS (Program Solving)/BOJ (백준)
문제 설명
https://www.acmicpc.net/problem/1475
접근 방법 - 문자열을 이용한 문제
백준 1475번 문제는 숫자형이 아닌 문자열을 이용한 문제이다.
입력되는 값이 숫자이다 보니 혼동할 수도 있지만, 문제 상에선 결국 "스티커"의 숫자일 뿐이니 문자열을 이용하는 것이 더 수월할 것이다.
필자는 해당 문제를 풀 때 아래의 규칙을 찾았고 아래의 순서대로 코드를 작성하였다.
필자가 이용한 규칙
이 문제에서의 정답은 결국 가장 많이 사용된 숫자 스티커의 개수이다.
가장 많이 사용된 스티커의 숫자대로 스티커 세트를 준비하면 다른 숫자의 스티커 사용에도 지장이 없기 때문이다.
하지만 여기에서, 6과 9의 사용 횟수가 관건이다. 문제 상에서 둘은 서로 대체 가능한 숫자이기 때문이다.
필자는 이 점에 대해서, 6과 9 중 많이 사용되는 숫자가 다른 한 숫자보다 2개 이상 많다면 1개씩 대체하게끔 코딩하였다.
1개가 더 많다고 해서 대체를 해도, 결과적인 최댓값에는 영향을 주지 않기 때문이다.
코드의 실행 순서
1) 입력값을 문자열 형태로 입력받기 (숫자를 각각 따로 떼어놓기 위함)
2) 문자열 전체 탐색하며 각 숫자의 사용 횟수 측정하기
(이 연산을 하기 전에 배열 크기가 10인 배열을 전역 변수로 선언하고 여기에 각각 사용 횟수를 저장한다.
전역 변수로 하는 이유는 모든 배열 값을 0으로 초기화하기 위함.)
3) 6과 9의 사용 횟수 조정한다.
만약, 9의 사용 횟수가 6의 사용 횟수보다 2 이상 많을 때, 9의 배열 값을 1 감소하고 6의 배열 값을 1 증가한다.
반대로, 6의 사용 횟수가 9의 사용 횟수보다 2 이상 많을 때, 6의 배열 값을 1 감소하고 9의 배열 값을 1 증가한다.
위 2개의 조건이 모두 거짓이 될 때까지 이 과정을 반복한다.
4) 모든 배열 값을 탐색하며 최댓값을 구한다.
5) 해당 최댓값을 출력한 뒤 실행 종료한다.
성공한 코드
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)
#include <stdio.h>
#include <string.h>
//백준 1475번 코드
char ch[7];
int arr[10];
int main() {
scanf("%s", &ch);
for (int i = 0; i < strlen(ch); i++) {
arr[ch[i] - '0']++;
}
while (1) {
int cnt = 0;
if (arr[6] + 1 < arr[9]) { arr[6]++; arr[9]--; cnt++; }
else if (arr[9] + 1 < arr[6]) { arr[9]++; arr[6]--; cnt++; }
if (cnt == 0) { break; }
}
int max = 0;
for (int i = 0; i < 10; i++) {
if (max < arr[i]) { max = arr[i]; }
}
printf("%d", max);
}
제출 결과
(2021.12.25 백준 1475번 제출 결과)
(크리스마스에도 ps 한 거였냐ㅂㄷ....)
'PS (Program Solving) > BOJ (백준)' 카테고리의 다른 글
[백준 BOJ] 1919번 애너그램 만들기 (C언어) (0) | 2022.01.09 |
---|---|
[백준 BOJ] 1546번 평균 (C언어) (0) | 2022.01.09 |
[백준 BOJ] 1330번 두 수 비교하기 (C언어) (0) | 2022.01.08 |
[백준 BOJ] 1292번 쉽게 푸는 문제 (C언어) (0) | 2022.01.08 |
[백준 BOJ] 1259번 팰린드롬수 (C++/cpp) (0) | 2022.01.08 |