본문 바로가기

알고리즘 문제

[C/C++ 백준 1138번] 한 줄로 서기 (Silver 1)

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

 

1138번: 한 줄로 서기

첫째 줄에 사람의 수 N이 주어진다. N은 10보다 작거나 같은 자연수이다. 둘째 줄에는 키가 1인 사람부터 차례대로 자기보다 키가 큰 사람이 왼쪽에 몇 명이 있었는지 주어진다. i번째 수는 0보다 �

www.acmicpc.net

키가 1인 친구부터 입력을 받을 때마다, 해당 친구들의 위치가 바로바로 전해진다(직접 한번 세워보자). 어차피 다음 입력값들은 지금까지 받은 입력보다 반드시 키가 크기 때문이다. 이를 이용하기 위해 memset함수를 이용해서 모든 배열값을 -1로 초기화해놓고, 빈자리를 카운트해서 새로들어오는 친구들의 위치를 계산해주면 된다.

 

#include <cstdio>
#include <cstring>
int main(void){
	int N, line[11], input, cnt; 
	scanf("%d", &N);
	memset(line, -1, 44);
	for(int i=1; i<=N; i++){
		scanf("%d", &input);
		if(i==1) line[input+1]=i;
		else{
			cnt=0;
			for(int j=1; j<=N; j++){
				if(line[j]==-1) cnt++;
				if(cnt==input+1 && line[j]==-1){//새 친구 자리 정해주는 부분 
					line[j]=i;
					break;
				}
			}
		}
	}
	for(int k=1; k<=N; k++) printf("%d ",line[k]);
	
}

 

cnt(빈 자리 카운트)가 input + 1이어야 하는 이유는 새 친구를 넣을 자리를 고려하기 위함 이고, 그래서 line[j]==-1이라는 조건도 붙는다.