No. 11720

#include<stdio.h>
int main()
{
	int n, i, sum = 0;
	scanf("%d", &n);
	char number[100];
	scanf("%s", number);
	for (i = 0; i < n; i++) {
		sum += number[i] - '0';
	}
	printf("%d", sum);
	
}

<코드 설명>

  먼저 입력받을 숫자의 개수인 n을 입력받는다. 그리고 배열 number을 입력받는다. 입력받은 수의 개수인 n만큼을 for문을 통해 반복시켜 그 안에서 sum값을 구한다. sum에는 number의 원소들을 계속 더해주는데 처음 입력받을 때 char형으로 입력받았기 때문에 숫자로 변환시켜주기 위해 '0'을 빼줘야한다. 이 과정을 거쳐 구해진 sum을 출력해준다.

 

<실행 결과>

 

No. 1085

#include<stdio.h>
int main()
{
	int x, y, w, h, min;
	scanf("%d %d %d %d", &x, &y, &w, &h);
	min = x;
	if (min > y) min = y;
	if (min > w - x) min = w - x;
	if (min > h - y) min = h - y;
	printf("%d", min);
	return 0;
}

<코드 설명>

 x, y, w, h를 입력 받고 일단 min을 x로 설정한다. 이는 다른 값과 계속 비교하면서 min을 갱신하기 위함이다. 경계에 도착하는 최소 길이이기 때문에 x, y, w-x, h-y 중 가장 작은 값이 답이 된다. 따라서 min값과 나머지 y, w-x, h-y를 비교해주며 가장 작은 값을 찾아 min에 넣어주었다. 그리고 이를 출력해주었다.

 

<실행 결과>

 

No. 10250

#include<stdio.h>
int main()
{
	int t, h, w, n, i, cnt;
	scanf("%d", &t);
	for (i = 0; i < t; i++) {
		cnt = 1;
		scanf("%d %d %d", &h, &w, &n);
		while (n > h) {
			n = n - h;
			cnt++;
		}
		printf("%d%02d\n", n, cnt);
	}
	return 0;
}

<코드 설명>

 test case인 t를 입력받고 그만큼 for문을 이용해 반복시킨다. 그 내에서 h, w, n을 각 각 입력받는다. 방 배정이 1층부터 위쪽으로 채워지므로 n에서 h를 빼주며 몇번 빠졌는지를 cnt에 저장해주었다. 이는 몇호인지 체크하기 위함이다. n에서 계속 건물의 높이인 h를 빼주면 마지막에 남은 n값이 몇층인지를 결정해준다.

  따라서 n과 cnt를 붙여 출력해주었다. 이때 cnt는 %02d로 출력해주어 무조건 두자리로 출력되도록 하였다.

 

<실행 결과>

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

[BOJ] 1929 소수 구하기  (0) 2022.04.02
[BOJ] 10828 스택  (0) 2022.04.02
[SISS] C 백준 7주차 (10809, 10818, 10871)  (0) 2022.02.08
[SISS] C 백준 6주차 (2908, 2920, 3052)  (0) 2022.02.01
[SISS] C 백준 5주차 (2742, 2753, 2884)  (0) 2022.01.30

No. 10809

#include<stdio.h>
#include<string.h>
int main()
{
	int cnt[27], i, j;
	char s[101];
	scanf("%s", s);
	for (i = 0; i < 26; i++) {
		cnt[i] = -1;
	}
	for (i = 'a'; i <= 'z'; i++) {
		for (j = 0; j < strlen(s); j++) {
			if (s[j] == i) {
				cnt[s[j] - 'a'] = j;
				break;
			}
		}
	}
	for (i = 0; i < 26; i++) {
		printf("%d ", cnt[i]);
	}
}

<코드 설명>

  먼저 s를 입력받은 후 일단 cnt배열에 모든 원소를 -1로 저장해 놓는다. 이중 for문을 이용해 a부터 z까지 값과 s의 원소가 동일한지를 비교해주었다. 동일하다면 cnt배열에 순서값인 j를 넣어준다. 이때 s[j]-'a'번째 원소에 넣어주는 이유는 알파벳 a에 해당하는 값이 97이므로 이 값을 빼주어야 내가 원하는 위치에 해당 값을 넣어줄 수 있다. 

  이렇게 완성된 cnt배열을 출력해주어 원하는 값을 얻을 수 있었다.

 

<실행 결과>

 

No. 10818

#include<stdio.h>
int main()
{
	int n, i, max=-9999999,min=999999999,num;
	scanf("%d", &n);
	for (i = 0; i < n; i++) {
		scanf("%d", &num);
		if (max < num) max = num;
		if (min > num) min = num;
	}
	printf("%d %d", min, max);
	return 0;
}

<코드 설명>

  입력할 숫자의 개수인 n을 입력 받고 그만큼을 for문을 이용해 입력받는다. 그리고 max와 min을 각각 아주 작은, 아주 큰 수로 지정해 놓았다.

  for문 내에서 max가 입력받은 num보다 작으면 그 수를 max에 저장해준다. 그리고 min이 입력받은 num보다 크면 그 수를 min에 저장해준다.

  이러한 방식으로 모든 수를 확인해주고 최종적으로 max와 min에 저장된 수를 출력해주었다.

 

<실행 결과>

 

No. 10871

#include<stdio.h>
int main()
{
	int n, x, i, num;
	scanf("%d %d", &n, &x);
	for (i = 0; i < n; i++) {
		scanf("%d", &num);
		if (num < x) printf("%d ", num);
	}
}

<코드 설명>

  첫 줄에 입력할 수열의 개수인 n과 정수 x를 입력받는다. 그리고 n만큼 입력받기 위해 for문을 이용해 주었다. num들을 입력 받을 때마다 x보다 작은 지 확인해주고 작다면 이를 출력해주었다.

 

<실행 결과>

No. 2908

#include<stdio.h>
int reverse(n);
int main()
{
	int a, b;
	scanf("%d %d", &a, &b);
	if (reverse(a) > reverse(b)) {
		printf("%d", reverse(a));
	}
	else {
		printf("%d", reverse(b));
	}
}
int reverse(n) {
	int r = 0;
	while (n) {
		r = (r * 10) + (n % 10);
		n = n / 10;
	}
	return r;
}

코드 설명 : 두 수 a, b를 입력 받고 reverse라는 함수를 만들어 a, b를 인자로 넣어주었다. reverse 함수는 r에 r*10 + n%10을 저장해주고 이 과정을 n번 반복시켜주었다. 이 함수를 통해 숫자를 뒤집어서 반환할 수 있다. reverse(a)와 reverse(b)를 비교하여 더 큰 것을 출력하도록 했다.

 

 

No. 2920

#include<stdio.h>
int main()
{
	int arr[9], a = 1, d = 8;
	for (int i = 0; i < 8; i++) {
		scanf("%d", &arr[i]);
	}
	for (int i = 0; i < 8; i++) {
		if (arr[i] == a){
			a++;
		}
	}
 	if (a > 8) {
		printf("ascending");
		return 0;
	}
	else {
		for (int i = 0; i < 8; i++) {
			if (arr[i] == d){
				d--;
			}
		}
		if (d < 1) {
			printf("descending");
			return 0;
		}
		else printf("mixed");
	}
	
}

코드 설명 : 8개의 숫자를 입력받고 그 수가 ascending인지 판별하기 위해 a라는 변수를 만들어 입력받은 원소가 차례대로 1부터 1씩 증가하는지 확인하도록 하였다. 그래서 최종적으로 a가 8보다 커지면 ascending에 해당하므로 이를 출력하도록 했다. 이에 해당하지 않는다면 이번에는 d라는 변수를 만들어 8부터 차례대로 1씩 감소하는지 확인하도록 하였다. 최종적으로 d가 1보다 작아진다면 descending에 해당하므로 이를 출력하도록 하였다. 앞에 두 경우에 모두 해당하지 않는다면 mixed를 출력하도록 하였다.

 

 

 

No. 3052

#include<stdio.h>
int main()
{
	int i, n, arr[42] = { 0 }, cnt = 0;
	for (i = 0; i < 10; i++) {
		scanf("%d", &n);
		n = n % 42;
		arr[n]++;
	}
	for (i = 0; i < 42; i++) {
		if (arr[i] >= 1) {
			cnt++;
		}
	}
	printf("%d", cnt);
}

코드 설명 : 배열 arr[42]의 모든 원소를 0으로 초기화해주었다. 10개의 수 n을 입력받아 각자 42로 나눈 나머지를 저장하고 arr 배열의 n번째 원소에 1씩 추가해주었다. 이 배열의 모든 원소를 for문으로 모두 확인하도록 하였다. 원소가 1보다 크거나 같으면 cnt값을 증가시켜주었다. 이는 서로 다른 값이 몇 개 있는지를 알기 위함이다. 그리고 마지막에 cnt값을 출력시켜주었다.

No. 2742

#include<stdio.h>
int main()
{
	int n;
	scanf("%d", &n);
	while (n > 0) {
		printf("%d\n", n);
		n--;
	}
}

코드 설명 : 먼저 n을 입력받았다. n이 0보다 클때까지 계속 n을 출력하도록하고 n을 1씩 줄이도록 반복문을 실행시켜주었다. 출력될 때마다 줄바꿈 또한 해주었다.

 

 

No. 2753

#include<stdio.h>
int main()
{
	int y;
	scanf("%d", &y);
	if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) printf("1");
	else printf("0");
}

코드 설명 : 연도를 입력받고 if문으로 이 연도가 4의 배수이면서 100의 배수가 아닌지, 또는 이 연도가 400의 배수인지 확인하고 맞다면 1을 출력하도록 하였다. 이 조건을 만족하지 않는다면 0을 출력하도록 하였다.

 

 

No. 2884

#include<stdio.h>
int main()
{
	int h, m;
	scanf("%d %d", &h, &m);
	if (m >= 45) m -= 45;
	else {
		if (h == 0) h = 23;
		else h -= 1; m += 15;
	}
	printf("%d %d", h, m);
}

코드 설명 :  h와 m을 입력받았다. 각 시, 분을 의미하는 변수이다. 45분 이상일 때에는 h 변화 없이 m만 45를 빼주면 된다. 45분 미만일 때 h가 0이면 23으로 바꿔주고 0이 아니면 h에서 1빼주고 m은 60분에서 45분을 뺀 후에 원래 m값을 더해주면 되므로 m+=15를 해주면 값이 나온다. 따라서 이를 출력해주었다.

+ Recent posts