반응형
#include <iostream>
int arr[50001];

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
int main() {
	
	//freopen("input.txt.txt", "rt", stdin);
	int n;
	scanf("%d", &n);
	
	
	for(int i=1 ; i <= n; i++){
		for(int j=i; j<=n; j=j+i){
			arr[j]++;
		}
	}
	for(int i =1; i <=n; i++){
		printf("%d ", arr[i]);
	}
	
	
	return 0;
	

}

약수의 개수 구하기

보통 약수의 개수를 구하려면

N^2의 시간복잡도를 이용해서 구하는게 먼저 생각나는데,

어떤 문제에서는 시간초과가 될 수 있다.

 

 

예를 들어 보통

10의 약수를 구하려면

(x%10==0)

x에 숫자를 다 대입해본다. 

 

대신에

더 빠른 시간으로 구하기 위해서는

위의 코드처럼 해당 수의 약수를 구해주는 게 아니라

어떤 수 i의 배수를 돌면서 약수의 개수를 더해준다.

 

'Algorithm > etc' 카테고리의 다른 글

3의 개수  (0) 2021.12.27
N! 0의 개수  (0) 2021.12.27
N! 표현법  (0) 2021.12.27
숫자 뒤집기 cpp  (0) 2021.12.25
자리수의 합  (0) 2021.12.23
반응형
#include <iostream>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
int main() {

	int n, sum=0, c=1, d=9, res=0;
	scanf("%d", &n);
	while(sum+d <n){
		res = res+(c*d);
		sum = sum+d;
		c++;
		d=d*10;
	}
	
	res += (n-sum)*c;
	
	printf("%d",res);
}

자리수의 합 빠르게 구하기

'Algorithm > etc' 카테고리의 다른 글

3의 개수  (0) 2021.12.27
N! 0의 개수  (0) 2021.12.27
N! 표현법  (0) 2021.12.27
숫자 뒤집기 cpp  (0) 2021.12.25
약수의 개수 구하기  (0) 2021.12.24
반응형
#include <iostream>

int main() {
	
	//freopen("input.txt.txt", "rt", stdin);
	char a[101], b[101];
	
	int i, p=0;
	
	gets(a);
	for(i=0; a[i]!='\0'; i++){
		if(a[i]!=' '){
			if(a[i]>=65 && a[i]<=90){
				b[p++]=a[i]+32;
			}
			else b[p++]=a[i];
		}
			
			
	}
	
	b[p]='\0';
	printf("%s\n", b);
	return 0;
	

}

gets(char[] a)를 해주면

a에 한줄을 읽어올 수 있다.

 

 

C++에서 소문자 대문자 변환하는 법은

아스키코드를 활용해서

대문자 -> 소문자로 변환할 땐 32를 더해주고

소문자 -> 대문자는 32를 빼주면 된다.

 

반응형

python for-else 예시

1.

for i in range(10):
    print(i)

    if i == 5:
        print("find it!")
        break
else:
    print("Can't find")

output---

0
1
2
3
4
5
find it!

 

for i in range(10):
    print(i)

    if i == 11:
        print("find it!")
        break
else:
    print("Can't find")

output

0
1
2
3
4
5
6
7
8
9
Can't find

--------------------

 

이처럼 for-else문을 활용해서

for문에서 특정한 행동을 완료하여 break로 탈출을 했는지 안했는지 판별을 해줄 수 있다.

break를 하지 않는 다면 else에 적혀진 문장을 수행한다.

 

만약 for-else문을 사용하지 않는다면 예시의 두번째를 이렇게 써야한다.

breaked = False
for i in range(10):
    print(i)

    if i == 11:
        print("find it!")
        breaked = True
        break

if not(breaked):
    print("Can't find")

큰 차이는 없고, for else가 익숙하지 않아서 오히려 이 방법이 더 가독성이 좋을 수 있다.

 

 

2.

balls = [1,2,3,4]
weapons = [11,22,3,44]

for ball_idx , ball_val in enumerate(balls):
    print("ball :" , ball_val)
    for weapon_idx , weapon_val in enumerate(weapons):
        print("weapons : ", weapon_val)
        if ball_val == weapon_val:
            print("공과 무기가 충돌")
            break
    else:
        continue
    print("바깥 for 문 break")
    break

이처럼 이중포문에서 for else문을 활용하여

내부 for문에서 break가 일어난다면 바깥 for문도 break가 일어나게하여

이중포문을 모두 종료시킬 수 있다.

 

for-else를 모른다면 bool 변수와 if문을 활용해서 위의 예처럼 종료시킬 수도 있다.

balls = [1,2,3,4]
weapons = [11,22,3,44]

breaked = False
for ball_idx , ball_val in enumerate(balls):
    print("ball :" , ball_val)
    for weapon_idx , weapon_val in enumerate(weapons):
        print("weapons : ", weapon_val)
        if ball_val == weapon_val:
            print("공과 무기가 충돌")
            breaked = True
            break

    if (breaked):
        print("바깥 for 문 break")
        break

위와 아래를 비교했을 때 위가 좀더 깔끔하긴 하다.

알면 좋고, 몰라도 크게 차이는 없어보인다.

 

 

 

#for-else #파이썬

반응형
char a[100];
int res=0, cnt=0, i;
scanf("%s", &a);
for(i=0; a[i]!='\0'; i++){
	if(a[i] >=48 &&a[i]<=57){
		res = res*10 + (a[i]-48);
	}
}

char array를 for문을 통해 돌 때

 

for문에서 strlen()을 쓰지 않아도

 

string의 null문자인 '\0'을 활용해서 for문을 끝내 줄 수 있다.

 

 

'C++' 카테고리의 다른 글

ios::sync_with_stdio(false), cin.tie(0) 쓰는 이유, 백준 시간초과 해결  (0) 2022.01.24
C++ map STL 사용법  (0) 2022.01.24
C++ 반올림  (0) 2022.01.10
C++ 2차원 벡터 선언  (0) 2022.01.10
C++ 한 줄 읽어오기 (C++ parsing)  (0) 2021.12.23
반응형

1. 추상 클래스 상속

abstract class Shape{
	public Shape(){}
    public void Paint(){draw();}
    abstract public void draw(); // 추상 메소드
}

abstract class Line extends Shape{ //추상 메소드 draw()를 상속 받았는데 구현을 하지 않으면 sub class 역시 추상 클래스가 된다
	public String toString(){
    	return "Line";
    }
}

자바에서 슈퍼클래스의 추상 메소드를 서브 클래스에서 구현하지 않으면,

서브 클래스 역시 슈퍼 클래스처럼 abstract 클래스가 된다.

 

적절한 비유는 아니지만

abstract를 빚으로 생각한다면

부모 클래스에 있는 abstract(빚) 메소드를 자식이 해결하지 못한다면

자식도 abstract class가 되어버린다.

(abstract class면 객체를 생성할 수 없다..) 

 

 

2. 추상 클래스 사용 이유

서브 클래스마다 다르게 구현해야 할 필요가 있는 메소드를 추상 메소드로 정의해준다.

abstract class Animal{
	abstract void bark();
}

class dog extends Animal{
	void bark(){
    	System.out.println("멍멍");
    }
}

class cat extends Animal{
	void bark(){
    	System.out.println("냐옹");
    }
}

class bird extends Animal{
	void bark(){
    	System.out.println("짹쨱");
    }
}

이런 느낌이다.

큰 프로그램의 객체지향 설계를 해줄 때 서브 클래스의 세부 내용을 각각 다르게 해주어야 할 경우

이런 식으로 추상 메소드를 이용해주면 깔끔하게 코드를 정리할 수 있다.

+ Recent posts