백준 알고리즘

백준 알고리즘 1065번: 한수

여의도비 2018. 9. 5. 23:03

오늘은 3이란 고민한 한 수 문제를 올려본다. 솔직히 이 문제는 풀다가 뚝배기가 깨지는 줄 알았다. 그리고 풀긴 풀었지만 다른 블로그를 조금씩 (?) 서칭하면 서 풀었기에 기분은 크게 좋지가 않다.  좀 더 정진하고 공부해야하는게 맞는거 같다. 매일 같이 생각해야 한 문제 풀린다는데....ㅎㅎㅎ 


이번 문제는 그냥 함수보다는 그냥 풀어도 될 것 같아서 풀어버렸다. 추후에 함수로 정리해서 또 올리겠다. 일단 문제부터 보자



시간 제한메모리 제한제출정답맞은 사람정답 비율
2 초128 MB203368942778544.844%

문제

어떤 양의 정수 X의 자리수가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오. 

입력

첫째 줄에 1,000보다 작거나 같은 자연수 N이 주어진다.

출력

첫째 줄에 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력한다.

예제 입력 1 

110

예제 출력 1 

99





































싸지방 컴퓨터에 따라서 문제 복붙할 때 퀄리티가 달라진다....(망할 컴퓨터!)


아무튼 코드를 굴려서 짜다보니 총 두개로 짜게 됬다. 일단 첫 번째 꺼를 보면 서 이야기하자.




  1. #include <stdio.h>
  2. using namespace std;
  3. int main() {
  4. int a = 0, num =0, count = 0, number[3] ={0}, diff[2] = {0};
  5. scanf("%d", &a);
  6. if(a < 100)num = a;
  7. else{
  8. for( int i = 100; i <= a; i++){
  9. int n = i;
  10. for(int b = 1; b < 4; b++){
  11. number[b] = n % 10;
  12. n = n / 10;
  13.  
  14. }
  15. diff[1] = number[2] - number[1];
  16. diff[2] = number[3] - number[2];
  17. if(diff[1] == diff[2])count++;
  18. }
  19. if (a == 1000)count--;
  20. num = 99 + count;
  21. }
  22.  
  23. printf("%d",num);
  24. }

(첫번째 코드)


첫번째 코드는 두 번의 반복문을 이용해서 짰다. 여기서 코드를 짜다가. 라인 19에서  막혔었는데 내가 짠 코드는 전혀 문제없이 돌아간다고 생각했으나, 계속해서 틀렸다고 표시하니 화가나서 검색해봤다. 그리고 글을 보면서 생각해보니 1000보다 '작거나 같은' 숫자이기에 1000이 들어가면 뒤의 3자리 0 3개만 나오게 되니 1000은 한 수가 아닌데 들어가는 꼴이 되버린 것이다. 

....이렇게 조건을 읽어주는게 참 중요하다. 그런데 솔직히 이거 말고도 다른 코드도 가능하지 않을까 싶어서 고민해보다가 다시 짜게 됬다. 초반에 짤려고했던 주어진 수를 계속 해서 분해하는 방법을 이용하는것! 








  1. #include <stdio.h>
  2. using namespace std;
  3. int main() {
  4. int a = 0, num =0, count = 0, number[3] ={0}, diff[2] = {0};
  5. scanf("%d", &a);
  6. if(a < 100)num = a;
  7. else{
  8. for( int i = 100; i <= a; i++){
  9. number[1] = i % 10; // 1000 % 10 = 0
  10. number[2] = (i % 100) / 10; // 1000 % 100 = 0;
  11. number[3] = i / 100; // 1000 / 100 = 10 ;
  12. diff[1] = number[2] - number[1];
  13. diff[2] = number[3] - number[2];
  14. if(diff[1] == diff[2])count++;
  15. }
  16. num = 99 + count;
  17. }
  18.  
  19. printf("%d",num);
  20. }
  21.  
  22.  

(두번째 코드)


두번째 코드는 조금 더 간결해 졌다. 일단 이렇게 짜면 또 좋은 점이 바로 1000을 따로 예외 처리하지 않아도 되는것이다!!!! 개꿀~ 저기 주석을 단 곳을 보면 마지막 자리수를 100으로 나눠서 계산하기 때문에 1000을 100으로 나눌 때 3번째 배열에 10으로 들어가서 비교할 때 10 과 0으로 비교하기에 1000이 들어가지 않는다!!! 

이걸 보면서 정말 뭔가 깨달은 것같은 기분이 들었다. 내가 아직 너무나도 부족하다는 것을 팍 느끼는 시간이었다.