문제
https://www.acmicpc.net/problem/1065
한수를 구하는 수학문제다.
한수란? 등차수열이 적용된 수(?)를 말한다.
예를들면 123이 있을 때 각 자리의 수가 1로 등차수열이다. 그러니 한수!
1456는 천의자리 1과 백의자리 4의 등차가 3이다. 하지만 백의자리 4와 십의자리 5는 등차가 1.. 한수가 아니다.
이렇게 풀면 된다.
아래는 뤼튼이의 부연 설명이다.
어머! 얘. 내가 알려줄게, 110까지의 한수를 세는 방법 말이야. 100보다 작은 모든 수는 각 자리수가 등차수열을 이루니까, 한수라고 할 수 있어. 그래서 1부터 99까지는 총 99개의 한수가 있어. 100부터 110까지는 좀 더 자세히 봐야 해. 100부터 110까지는 실제로 등차수열을 이루는 숫자가 없어. 100, 101, 102, ..., 110 이 숫자들은 세 자리수 중 두 번째 자리수와 세 번째 자리수의 차이가 첫 번째 자리수와 두 번째 자리수의 차이와 다르기 때문에 등차수열의 한수가 아니야. 결론적으로 110까지의 한수는 1부터 99까지의 모든 수를 포함해서 총 99개야.
코드
using System;
using System.Text;
using System.Collections.Generic;
namespace dongsik
{
class Algorithm
{
static void Main(string[] str)
{
string input = Console.ReadLine();
int num = int.Parse(input);
if(num < 100)
{
Console.WriteLine(num);
return;
}
int cnt = 99;
for(int i = 100; i <= num; i++) // 100 ~ num까지의 수
{
bool isHan = true;
string s = i.ToString();
int diff = s[1] - s[0]; // 등차 구하기
for(int j = 2; j < s.Length; j++)
{
if(s[j] - s[j - 1] != diff)
{
isHan = false;
break;
}
}
if(isHan == true)
{
cnt++;
}
}
Console.WriteLine(cnt);
}
}
}
고민
사실 1부터 999까지만 입력되는 문제라서 단순히 자릿수를 나누어서 등차를 구해도 됐다. 하지만.. 난 어떤 숫자가 들어와도 판별하고싶었기 때문에(문제랑 상관없이 그러고 싶었다) string을 활용했다.
만약 1234가 들어왔을 때 int로 계산한다면?
1234.ToString().ToCharArr().Select(x => x - 0).ToArray(); 뭐 이렇게? 복잡하게 생각을 해었는데, 그렇게 안하고
string도 인덱스 값으로 인자를 찾을 수 있고, 해당 인자끼리 사칙연산이 들어가면 int값이 되니까 굳이 형변환을 하지 않아도 되겠다고 생각했다.
string s = 1234;
s[0]는 1일거고 s[1]은 2다. 이땐 string이지만
s[0] - s[1]을 하면? 결과가 int로 나온다.
위 방법으로 등차를 계산했다.
그리고 애초에 1부터 99까지는 모두 한수니까(한수는 등차를 비교할 수 있어야하는데 한자리 수는 등차가 없고 두자리 수는 어차피 등차 비교할게 없어서 모두가 한수다) 만약 수가 100이 넘는다면? 자동으로 cnt에 99를 넣고 시작했다.
'동식이 취업시키기 작전 > 코딩테스트' 카테고리의 다른 글
[백준] 1193 분수찾기(C#) (2) | 2024.01.26 |
---|---|
[백준] 1929 소수 찾기(C#) (1) | 2024.01.25 |
[백준] 4673 셀프넘버(C#) (0) | 2024.01.25 |
[백준] 2839 설탕배달(C#) (1) | 2024.01.24 |
[백준] 4949 균형잡힌 세상(C#) (0) | 2024.01.24 |