meong_j
기록하는 습관.
meong_j
전체 방문자
오늘
어제
  • 분류 전체보기 (176)
    • 개인 공부 정리 (0)
    • 서버 운영 (37)
      • Linux (36)
    • Frontend (11)
      • Vue.js (10)
    • Backend (70)
      • Java (4)
      • Python (22)
      • Django (38)
      • Spring (6)
    • Database (5)
      • Oracle (4)
      • MySQL (1)
      • MariaDB (0)
    • Android (14)
      • Kotlin (6)
    • 배포 (9)
      • Docker (8)
      • AWS (1)
    • IT_study (29)
      • Coding test (17)
      • 알고리즘 (5)
      • 스터디 (6)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • github

인기 글

반응형

태그

  • cpu사용률
  • 배포인프라
  • 중첩라우트
  • 이차원배열정렬
  • dp #알고리즘
  • 테크커리어
  • router-link
  • docker
  • 코틀린자료형
  • DHCP
  • gabagecollecter
  • Kotlin
  • Proxy
  • 안드로이드adaptor
  • 리눅스인증
  • dockersecret
  • SASS Variables
  • 개발자도서
  • 리눅스방화벽
  • django

최근 댓글

최근 글

250x250
hELLO · Designed By 정상우.
meong_j

기록하는 습관.

IT_study/Coding test

[Coding test Basic with c++] 모두의 약수

2021. 12. 21. 19:42
728x90
반응형

문제

자연수 N이 입력되면 1부터 N까지의 각 숫자들의 약수의 개수를 출력하는 프로그램을 작성하 세요.
만약 N이 8이 입력된다면 1(1개), 2(2개), 3(2개), 4(3개), 5(2개), 6(4개), 7(2개), 8(4 개) 와 같이 각 숫자의 약수의 개수가 구해집니다.
출력은 다음과 같이 1부터 차례대로 약수의 개수만 출력하면 됩니다.
1 2 2 3 2 4 2 4 와 같이 출력한다.

▣ 입력설명
첫 번째 줄에 자연수 N(5<=N<=50,000)가 주어진다.

▣ 출력설명
첫 번째 줄에 1부터 N까지 약수의 개수를 순서대로 출력한다.

 

입력예제

8

 

출력예제

1 2 2 3 2 4 2 4

 

처음에 푼 풀이(시간 초과)

#include<stdio.h>
using namespace std;

int main(){
	// 모두의 약수 - 제한시간 1초 

	int a, i , j, cnt;
	scanf("%d",&a);

	for(i=0; i < a; i++){
		for(j=0; j < i; j++){
			if(a%j==0) cnt++;
		}
		printf("%s",&cnt);
		cnt = 0;
	}
		
	
   	return 0;
    
}

각 약수들의 개수를 출력하면 되는 거기때문에 처음에 이중 for문에 자연수 N값에 대해 N번의 자연수로 나누어서 약수의 개수들을 각 각 출력했다. 하지만 이중 for문으로 시간복잡도가 n의 제곱이라 시간 초과로 오답처리 되었다. 

시간 초과가 안되게 하려면 , 다르게 생각해보기로 했다. 

 

 

풀이

#include<stdio.h>
using namespace std;

int cnt[50001]; 

int main(){
	// 모두의 약수 - 제한시간 1초 

	int n, i , j;
	scanf("%d",&n);
	
	for(i=1 ; i<=n ;i++){
		for(j=i; j<=n; j=j+i){  //1의배수,2의배수,3의배수... 
			cnt[j]++;
		}
	}
	
	for(i=1 ; i<=n ;i++){
		printf("%d",cnt[i]);
	}

   	return 0;
    
}

cnt라는 배열에 각 자연수들의 배수만 개수를 플러스 시켜서 담아낸다.

cnt[50001] = [ 2의 배수의 cnt 증가, 3의 배수의 cnt 증가, 4의 배수 cnt 증가... ] 이렇게..

그럼 각 배수들만 for문으로 체크 하기 때문에 시간복잡도가 줄어들게 된다.

 

 

 

반응형
저작자표시 비영리 변경금지 (새창열림)

'IT_study > Coding test' 카테고리의 다른 글

[Coding test Basic with c++] Anagram(아나그램 : 구글 인터뷰 문제)  (0) 2021.12.25
[Coding test Basic with c++] 자릿수의 합  (0) 2021.12.21
[Coding test Basic with c++] 올바른 괄호  (0) 2021.12.16
[Coding test Basic with c++] 영어단어 복구  (0) 2021.12.16
[Coding test Basic with c++] 숫자만 추출  (0) 2021.12.16
    'IT_study/Coding test' 카테고리의 다른 글
    • [Coding test Basic with c++] Anagram(아나그램 : 구글 인터뷰 문제)
    • [Coding test Basic with c++] 자릿수의 합
    • [Coding test Basic with c++] 올바른 괄호
    • [Coding test Basic with c++] 영어단어 복구
    meong_j
    meong_j
    #it #개발일기 #개발공부 #개발자 #백앤드 #생각정리 #시간은 실력에 비례한다 #뭐든지 꾸준히 열심히 #오늘의 내가 내일의 나를 만든다

    티스토리툴바