12번 문제   

 

 

    내가 풀이한 답   

 

   11번 문제보다 입력 범위가 늘었다. 그래서 전 코드에서 분기문의 조건을 늘리는 작업을 했다.

#include <stdio.h>
using namespace std;

int main(int argc, char** argv) {
	//freopen("input.txt", "rt", stdin);	
	int n, cnt;
	scanf("%d", &n);
	
	if(n<10){
		cnt = n;
	} 
	else if(n>=10 && n<100){
		cnt = (n-9)*2 + 9;
	}
	else if(n>=100 && n<1000){
		cnt = (n-9-90)*3 + (90*2) + 9;
	}
	else if(n>=1000 && n<10000){
		cnt = (n-9-90-900)*4 + (900*3) + (90*2) + 9;
	}
	else if(n>=10000 && n<100000){
		cnt = (n-9-90-900-9000)*5 + (9000*4) + (900*3) + (90*2) + 9;
	}
	else if(n>=100000 && n<1000000){
		cnt = (n-9-90-900-9000-90000)*6 + (90000*5) + (9000*4) + (900*3) + 
		(90*2) + 9;
	}
	else if(n>=1000000 && n<10000000){
		cnt = (n-9-90-900-9000-90000-900000)*7 + (900000*6) + (90000*5) + (9000*4) + 
		(900*3) + (90*2) + 9;
	}
	else if(n>=10000000 && n<100000000){
		cnt = (n-9-90-900-9000-90000-900000-9000000)*8 + (9000000*7) + (900000*6) + 
		(90000*5) + (9000*4) + (900*3) + (90*2) + 9;
	}
	else if(n>=100000000 && n<1000000000){
		cnt = (n-9-90-900-9000-90000-900000-9000000-90000000)*9 + (90000000*8) + 
		(9000000*7) + (900000*6) + (90000*5) + (9000*4) + (900*3) + (90*2) + 9;
	}

	printf("%d", cnt);
	
	return 0;
}

 

그 결과 통과를 했지만 너무 효율성이 없다고 생각을 했다. 

 

 

 

그래서, 11번 문제의 코드를 그대로 다시 입력해봤더니 

#include <stdio.h>
using namespace std;

int main(int argc, char** argv) {
	//freopen("input.txt", "rt", stdin);	
	int n, cnt, i, temp;
	scanf("%d", &n);
	
	for(i=1; i<=n; i++){
		temp = i;
		while(temp>0){
			temp /= 10;
			cnt++;
		}
	}

	printf("%d", cnt);
	
	return 0;
}

 

 결과는 범위가 10억까지 늘어서 그런지 Time Limit이 걸려서 통과하지 못했다.

 

 

 

 그래서 방법을 바꾸어 생각해보았다. 위에서 작성한 분기문을 순회(while)문을 사용해서 작성하였다. 각각의 자릿수에 해당하는 수의 개수는 9(1~9), 90(10~99), 900(100~999), 9000(1000~9999) .... 규칙적으로 10이 곱해져서 증가하는 것을 이용하였다. 

 

 

 입력받은 n의 자리수를 확인하기 위한 check 변수와 각 자리수의 숫자 개수를 확인하기 위해 임시로 사용한 temp 변수와 각 자리수를 나타내는 digit 변수를 사용해서 코드를 완성했다. 

#include <stdio.h>
using namespace std;

int main(int argc, char** argv) {
	//freopen("input.txt", "rt", stdin);	
	int n, cnt, check = 9, digit = 1, temp = 9;
	scanf("%d", &n);
	
	if(n>=1 && n<=9){
		printf("%d", n);
		return 0;
	}
	
	while(n >= check){
		cnt += (temp*digit);
		temp = temp * 10;
		check = temp + check;
		digit++;	
	}
	check = check / 10;
	cnt += (n - check) * digit;
	
	printf("%d", cnt);
	
	return 0;
}

 

 n이 137인 경우 흐름은 다음과 같다.

 

 

코드를 채점 시스템에 적용해보니 통과를 했다.

 

 


    사이트의 답안   

#include<stdio.h>
int main(){
	//freopen("input.txt", "rt", stdin);
	int n, sum=0, cnt=1, digit=9, res=0;
	scanf("%d", &n);
	while(sum+digit<n){	
		sum=sum+digit;
		res=res+(cnt*digit);
		cnt++;
		digit=digit*10;
	}
	res=res+((n-sum)*cnt);
	printf("%d\n", res);
	return 0;
}

 

  사이트의 답안은 마지막으로 작성한 코드와 논리적으로 똑같았다. 

'알고리즘 & 자료구조 > 기초 다잡기' 카테고리의 다른 글

14. 가장 많이 사용된 자릿수  (0) 2020.09.06
13. 가장 많이 사용된 자릿수  (0) 2020.09.03
11. 숫자의 총 개수(small)  (0) 2020.09.03
10. 자릿수의 합  (0) 2020.09.03
9. 모두의 약수  (0) 2020.09.02

    11번 문제   

 

 

 

    내가 풀이한 답   

 

   문제를 봤을 때 자릿수를 기준으로 count값을 증가시키면 된다는게 핵심이라고 생각했고 이 자릿수를 어떻게 구별할지에 대해 곰곰히 생각해보았다. 처음 든 생각은 입력된 n까지 순회(for)를 돌면서 그 안에서 또 while문을 돌아 10으로 나누어 count값을 증가시키는 쪽으로 생각을 했다.

 

 그러다 문제를 더 읽다보니 입력 설명에서 조건이 십만 미만이라고 한 점에서 분기문만 이용해서 처리해도 된다고 생각을 했다. 15인 두 자리수를 예로 들면 한 자리수는 1만 증가시켜주면 되므로 총합은 9이다. 따라서 15에서 9를 뺀 나머지 6에 2를 곱해주면 된다고 생각했고 100인 세 자리수를 예로 들면 한 자리수에 해당하는 9와 십의 자리수에 해당하는 10~99까지 총 90개를 곱하기 2해주고 나머지 세 자리수인 100만 3을 더해주면 된다고 생각했다. 

 

#include <stdio.h>
using namespace std;

int main(int argc, char** argv) {
	//freopen("input.txt", "rt", stdin);	
	int n, cnt;
	scanf("%d", &n);
	
	if(n<10){
		cnt = n;
	} 
	else if(n>=10 && n<100){
		cnt = (n-9)*2 + 9;
	}
	else if(n>=100 && n<1000){
		cnt = (n-9-90)*3 + (90*2) + 9;
	}
	else if(n>=1000 && n<10000){
		cnt = (n-9-90-900)*4 + (900*3) + (90*2) + 9;
	}
	else if(n>=10000 && n<100000){
		cnt = (n-9-90-900-9000)*5 + (9000*4) + (900*3) + (90*2) + 9;
	}
	
	printf("%d", cnt);
	
	return 0;
}

 

그 결과 통과를 했다.

 

 

 

 그리고 처음에 생각했던 것처럼 입력된 n까지 순회(for)를 돌면서 그 안에서 또 while문을 돌아 10으로 나누어 count값을 증가시키는 쪽의 코드는 다음과 같다.

 

#include <stdio.h>
using namespace std;

int main(int argc, char** argv) {
	//freopen("input.txt", "rt", stdin);	
	int n, cnt, i, temp;
	scanf("%d", &n);
	
	for(i=1; i<=n; i++){
		temp = i;
		while(temp>0){
			temp /= 10;
			cnt++;
		}
	}

	printf("%d", cnt);
	
	return 0;
}

 

 

역시 통과를 했다.

 

 


    사이트의 답안   

#include<stdio.h>
int main(){
	//freopen("input.txt", "rt", stdin);
	int n, i, cnt=0, tmp;
	scanf("%d", &n);
    
	for(i=1; i<=n; i++){
		tmp=i;
		while(tmp>0){
			tmp=tmp/10;
			cnt++;
		}
	}
    
	printf("%d\n", cnt);
	return 0;
}

 

  사이트의 답안은 내가 맨 처음 생각했던 답안과 비슷하다.

'알고리즘 & 자료구조 > 기초 다잡기' 카테고리의 다른 글

13. 가장 많이 사용된 자릿수  (0) 2020.09.03
12. 숫자의 총 개수(large)  (0) 2020.09.03
10. 자릿수의 합  (0) 2020.09.03
9. 모두의 약수  (0) 2020.09.02
8. 올바른 괄호  (0) 2020.09.02

    10번 문제   

 

 

 

    내가 풀이한 답   

 

  먼저, 각 자리수의 합을 구해주는 함수를 정의해주고 입력된 n개의 수마다 함수를 호출하였다. 문제에서 요구하는 것은 처음에 입력받은 값(아래 코드에서 num 변수)이였기 때문에 각 자리 수의 합을 비교하는 변수들(res와 max)이 필요했다. 또한, 문제에서 자리수의 합이 같은 경우 값이 가장 큰 값을 출력하라고 했기 때문에 값을 비교하는 변수들(num과 dap)이 필요했다. 

#include <stdio.h>
using namespace std;

int digit_sum(int x){
	int sum = 0;
	while(x>=1){
		sum += x%10;
		x = x/10;
	}
	return sum;
}

int main(int argc, char** argv) {
	//freopen("input.txt", "rt", stdin);	
	int n, num, res, max=0, dap, i;
	scanf("%d", &n);
	
	for(i=0; i<n; i++){
		scanf("%d", &num);
		res = digit_sum(num);
		if(res >= max){
			if(res == max){
				max = res;
				dap = (num > dap) ? num : dap;
			} 
			else {
				max = res;
				dap = num;	
			}
		}
	}
	printf("%d\n", dap);
	return 0;
}

 

그 결과 통과를 했다.

 

 


    사이트의 답안   

#include<stdio.h>
int digit_sum(int x){
	int sum=0, tmp;
	while(x>0){
		tmp=x%10;
		sum=sum+tmp;
		x=x/10;
	}
	return sum;
}

int main(){
	freopen("input.txt", "rt", stdin);
	int n, num, i, sum, max=-2147000000, res;
	scanf("%d", &n);
	for(i=1; i<=n; i++){
		scanf("%d", &num);
		sum=digit_sum(num);
		if(sum>max){
			max=sum;
			res=num;
		}
		else if(sum==max){
			if(num>res) res=num;
		}
	}
	printf("%d\n", res);
	return 0;
}

 

  사이트의 답안과 내 코드는 논리적으로 별 다를게 없었다. 

'알고리즘 & 자료구조 > 기초 다잡기' 카테고리의 다른 글

12. 숫자의 총 개수(large)  (0) 2020.09.03
11. 숫자의 총 개수(small)  (0) 2020.09.03
9. 모두의 약수  (0) 2020.09.02
8. 올바른 괄호  (0) 2020.09.02
7. 영어단어 복구  (0) 2020.09.02

    9번 문제   

 

 

    내가 풀이한 답   

 

  처음에는 간단히 모든 수를 돌며 그 수에 해당하는 수까지 또 돌아서 약수를 구하는 방식으로 코드를 짰다. 즉, 모든 수를 다 돌기 때문에 N제곱의 시간복잡도가 나온다. 

#include <stdio.h>
using namespace std;

int main(int argc, char** argv) {
	//freopen("input.txt", "rt", stdin);	
	
	int n, i, j, cnt=0;
	scanf("%d", &n);
	
	for(i=1; i<=n; i++) {
		cnt=0;
		for(j=1; j<=i; j++){
			if(i%j==0){
				cnt++;
			}
		}
		printf("%d ", cnt);
	}
	printf("\n");
}

 

 그 결과는 60점에 큰 숫자로 들어가버리면 시간 초과가 뜬다... (Time Limit: 1초)

 

 

 더 곰곰히 생각해보다가 더 이상 떠오르질 않아서 강의 초반부에서 전략을 들었다. 모든 경우의 수를 다 도는 것은 비효율적이므로 어차피 약수를 구하는 것은 배수의 개념으로도 풀 수 있다고 말하였다. 다시 머리를 한 대 얻어맞은 듯한 느낌을 받았다. 강의의 내용은 다음과 같다. 순회(for)를 돌면서 해당하는 값의 배수들만 값을 증가시켜주는 방법이다. 

 

 

 

#include <stdio.h>
using namespace std;
int main(int argc, char** argv) {
	//freopen("input.txt", "rt", stdin);	
	int array[50001];
	int n, i, j;
	scanf("%d", &n);
	
	for(i=1; i<=n; i++) {
		for(j=i; j<=n; j=j+i){
			array[j]++;
		}
	}
	
	for(i=1; i<=n; i++){
		printf("%d ", array[i]);
	}
}

 

 그 결과 80점... 왜 그럴까.. 하고 사이트의 답안과 비교해봤다. 

 

 


    사이트의 답안   

#include<stdio.h>
using namespace std;
int cnt[50001];
int main(){
	//freopen("input.txt", "rt", stdin);
	int n, i, j;
	scanf("%d", &n);
	for(i=1; i<=n; i++){
		for(j=i; j<=n; j=j+i){
			cnt[j]++;
		}
	}
	for(i=1; i<=n; i++){
		printf("%d ", cnt[i]);
	}
	return 0;
}

 

  사이트의 답안과 내 코드는 배열을 선언한 부분의 전역인지 지역인지의 차이였다. 지역변수와 전역변수의 차이점에 대해 조사를 해봐야겠다...

'알고리즘 & 자료구조 > 기초 다잡기' 카테고리의 다른 글

11. 숫자의 총 개수(small)  (0) 2020.09.03
10. 자릿수의 합  (0) 2020.09.03
8. 올바른 괄호  (0) 2020.09.02
7. 영어단어 복구  (0) 2020.09.02
6. 숫자만 추출  (0) 2020.09.01

    8번 문제   

 

 

 

    내가 풀이한 답   

 처음에는 ' ( ' 에 대한 변수, ' ( ' 에 대한 변수를 따로두어서 둘의 개수가 같지 않으면 NO라고 출력하면 된다고 생각해서 코드를 짰다. 

#include <stdio.h>
using namespace std;

int main(int argc, char** argv) {
	//freopen("input.txt", "rt", stdin);
	char a[31];
	int i, left = 0, right= 0;
	scanf("%s", &a);
	
	for(i=0; a[i]!='\0'; i++){
		if(a[i] == '(') left++;
		if(a[i] == ')') right++;
	}
	//printf("left: %d, right:%d\n", left, right);
	if(left != right) printf("%s", "NO");
	else printf("%s\n", "YES");
	
	return 0;
}

 

 그 결과는 60점...

 

 다시 곰곰히 생각을 해보니 중간에 ' ( '로 시작해버리는 예 ( ( ) ( ) ) ) (  이것도 올바른 괄호가 아니기 때문에 코드의 수정이 필요했다. 2개의 변수를 합쳐서 ' ( '로 시작하는 것은 음수로 두고 음수이면 for문을 빠져나오도록 코드를 다시 짰다. 

 

#include <stdio.h>
using namespace std;

int main(int argc, char** argv) {
	//freopen("input.txt", "rt", stdin);	
	char a[31];
	int i, cnt=0;
	scanf("%s", &a);
		
	for(i=0; a[i]!='\0'; i++){
		if(a[i] == '(') cnt++;
		else cnt--;
		if(cnt<0) break;
	}
	
	if(cnt == 0) printf("%s\n", "YES");
	else printf("%s\n", "NO");
	return 0;
}
	

 

 그 결과 통과를 했다.

 

 

    사이트의 답안   

#include<stdio.h>
using namespace std;
int main(){
	//freopen("input.txt", "rt", stdin);
	char a[100];
	int i, cnt=0;
	scanf("%s", &a);
	for(i=0; a[i]!='\0'; i++){
		if(a[i]=='(') cnt++;
		else if(a[i]==')') cnt--;
		if(cnt<0) break;
	}
	if(cnt==0) printf("YES\n");
	else printf("NO\n");
	return 0;
}

 

  사이트의 답안과 내 코드가 같은 논리로 짜여진 것을 확인했다.

'알고리즘 & 자료구조 > 기초 다잡기' 카테고리의 다른 글

10. 자릿수의 합  (0) 2020.09.03
9. 모두의 약수  (0) 2020.09.02
7. 영어단어 복구  (0) 2020.09.02
6. 숫자만 추출  (0) 2020.09.01
5. 나이 계산  (0) 2020.09.01

    7번 문제   

 

 

    내가 풀이한 답   

 

 처음에 배열 하나만 가지고 index의 위치를 기준으로 코드를 짜려고 했다. 하지만, 너무 비효율적이라는 생각이 들었고 다른 방법을 생각해보았다. 방법이 잘 떠오르지 않아서 강의 초반부를 들었다. 그 때, 머리를 망치로 얻어맞은듯한 느낌을 받았다. 배열을 하나 더 사용하는 것이었다. 왜 이런 방법이 안떠올랐을까 하면서 자괴감이...

 

 처음 입력된 값을 받는 scanf에서 공백이 섞인 문자를 읽어들이기 위해 %[^\n]이라는 것을 사용했다. 이는 \n을 제외한 나머지들을 읽어들이는 역할을 한다. 그리고 공백없이 문자를 담을 배열인 b는 index라는 변수를 따로두었다. 공백이 아닌 문자가 확인될 때마다 index 변수에 해당하는 index에 값을 소문자로 변환해서 집어넣었다. 이 때, 소문자로 바꿔주는 것은 cctype 라이브러리의 tolower를 썼다. 이것도 정리를 해놔야겠다. 

 

#include <stdio.h>
#include <cstring>
#include <cctype>
using namespace std;

int main(int argc, char** argv) {
	//freopen("input.txt", "rt", stdin);
	char a[101], b[101];
	scanf("%[^\n]", &a);
	
	int i, index = 0;
	
	for(i=0; i<strlen(a); i++){
		if(a[i] != ' '){
			b[index] = tolower(a[i]);
			index++;
            		// b[index++] = tolower(a[i]);
		}		
	}
	
    	//b[index] = '\0';
	printf("%s", b);
	return 0;
}
}

 

 그 결과 통과를 했다.

 


    사이트의 답안   

#include<stdio.h>
using namespace std;
int main(){
	//freopen("input.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;
}
	
	

 

  나는 공백이 섞인 문자를 읽어들이기 위해 %[^\n]이라는 것을 사용했는데 gets라는 함수를 써서 쉽게 해결할 수 있었다. 또 하나 배워간다. 그리고 여기서 대, 소문자를 구분하기 위해 아스키 코드 65~90에 해당하는 대문자를 조건문으로 삼아 +32를 해주어 소문자로 만들었다. 

 

'알고리즘 & 자료구조 > 기초 다잡기' 카테고리의 다른 글

9. 모두의 약수  (0) 2020.09.02
8. 올바른 괄호  (0) 2020.09.02
6. 숫자만 추출  (0) 2020.09.01
5. 나이 계산  (0) 2020.09.01
4. 나이 차이  (0) 2020.09.01

   1. char  to int   

 

 첫 번째 방법은 아스키 코드를 이용하는 방법이다. char 변수는 1 byte 정수이다. 하지만, char 자료형이 정수일지라도 아스키 코드로 해석된다. 아스키 American Standard Code for Information Interchange의 약자로 영어 문자 또는 특수문자를 0에서 127 사이의 숫자(아스키 코드)로 나타낸다. 예를 들어 숫자 0은 코드 48이고 9는 57이다. 그리고 'a' 문자는 코드 97이다. 'b'는 98이다. 

 

 이러한 아스키 코드를 이용하여 char형 데이터를 int 형으로 바꾸는 방법은 48을 빼주는 방법과 '0'을 빼주는 방법이 있는데 예제는 다음과 같다. 

 

// 1. 48을 빼주는 방법

char one = "1";
int num = one - 48;

scanf("%d", num + 3); 		// 4


// 2. '0'을 빼주는 방법

char one = "1";
int num = one = '0';

scanf("%d", num + 4); 		// 5

 

 

   2. char 배열 길이만큼 순회(for)문 돌기   

 

char 배열의 길이만큼 순회(for)문을 도는 방법은 많은데 그 중 두 가지를 소개한다. 첫 번째 방법은 cstring 라이브러리의 함수 strlen()를 쓰는 방법이다. 마지막으로는 데이터가 없는 인덱스의 값이 '\0'임을 이용하는 방법이다. 두 번째 방법은 아래 그림을 참조하면 된다. 

 

 

 두 가지 예제는 다음과 같다.

 

// 1. cstring 라이브러리 strlen() 함수 이용하기

#include <cstring>

char array[51];
scanf("%s", &array);			// g0en2Ts8eSoft 입력

int len = strlen(array);        	// 13

for(int i=0; i<len; i++) {
	// 작업
}


// 2. 값이 없는 index의 값이 '\0'임을 이용하기

char array[51];
int res = 0;
scanf("%s", &array);			// g0en2Ts8eSoft 입력

for(int i=0; array[i] != '\0'; i++) {
	if(a[i]>=48 && a[i]<=57){
		res = res * 10 + (a[i] - 48);
	}
}

    6번 문제   

 

 

 

    내가 풀이한 답   

 

 문자가 50을 넘지 않으므로 51까지 배열을 선언하였다. 그리고C/C++ 에서는 Char형 데이터와 Int형 데이터를 제대로 구분해 본 적이 없었다. 그러던 중 아스키 코드를 알게 되었고 공부를 하게 되었다. (https://almotjalal.tistory.com/22) 공부를 한 뒤 코드를 짜 보니 char형과 int형이 구분되었고 char형 데이터를 int형 데이터로 바꾸는 작업도 성공했다. 그리고 순회(for)를 돌면서 숫자들이 쌓이면 자릿수가 변하므로 *10씩 곱해주었다. 약수 구하는 것은 5번 문제(진약수)와 비슷했다.  

 

#include <stdio.h>
#include <cstring> 
using namespace std;

int main(int argc, char** argv) {
	//freopen("input.txt", "rt", stdin);
	char a[51];
	int	num = 0, cnt = 0, i;
	scanf("%s", &a);
	
	for(i=0; i<strlen(a); i++){
		if((a[i]>=48) && (a[i]<=57)){
			num = num * 10 + (a[i]-'0');
		}
	}
	
	for(i=1; i<=num; i++) {
		if(num%i==0) cnt++;
	}
	
	printf("%d\n%d\n", num, cnt);
	return 0;
}

 

 그 결과 통과를 했다.

 


    사이트의 답안   

#include<stdio.h>
using namespace std;
int main(){
	//freopen("input.txt", "rt", stdin);
	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);
		}
	}
    
	printf("%d\n", res);
	for(i=1; i<=res; i++){
		if(res%i==0) cnt++;
	}
    
	printf("%d\n", cnt);
	return 0;
}
	

 

 사이트의 답안과 비슷한데 순회(for)문을 도는 과정에서 차이가 있었다. 배열에서 빈 인덱스는 '\0'으로 채워지는데 그것을 이용한 것이다. 나머지는 다 똑같은 논리였다.

 

'알고리즘 & 자료구조 > 기초 다잡기' 카테고리의 다른 글

8. 올바른 괄호  (0) 2020.09.02
7. 영어단어 복구  (0) 2020.09.02
5. 나이 계산  (0) 2020.09.01
4. 나이 차이  (0) 2020.09.01
3. 진약수의 합  (0) 2020.09.01

    5번 문제   

 

 

    내가 풀이한 답   

 

 문제를 보니 입력 예제의 맨 앞자리 두 자리 수와 "-" 뒤의 자리 수가 제일 중요하다는 느낌을 받았다. 나이를 계산할 때에는  <stdlib.h> 라이브러리의 atoi 함수를 이용하여 문자열을 숫자열로 바꿔주는 작업을 하였고 년도가 2019년으로 고정되어 있기 때문에 1900년생들은 119, 2000년대생들은 19를 기준으로 맨 앞자리 두 자리수를 빼서 +1을 붙여주면 됐고 성별을 알기 위해서는 "-" 뒤의 숫자가 무엇에 해당하는지만 확인하면 됐고 문제에서 주어진대로 1, 2, 3, 4 총 4가지 경우의 수만 생각을 하고 코드를 짰다. 

 

#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;

int main(int argc, char** argv) {
	string s;
	cin >> s;
	
	int age = atoi(s.substr(0, 2).c_str());
	int gender = atoi(s.substr(7, 1).c_str());
	
	if(gender == 1) cout << 119 - age + 1 << " M" << endl;
	else if(gender == 2) cout << 119 - age + 1 << " W" << endl;
	else if(gender == 3) cout << 19 - age + 1 << " M" << endl;
	else cout << 19 - age + 1 << " W" << endl;
	
	return 0;
}

 

 그 결과 통과를 했다.

 


    사이트의 답안   

#include <stdio.h>
int main(){
	char a[20];
	int year, age;
	scanf("%s", &a);
	
	if(a[7]=='1' || a[7]=='2') year=1900+((a[0]-48)*10+(a[1]-48));
	else year=2000+((a[0]-48)*10+(a[1]-48));
	
	age=2019-year+1;
	printf("%d ", age);
	
	if(a[7]=='1' || a[7]=='3') printf("M\n");
	else printf("W\n");
    
	return 0;
}

 

 강의에서 <iostream> 보다는 <stdio.h>를 쓰는 것이 입출력면에서 훨씬 성능이 좋다고 하였다. 나도 이제부터는 <stdio.h>로 바꾸어서 코드를 짜는 습관을 들여야겠다. 그리고 C++을 너무 오랜만에 만져서 그런지 char 배열로 해결할 수 있는 것을 string으로만 해결하려고 했던 행동을 반성하게 되었다. 어쩐지 비교연산자를 쓸 때 힘들게 되더라니...  그리고 강의에서는 아스키 코드를 썼다. 0은 48이고 1씩 증가하여 9는 57이 된다. 나머지는 논리적으로 다를게 없었다. 

 

 

 

 

    정리   

#include <stdio.h>   // scanf 함수를 쓰기 위한 라이브러리(iostream) 대체
#include <stdlib.h>  // atoi 함수를 쓰기 위한 라이브러리
#include <string>    // substr 함수를 쓰기 위한 라이브러리

1. 문자열을 잘라서 숫자로 바꿔주기

    // substr 문자열을 잘라주는 함수
    // atoi 해당 문자열을 숫자로 바꿔주는 함수
	int age = atoi(s.substr(0, 2).c_str());
	int gender = atoi(s.substr(7, 1).c_str());
    
 
2. 다음부터는 string 대신에 cahr[]도 고려할 것
    char a[20];


3. cin, cout 객체 대신에 scanf("%s", &a), printf("%d ", age) 함수를 사용할 것

 

 

'알고리즘 & 자료구조 > 기초 다잡기' 카테고리의 다른 글

7. 영어단어 복구  (0) 2020.09.02
6. 숫자만 추출  (0) 2020.09.01
4. 나이 차이  (0) 2020.09.01
3. 진약수의 합  (0) 2020.09.01
2. A부터 B까지의 자연수의 합  (0) 2020.09.01

    4번 문제   

 

 

    내가 풀이한 답   

 보자마자 풀이가 2개 떠올랐다. 하나는 각 입력들은 배열에 담아 sort 함수를 이용해 정렬을 하는 방법이었고 또 하나는 입력된 숫자만큼 순회(for)를 돌면서 최솟값과 최댓값을 업데이트하는 방법이다.

 

 먼저 배열에 담아 sort 함수를 이용해 정렬하는 코드는 다음과 같다. sort 함수를 사용하기 위해서는 표준 템플릿 라이브러리(STL)을 사용해야 하므로 algorithms 라이브러리를 #include 헤더에 포함시켜준다. 그리고 배열을 사람 개수만큼 동적으로 할당해주고 sort 함수를 사용해 배열을 오름차순으로 정렬해준다. 마지막 째 배열 요소와 첫 번째 배열 요소를 빼준 값을 출력해준다. 마지막으로 동적으로 생성한 배열을 해제하기 위해 delete[]를 선언한다.(delete와 delete[]의 차이점은 단일 객체와 배열 객체 각각의 원소의 차이로 소멸자 생성과 메모리 환원을 한다고 대강 알고 있지만 나중에 따로 블로그에 자세히 정리해 보는걸로...)

 

#include <iostream>
#include <algorithm>
using namespace std;

int main(int argc, char** argv) {
	int n;
	cin >> n;
	int *array = new int[n];
	
	for(int i=0; i<n; i++){
		cin >> array[i];
	}
	
	sort(array, array+n);
	
	cout << array[n-1] - array[0] << endl;
	
	delete[] array;
	return 0;
}

 

 두 번째 방법은 STL을 안쓰는 방법... 순회(for)를 돌면서 최솟값과 최댓값을 업데이트하는 방법이다. 최솟값인 min은 나이를 최대 100살까지로 고려해서 100으로 설정하였고 최댓값인 max는 음수가 아닌 제일 작은 값인 0으로 설정하였다.

#include <iostream>
using namespace std;

int main(int argc, char** argv) {
	int n, a, min=100, max=0;
	cin >> n;
	
	for(int i=0; i<n; i++){
		cin >> a;
		
		if(a > max) max = a;
		if(a < min) min = a;
	}
	
	cout << max - min << endl;
	
	return 0;
}

 

 

 두 방법 모두 통과를 했다.

 

 

    사이트의 답안   

#include<iostream>
using namespace std;
int main(){
	int n, i, a, max=-2147000000, min=2147000000;
	cin>>n;
	for(i=1; i<=n; i++){
		cin>>a;
		if(a>max) max=a;
		if(a<min) min=a;
	}
	cout<<max-min;
	return 0;
}

 

 사이트의 답안은 두 번째 방법과 똑같은 것을 확인할 수 있다.

'알고리즘 & 자료구조 > 기초 다잡기' 카테고리의 다른 글

6. 숫자만 추출  (0) 2020.09.01
5. 나이 계산  (0) 2020.09.01
3. 진약수의 합  (0) 2020.09.01
2. A부터 B까지의 자연수의 합  (0) 2020.09.01
1. 1부터 N까지의 수 중 M의 배수 합  (0) 2020.08.31