본문 바로가기

Coding Tests/백준 온라인

(C언어) 백준온라인 7568번(덩치)

<문제>

https://www.acmicpc.net/problem/7568

 

 

<풀이>

#include<stdio.h>
int main(void)
{
	int N, i, j, k;
	int arr[50][2];
	scanf("%d", &N);

	for (i = 0; i < N; i++) {
			scanf("%d %d", &arr[i][0],&arr[i][1]);
		}
	
	for (i = 0; i < N; i++) {
		k = 0;
		for (j = 0; j < N; j++)
			if (arr[i][0] < arr[j][0] && arr[i][1] < arr[j][1])
		     k++;
		printf("%d ", ++k);
	}
	return 0;

}

처음에는 키, 몸무계 따로 배열을 생성하려고 했으나 이차원배열이 조금 더 어울리다는 생각이 들어 이차원배열로 입력값을 받게 되었다. 몸무계와 키 만을 첫번째 두번째 줄에 입력 받으니, [ i ][ 0 ]과 [ i ][ 1 ]의 코드를 작성해 미리 가로의 인덱스 넘버를 설정해 주었다. 

 

arr[i][0] 몸무계 arr[i][1] 키
[ 0 ][ 0 ]55 [ 0 ][ 1 ]185
[ 1 ][ 0 ]58 [ 1 ][ 1 ]183
[ 2 ][ 0 ]88 [ 2 ][ 1 ]186
[ 3 ][ 0 ]60 [ 3 ][ 1 ]175
[ 4 ][ 0 ]46 [ 4 ][ 1 ]155

 

<가장 이해가 되지 않았던 부분>

for (i = 0; i < N; i++) {
		k = 0;
		for (j = 0; j < N; j++)
			if (arr[i][0] < arr[j][0] && arr[i][1] < arr[j][1])
		     k++;
		printf("%d ", ++k);
	}

 

<해설>

i = 0일때 즉 [ 0 ][ 0 ]55와 [ 0 ][ 1 ]185 일때,  j값이 for문에 의해 증가하면서 몸무계: [0][0]~[4][0], 키:[0][1]~[4][1]까지 5번(N = 5일때) 비교연산을 진행하게 된다.  if문의 조건이 맞다면 k값이 증가하게 된다. 반복이 되는 동안 if문의 조건이 성립 하지 않는다면 k값은 그대로 0을 유지 할테고 그말은 나보다 덩치가 큰사람은 없다는 것이고, 나보다 덩치가 큰사람에 대한 나의 등수는 k + 1등 이므로 마지막 출력을 할 시에 +1을 해준것이다. 조금 쉽게 생각해, 0등은 없으므로 마지막 출력을 할때 +1을 해준것이다. 

 

이렇게 i = 0,1,2,3,4일때의 경우를 모두 진행하여 줌으로써, 5명의 덩치등수를 빠짐없이 비교할 수 있는것이다. 

 

<2차원 배열을 사용하지 않은 풀이>

#include<stdio.h>
int main(void) {
	int n;
	scanf("%d", &n);
	int W[50];
	int H[50];
	for (int i = 0; i < n; i++) {
		scanf("%d %d", &W[i], &H[i]);
	}
     
	for (int i = 0; i < n; i++) {
		int k = 0;
		for (int j = 0; j < n; j++) {
			if (W[i] < W[j] && H[i] < H[j])
				k++;
		}
		printf("%d ", k + 1);
	}
	return 0;
}