37번 문제   

 

 

 



    내가 풀이한 답   

 앞에서 

#include <stdio.h>
#include <stdlib.h>

int main() {
	//freopen("input.txt", "rt", stdin);
	int n, m, i, a, j, idx, flag = -1;
	scanf("%d %d", &n, &m);
	
	int *arr = (int *)malloc(sizeof(int) * n);
	
	for(i=0; i<m; i++){
		scanf("%d", &a);
		flag = -1;
		for(j=0; j<n; j++){
			if(arr[j] == a) {
				idx = j;
				flag = 1;
			}
		}
		
		if(flag == 1){
			for(j=idx-1; j>=0; j--){
				arr[j+1] = arr[j];
			}
		}
		else {
			for(j=n-2; j>=0; j--){
				 arr[j+1] = arr[j];
			}
		}
		arr[0] = a;
	}
	
	for(i=0; i<n; i++){
		printf("%d ", arr[i]);
	}
    
    	free(arr);
	return 0;
}

 

 결과는 통과하였다.

 

 



    사이트의 답안   

#include <stdio.h>
int C[20];
int main() {
	freopen("input.txt", "rt", stdin);
	int s, n, a, i, j, pos;
	scanf("%d %d", &s, &n);
	for(i=1; i<=n; i++){
		scanf("%d", &a);
		pos=-1; 
		for(j=0; j<s; j++) if(C[j]==a) pos=j;
		if(pos==-1){
			for(j=s-1; j>=1; j--) C[j]=C[j-1];
		}
		else{
			for(j=pos; j>=1; j--) C[j]=C[j-1];
		}
		C[j]=a;
	}
	for(i=0; i<s; i++) printf("%d ", C[i]);
	return 0;
}

 

 

 

'알고리즘 & 자료구조 > 정렬' 카테고리의 다른 글

36. 삽입정렬  (0) 2020.09.11
35. Special Sort(구글 인터뷰)  (0) 2020.09.11
34. 버블정렬  (0) 2020.09.11
33. 3등의 성적은?  (0) 2020.09.11
32. 선택정렬  (0) 2020.09.11

    36번 문제   

 

 



    내가 풀이한 답   

 앞에서 

#include <stdio.h>
#include <stdlib.h>

int main() {
	freopen("input.txt", "rt", stdin);
	
	int n, i, j, key, temp;
	scanf("%d", &n);
	
	int *arr = (int *)malloc(sizeof(int) * n);
	
	for(i=0; i<n; i++){
		scanf("%d", &arr[i]);
	}
	
	for(i=1; i<n; i++){
		key = i;
		for(j=i-1; j>=0; j--){
			if(arr[key] < arr[j]){
				temp = arr[key];
				arr[key] = arr[j];
				arr[j] = temp;
				key--;
			}
		}
	}
	
	for(i=0; i<n; i++){
		printf("%d ", arr[i]);
	}
	
	free(arr);
	return 0;
}

 

 결과는 통과하였다.

 

 



    사이트의 답안   

#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;
int main(){
	freopen("input.txt", "rt", stdin);
	int a[100], n, tmp, i, j;
	scanf("%d", &n);
	for(i=0; i<n; i++){
		scanf("%d", &a[i]);
	}
	for(i=1; i<n; i++){
		tmp=a[i];
		for(j=i-1; j>=0; j--){
			if(a[j]>tmp) a[j+1]=a[j];
			else break;
		}
		a[j+1]=tmp;
	}
	for(i=0; i<n; i++){
		printf("%d ", a[i]);
	}	
	return 0;
}

 

'알고리즘 & 자료구조 > 정렬' 카테고리의 다른 글

37. Least Recently Used(카카오 캐시 문제 변형)  (0) 2020.09.12
35. Special Sort(구글 인터뷰)  (0) 2020.09.11
34. 버블정렬  (0) 2020.09.11
33. 3등의 성적은?  (0) 2020.09.11
32. 선택정렬  (0) 2020.09.11

    35번 문제   

 

 



    내가 풀이한 답   

 앞에서 

#include <stdio.h>
#include <stdlib.h>

int main() {
	//freopen("input.txt", "rt", stdin);
	
	int n, i, j, temp, idx, con = 0;
	scanf("%d", &n);
	int *arr = (int *)malloc(sizeof(int) * n);
	
	for(i=0; i<n; i++){
		scanf("%d", &arr[i]);
	}
	
	for(i=0; i<n; i++){
		if(arr[i] < 0){
			idx = i;
			for(j=i-1; j>=con; j--){
				temp = arr[j];
				arr[j] = arr[idx];
				arr[idx] = temp;
				idx--;
			}
			con++;
		}
	}
	
	for(i=0; i<n; i++){
		printf("%d ", arr[i]);
	}
	
    free(arr);
	return 0;
}

 

 결과는 통과하였다.

 

 



    사이트의 답안   

#include<stdio.h>
int main() {
	freopen("input.txt", "rt", stdin);
	int a[101], n, tmp, min, i, j;
	scanf("%d", &n);
	for(i=0; i<n; i++){
		scanf("%d", &a[i]);
	}
	for(i=0; i<n-1; i++){
		for(j=0; j<n-i-1; j++){
			if(a[j]>0 && a[j+1]<0){
				tmp=a[j];
				a[j]=a[j+1];
				a[j+1]=tmp;
			}
		}
	}
	for(i=0; i<n; i++){
		printf("%d ", a[i]);
	}
	return 0;
}



 

 

'알고리즘 & 자료구조 > 정렬' 카테고리의 다른 글

37. Least Recently Used(카카오 캐시 문제 변형)  (0) 2020.09.12
36. 삽입정렬  (0) 2020.09.11
34. 버블정렬  (0) 2020.09.11
33. 3등의 성적은?  (0) 2020.09.11
32. 선택정렬  (0) 2020.09.11

    34번 문제   

 

 



    내가 풀이한 답   

 앞에서 풀었던 선택정렬을 바탕으로 오름차순으로 정렬을 한 다음 뒤에서 부터 순회(for)를 통해 각각의 요소를 접근하면서 동점자를 제외하고 점수가 다르면 count 변수를 증가시켜 count 변수가 3이 되는 시점의 index의 해당 요소를 출력하였다.

#include <stdio.h>
#include <stdlib.h>

int main() {
	freopen("input.txt", "rt", stdin);
	int n, i, j, temp;
	scanf("%d", &n);
	
	int *arr = (int *)malloc(sizeof(int) * n);
	
	for(i=0; i<n; i++){
		scanf("%d", &arr[i]);
	}
	
	for(i=n-1; i>0; i--){
		for(j=0; j<i; j++){
			if(arr[j] > arr[j+1]){
				temp = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = temp;
			}
		}
	}

	for(i=0; i<n; i++){
		printf("%d ", arr[i]);
	}

	free(arr);
	return 0;
}

 

 결과는 통과하였다.

 

 



    사이트의 답안   

#include<stdio.h>
int main() {
	freopen("input.txt", "rt", stdin);
	int a[101], n, tmp, idx, i, j, cnt=0;
	scanf("%d", &n);
	for(i=0; i<n; i++){
		scanf("%d", &a[i]);
	}
	for(i=0; i<n-1; i++){
		idx=i;
		for(j=i+1; j<n; j++){
			if(a[j]>a[idx]) idx=j;
		}
		tmp=a[i];
		a[i]=a[idx];
		a[idx]=tmp;
	}
	for(i=1; i<n; i++){
		if(a[i-1]!=a[i]) cnt++;
		if(cnt==2){
			printf("%d\n", a[i]);
			break;
		}
	}
	return 0;
}

 

  사이트의 답은 선택정렬을 이용해 내림차순으로 정렬한 다음 처음 숫자가 아닌 다음 숫자부터 같은 숫자가 아니면 count 변수를 증가시켜 count 변수가 2인 index의 요소를 출력하였다.

 

 

'알고리즘 & 자료구조 > 정렬' 카테고리의 다른 글

37. Least Recently Used(카카오 캐시 문제 변형)  (0) 2020.09.12
36. 삽입정렬  (0) 2020.09.11
35. Special Sort(구글 인터뷰)  (0) 2020.09.11
33. 3등의 성적은?  (0) 2020.09.11
32. 선택정렬  (0) 2020.09.11

    33번 문제   

 

 



    내가 풀이한 답   

 앞에서 풀었던 선택정렬을 바탕으로 오름차순으로 정렬을 한 다음 뒤에서 부터 순회(for)를 통해 각각의 요소를 접근하면서 동점자를 제외하고 점수가 다르면 count 변수를 증가시켜 count 변수가 3이 되는 시점의 index의 해당 요소를 출력하였다.

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv) {
	//freopen("input.txt", "rt", stdin);

	int n, i, j, temp, idx, cnt = 0;
	scanf("%d", &n);
	int *arr = (int *)malloc(sizeof(int) * n);
	
	for(i=0; i<n; i++){
		scanf("%d", &arr[i]);
	}
	
	for(i=0; i<n-1; i++){
		idx = i;
		for(j=i+1; j<n; j++){
			if(arr[idx] > arr[j]){
				idx = j;
			}
		}
		temp = arr[i];
		arr[i] = arr[idx];
		arr[idx] = temp;
	}
	
	
	for(i=n-1; i>=0; i--){
		if(arr[i] != arr[i-1]) cnt++;
		if(cnt==3) {
			idx = i;
			break;	
		}
	}
	printf("%d", arr[idx]);
    	free(arr);
	return 0;
}

 

 결과는 통과하였다.

 

 



    사이트의 답안   

#include<stdio.h>
int main() {
	freopen("input.txt", "rt", stdin);
	int a[101], n, tmp, idx, i, j, cnt=0;
	scanf("%d", &n);
	for(i=0; i<n; i++){
		scanf("%d", &a[i]);
	}
	for(i=0; i<n-1; i++){
		idx=i;
		for(j=i+1; j<n; j++){
			if(a[j]>a[idx]) idx=j;
		}
		tmp=a[i];
		a[i]=a[idx];
		a[idx]=tmp;
	}
	for(i=1; i<n; i++){
		if(a[i-1]!=a[i]) cnt++;
		if(cnt==2){
			printf("%d\n", a[i]);
			break;
		}
	}
	return 0;
}

 

  사이트의 답은 선택정렬을 이용해 내림차순으로 정렬한 다음 처음 숫자가 아닌 다음 숫자부터 같은 숫자가 아니면 count 변수를 증가시켜 count 변수가 2인 index의 요소를 출력하였다.

 

 

'알고리즘 & 자료구조 > 정렬' 카테고리의 다른 글

37. Least Recently Used(카카오 캐시 문제 변형)  (0) 2020.09.12
36. 삽입정렬  (0) 2020.09.11
35. Special Sort(구글 인터뷰)  (0) 2020.09.11
34. 버블정렬  (0) 2020.09.11
32. 선택정렬  (0) 2020.09.11

    32번 문제   

 

 



    내가 풀이한 답   

 

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv) {
	freopen("input.txt", "rt", stdin);

	int n, i, j, min, idx, temp;
	scanf("%d", &n);
	int *arr = (int *)malloc(sizeof(int) * n);
	
	for(i=0; i<n; i++){
		scanf("%d", &arr[i]);
	}
	
	for(i=0; i<n-1; i++){
		min = arr[i];
		idx = i;
		for(j=i+1; j<n; j++){
			if(min > arr[j]){
				min = arr[j];
				idx = j;
			}
		}
		temp = arr[i];
		arr[i] = min;
		arr[idx] = temp;
	}
	
	for(i=0; i<n; i++){
		printf("%d ", arr[i]);
	}

	free(arr);
	return 0;
}

 

 결과는 통과하였다.

 

 



    사이트의 답안   

#include<stdio.h>
int main() {
	freopen("input.txt", "rt", stdin);
	int a[101], n, tmp, idx, i, j;
	scanf("%d", &n);
	for(i=0; i<n; i++){
		scanf("%d", &a[i]);
	}
	for(i=0; i<n-1; i++){
		idx=i;
		for(j=i+1; j<n; j++){
			if(a[j]<a[idx]) idx=j;
		}
		tmp=a[i];
		a[i]=a[idx];
		a[idx]=tmp;
	}
	for(i=0; i<n; i++){
		printf("%d ", a[i]);
	}
	return 0;
}

 

  사이트의 답과 비슷하지만 내 코드에서 굳이 min 값을 따로 설정해 둘 필요가 없었단 걸 깨달았다...

 

 


 

    정리   

 

 위의 입력 예시를 그림으로 정리해보았다. 

 

'알고리즘 & 자료구조 > 정렬' 카테고리의 다른 글

37. Least Recently Used(카카오 캐시 문제 변형)  (0) 2020.09.12
36. 삽입정렬  (0) 2020.09.11
35. Special Sort(구글 인터뷰)  (0) 2020.09.11
34. 버블정렬  (0) 2020.09.11
33. 3등의 성적은?  (0) 2020.09.11

    31번 문제   

 

 

 



    내가 풀이한 답   

 CaHb(1<=a=b<=100)와 같이 형식이 정해져 있으므로 단순하게 생각했다. 처음 C는 모두 공통이라 생각했고 H의 인덱스에 따라서 a와 b 값을 구하고 a에는 12를 b에는 1을 곱해서 둘이 더하는 방법을 사용하였다. 

 

#include <stdio.h>
#include <cstring>

char arr[8];
int main(int argc, char** argv) {
	//freopen("input.txt", "rt", stdin);
	scanf("%s", &arr);
	
	int i, k = 1, idx, temp, res;
	
	for(i=1; i<strlen(arr); i++){
		if(arr[i] == 'H') idx = i;
	}
	
	if(idx == 1) temp = 12;
	else {
		for(i=idx-1; i>0; i--){
			temp += (arr[i]-'0') * k;
			k *= 10;
		}
		temp *= 12;
	}
	
	if(idx == strlen(arr) -1) res += 1;
	else {
		k = 1;
		for(i=strlen(arr)-1; i>idx; i--){
			res += (arr[i]-'0') * k;
			k *= 10;
		}
	}
	
	res += temp;
	printf("%d", res);
	
	return 0;
}

 

 결과는 통과하였다.

 

 



    사이트의 답안   

#include<stdio.h>
int main(){
	//freopen("input.txt", "rt", stdin);
	char a[10];
	int c=0, h=0, i, pos;
	scanf("%s", &a);
	if(a[1]=='H'){
		c=1;
		pos=1;
	}
	else{
		for(i=1; a[i]!='H'; i++){
			c=c*10+(a[i]-48);
		}
		pos=i;
	}
	if(a[pos+1]=='\0') h=1;
	else{
		for(i=pos+1; a[i]!='\0'; i++){
			h=h*10+(a[i]-48);
		}
	}
	printf("%d\n", c*12+h);	
	return 0;
}

 

  사이트의 답도 H를 기준으로 코드를 짠 것을 확인하였다. 

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

30. 3의 개수는?(large)  (0) 2020.09.08
29. 3의 개수는?(small)  (0) 2020.09.08
28. N!에서 0의 개수  (0) 2020.09.08
27. N!의 표현법  (0) 2020.09.08
26. 마라톤  (0) 2020.09.08

    30번 문제   

 

 



    내가 풀이한 답   

  앞의 문제와 동일한 코드로 채점해봤지만 역시 Time_Limit이 났다. 

#include <stdio.h>

int main(int argc, char** argv) {
	//freopen("input.txt", "rt", stdin);

	int n, i, temp, cnt=0;
	scanf("%d", &n);
	
	for(i=1; i<=n; i++){
		temp=i;
		while(temp>0){
			if(temp%10==3) cnt++;
			temp /= 10;
		}
	}
	
	printf("%d", cnt);
	
	return 0;
}

 

 순회문(for, while) 하나로 작성하기에는 어떤 특정한 논리가 필요한데 생각나지 않아서 강의 초반부를 참고했다. 논리는 다음과 같다. 

 

 핵심은 자리 수를 기준으로 입력받은 수를 left, cur, right로 구분하고 cur의 숫자에 따라 공식이 달라진다는 것이다. 위의 아래 그림에서 k가 10이므로 cur은 10의 자리 숫자를 가리킨다.(아래 그림에선 각각 7, 3, 1) 이 cur을 기준으로 왼쪽은 left, 오른쪽은 right로 설정한다. 그리고 cur을 기준으로 공식을 설정한다. 

 

 

 4377을 예로 들면 흐름은 다음과 같다. 

 



    사이트의 답안   

#include<stdio.h>
int main(){
	//freopen("input.txt", "rt", stdin);
	int n, left=77, right, cur, k=1, res=0;
	scanf("%d", &n);
	
    while(left != 0){
		left=n/(k*10);
		right=n%k;
		cur=(n/k)%10;
		if(3<cur){
			res=res+((left+1)*k);
		}
		else if(3==cur){
			res=res+((left*k)+(right+1));
		}
		else res=res+(left*k);	
		k=k*10;
	}
	
    printf("%d\n", res);
	return 0;
}

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

31. 탄화수소 질량  (0) 2020.09.08
29. 3의 개수는?(small)  (0) 2020.09.08
28. N!에서 0의 개수  (0) 2020.09.08
27. N!의 표현법  (0) 2020.09.08
26. 마라톤  (0) 2020.09.08

    29번 문제   

 

 



    내가 풀이한 답   

 n번 순회(for)를 돌며 i번째 수가 10으로 나눈 나머지가 3이면 값을 증가시키는 방법을 사용하였다. 

 

#include <stdio.h>

int main(int argc, char** argv) {
	//freopen("input.txt", "rt", stdin);

	int n, i, temp, cnt=0;
	scanf("%d", &n);
	
	for(i=1; i<=n; i++){
		temp=i;
		while(temp>0){
			if(temp%10==3) cnt++;
			temp /= 10;
		}
	}
	
	printf("%d", cnt);
	
	return 0;
}

 

 결과는 통과하였다.

 

 

 



    사이트의 답안   

#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;

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

 

  사이트의 답과 논리적으로 일치하였음을 확인했다.

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

31. 탄화수소 질량  (0) 2020.09.08
30. 3의 개수는?(large)  (0) 2020.09.08
28. N!에서 0의 개수  (0) 2020.09.08
27. N!의 표현법  (0) 2020.09.08
26. 마라톤  (0) 2020.09.08

 

    28번 문제   

 



    내가 풀이한 답   

 전 문제인 27번 문제와 상당히 유사하다고 생각했다. 일의 자리부터 0이 연속적으로 몇 개 있는지 알려면 2로 소인수분해 했을 때의 개수와 5로 소인수분해 했을 때의 개수가 필요하다고 생각했고 둘 중 작은 값이 0의 개수라고 생각하고 코드를 짰다. 

 

#include <stdio.h>

int arr[6];
int main(int argc, char** argv) {
	//freopen("input.txt", "rt", stdin);

	int n, i, temp, j;
	scanf("%d", &n);
	
	for(i=2; i<=n; i++){
		temp=i, j=2;
		while(j<6){
			if(temp%j==0){
				arr[j]++;
				temp /= j;
			}
			else j++;
		}
	}
	
	if(arr[2] <= arr[5]) printf("%d", arr[2]);
	else printf("%d", arr[5]);
	
	return 0;
}

 

 결과는 통과하였다.

 

 



    사이트의 답안   

#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;
int main(){
	freopen("input.txt", "rt", stdin);
	int n, i, j, tmp, cnt1=0, cnt2=0;
	scanf("%d", &n);
    
	for(i=2; i<=n; i++){
		tmp=i;
		j=2;
		while(1){
			if(tmp%j==0){
				if(j==2) cnt1++;
				else if(j==5) cnt2++;
				tmp=tmp/j;
			}
			else j++;
			if(tmp==1) break;
		}
	}
    
	if(cnt1<cnt2) printf("%d\n", cnt1);
	else printf("%d\n", cnt2);
	return 0;
}

 

  사이트의 답은 2의 개수와 5의 개수를 따로 변수를 설정하였다. 핵심적인 논리는 2와 5의 개수를 찾는 것으로 똑같았다. 

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

30. 3의 개수는?(large)  (0) 2020.09.08
29. 3의 개수는?(small)  (0) 2020.09.08
27. N!의 표현법  (0) 2020.09.08
26. 마라톤  (0) 2020.09.08
25. 석차 구하기  (0) 2020.09.08