본문 바로가기
백준 문제풀이

BOJ/2529

by alscks 2024. 1. 22.

부등호

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <stack>
#include <algorithm>



int main() {

	int num;
	scanf("%d", &num);

	char bu[10];
	for (int i = 0; i < num; i++) {
		scanf(" %c", &bu[i]); // 왜 앞을 띄워야 하는가..?
	}
	
	int big[10]; // 가장 큰 경우는 9876..
	int x = 9;
	for (int j = 0; j<=num; j++) {
		big[j] = x;
		x--;
	}

	while (1) {//만들어진 big배열을 입력받은 부등호로 확인
		int okflag = 0;
		for (int i = 0; i < num; i++) {
			if (bu[i] == '<') {
				if (big[i] > big[i + 1]) {
					//printf("hi");
					okflag = 1;
					break;
				}
			}
			else {
				if (big[i] < big[i + 1]) {
					okflag = 1;
					break;
				}
			}
		}
		if (okflag == 0) {//모든 조건을 통과하면 탈출
			break;
		}
		std::prev_permutation(big, big + num + 1); //현재보다 작은 big배열을 확인하기 위해
	}

	int small[10]; // big과 반대
	for (int j = 0; j <=num; j++) {
		small[j] = j;
	}
	while (1) {
		int okflag = 0;
		for (int i = 0; i < num; i++) {
			if (bu[i] == '<') {
				if (small[i] > small[i + 1]) {
					//printf("hi");
					okflag = 1;
					break;
				}
			}
			else {
				if (small[i] < small[i + 1]) {
					okflag = 1;
					break;
				}
			}
		}
		if (okflag == 0) {
			break;
		}
		std::next_permutation(small, small + num + 1); // 현재보다 큰 배열을 확인
	}


	//출력
	for (int i = 0; i <= num; i++) {
		printf("%d", big[i]);
	}
	printf("\n");
	for (int i = 0; i <= num; i++) {
		printf("%d", small[i]);
	}
	
	return 0;
}​

 

< > 입력이 이상하게 받아져서 시간이 좀 걸렸다.

전지전능하신 Chat gpt의 말씀을 인용하면 다음과 같다.

scanf("%c", &bu[i]);를 사용하면 입력 버퍼에 남아 있는 개행 문자가 bu[0]의 첫 번째 문자로 읽힙니다.

 

scanf("%c ", &bu[i]);에서 %c 뒤의 공백은 실제 문자를 읽기 전에 입력 버퍼에서 모든 공백 문자(개행 문자 포함)를 소비하는 데 사용됩니다. 그러나 이 공백은 첫 번째 루프에서 bu[0]에 개행 문자가 저장되는 것을 방지하지 못합니다.

또한 문자를 읽는 루프에서 scanf(" %c", &bu[i]);에서 %c 뒤의 공백을 제거하면 나중에 나오는 문자를 읽기 전에 모든 후행 공백 문자(개행 문자 포함)를 소비하여 다음 문자에 개행 문자가 저장되는 것을 방지합니다.

첫번째로 "%c"를 사용하면 < > >..사이의 공백 문자들이 읽혀버림.

두번째로 "%c "를 사용하면 앞서 버퍼에 있는 \n(enter)?가 읽혀서 맨 처음의 문자열에 \n이 저장된다.

따라서 앞선 공백 문자열과 bu[0]앞에 있는 \n을 날려주기 위해서 " %c"가 사용됨.  

 

확인해보자.

%d를 이용하여 ascii코드로 출력

10(line feed)와 space(32)가 얽혀 입력된 것을 확인 가능하다.

"%c "

마찬가지로 line feed가 밀려 입력된것을 확인할 수 있다.

 

" %c"

야호

'백준 문제풀이' 카테고리의 다른 글

BOJ/1012  (1) 2024.01.24
BOJ/14620  (2) 2024.01.24
BOJ/2869  (0) 2024.01.12
BOJ/10814  (0) 2024.01.09
BOJ/1427  (1) 2024.01.09