C++

[백준 알고리즘] 9437번 : 사라진 페이지 찾기, c++

2022. 3. 27. 20:37

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

 

9437번: 사라진 페이지 찾기

각 테스트 케이스에 대해 두가지 정수 N,P가 주어진다. 4의 배수인 N(4 ≤ N ≤ 1000)은 탐구영역의 전체 페이지 수이며, P(1 ≤ P ≤ N)는 선택된 한 페이지다. 입력의 마지막은 하나의 0만 주어진다.

www.acmicpc.net

c++로 백준 9437번 문제를 풀어보겠다.

 

 

 

 

 

문제

꿍은 수능에 응시하고 있었는데 어느덧 4교시 탐구영역 시간이 되었다. 그런데 탐구영역은 다른 영역과 다르게 자기가 응시할 과목만 고르고 응시하지 않는 과목은 바닥에 버리도록 되어있다. 꿍이 응시하지 않는 과목을 골라 뽑아내던 중 문득 궁금한게 생겼다. 만약 탐구영역 시험지가 아래와 같이 전체 12쪽으로 되어 있었다고 하자. 

그렇다면 1쪽과 12쪽은 한 면에, 2쪽과 11쪽이 한면에, ... 6쪽과 7쪽이 한면에 인쇄되어 있고 1,2,11,12쪽이 한 장, 3,4,9,10쪽이 한 장, 5,6,7,8이 한 장 이다. 그래서 만약 꿍이 2쪽이 인쇄된 종이 한 장을 바닥에 버렸을 때, 그 종이에 인쇄된 나머지 쪽, 즉 사라진 페이지들은 1,11,12쪽이다.

꿍이 탐구영역을 응시할 동안 여러분들은 한 쪽의 페이지만으로 사라진 나머지의 페이지들을 찾아주어라.

입력

각 테스트 케이스에 대해 두가지 정수 N,P가 주어진다. 4의 배수인 N(4 ≤ N ≤ 1000)은 탐구영역의 전체 페이지 수이며, P(1 ≤ P  N)는 선택된 한 페이지다. 입력의 마지막은 하나의 0만 주어진다.

출력

각 테스트 케이스에 대해 사라진 페이지들을 오름차순으로 출력한다.

예제 입력 1 복사

12 2
12 9
8 3
0

예제 출력 1 복사

1 11 12
3 4 10
4 5 6

 

 

 

 

<문제 풀이>

 

처음 작성한 코드는 다음과 같다.

 

 

다른 컴파일러에서는 원하는 대로 잘 출력됐지만, 백준 사이트에서는 '출력 초과'라고 떴다.

내가 조건을 잘못봐서 틀렸던 것이었다.

while 반복문 종료조건은 N 값 하나만 받고(P는 입력 못 받은 채로) 입력받은 N의 값이 0인 경우여야 한다.

 

 

따라서 위에 입력부분만 위 사진처럼 바꿔주었다.

 

 

 

 

1. while 반복문을 통해 주어진 문제를 해결한다. 

 

- while 반복문 코드 내용 -

N과 P값을 입력받는다.

만약 N값이 0이고 P는 입력을 받지 못했다면 반복문을 종료한다.

크기가 3인 int형의 배열을 선언한다.

만약 P값이 짝수라면 배열에 P-1, N-P+1, N-P+2 값을 저장한다.

만약 P값이 홀수라면 배열에 P+1, N-P, N-P+1 값을 저장한다.

배열을 오름차순으로 정렬한다.

배열의 값을 하나씩 출력한다.

한 줄 띄기를 출력한다.

다시 while문의 처음으로 돌아가 반복한다.