[push_swap] push_swap이란?

J_JEON·2022년 7월 18일
0

push_swap

목록 보기
1/6

주어진 스택에 들어가있는 무작위의 정수들을 ra, rr등의 제한된 명령어 집합을 구현하고, 이를 활용해 최소한의 명령어 호출로 스택을 정렬할 수 있는 순서를 출력해주는 함수

실행 예시

$> ./push_swap 2 1 3 6 5 8
sa
pb
pb
pb
sa
pa
pa
pa

정렬기능

  1. sa
    swap a - 스택 a의 가장 위에 있는 두 원소(혹은 첫 번쨰 원소와 두 번째 원소)의 위치를 서로 바꾼다.
  2. sb
    swap b - 스택 b의 가장 위에 있는 두 원소(혹은 첫 번쨰 원소와 두 번째 원소)의 위치를 서로 바꾼다.
  3. ss
    sa와 sb를 동시에 실행한다.
  4. pa
    push a - 스택 b에서 가장 위(탑)에 있는 원소를 가져와서, 스택 a의 맨 위(탑)에 넣는다. 스택 b가 비어 있으면 아무 것도 하지 않는다.
  5. pb
    push b - 스택 a에서 가장 위(탑)에 있는 원소를 가져와서, 스택 b의 맨 위(탑)에 넣는다. 스택 a가 비어있으면 아무 것도 하지 않는다.
  6. ra
    rotate a - 스택 a의 모든 원소들을 위로 1 인덱스 만큼 올린다. 첫 번째 원소(탑)는 마지막 원소(바텀)가 된다.
  7. rb
    rotate b - 스택 b의 모든 원소들을 위로 1 인덱스 만큼 올린다. 첫 번째 원소(탑)는 마지막 원소(바텀)가 된다.
  8. rr
    a와 rb를 동시에 실행한다.
  9. rra
    reverse rotate a - 스택 a의 모든 원소들을 아래로 1 인덱스 만큼 내린다. 마지막 원소(바텀)는 첫 번째 원소(탑)가 된다.
  10. rrb
    reverse rotate b - 스택 b의 모든 원소들을 아래로 1 인덱스 만큼 내린다. 마지막 원소(바텀)는 첫 번째 원소(탑)가 된다.
  11. rrr
    rra와 rrb를 동시에 실행한다.

주의사항

  • 숫자들을 입력받을시 1 2 3 으로만 들어오는게아닌 1 "7 5 6" 9 2 등의 여러 방법으로 들어오는것 역시 처리해주어야함.
  • 중복된 값이 들어올 시 오류로 처리해주어야함
  • 숫자가 아닌 다른 값이 들어온다면 오류로 처리해주어야함
  • 정수 범위를 초과한 값이 들어올시 오류로 처리해주어야함
  • 명령어들은 \n으로 구분되어야 함
  • 에러의 경우 Error와 줄바꿈을 표준에러로 출력해야함

구현

int	main(int argc, char **argv)
{
	t_deque	*deq_a;
	t_deque	*deq_b;
	t_deque	*deq_str;

	deq_a = make_deque(); // a deq 초기화
	deq_b = make_deque(); // b deq 초기화
	deq_str = make_deque(); // 출력할 명령어들을 저장할 deq 초기화
	check_argv(argc, argv); // 실행시 받아온 값들이 유효한 값인지 확인
	if (push_in_deq(argc, argv, deq_a)) // a deq에 받아온 값들을 넣어줌
		return (free_all(deq_a, deq_b, deq_str));
	start_sort(deq_a, deq_b, deq_str); // 정렬
	opt_str(deq_str); // 정렬을 위한 명령어 최적화
	print_deq(deq_str); // 명령어 출력
	return (free_all(deq_a, deq_b, deq_str));
}
profile
늅늅

0개의 댓글