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

 

1874번: 스택 수열

1부터 n까지에 수에 대해 차례로 [push, push, push, push, pop, pop, push, push, pop, push, push, pop, pop, pop, pop, pop] 연산을 수행하면 수열 [4, 3, 6, 8, 7, 5, 2, 1]을 얻을 수 있다.

www.acmicpc.net

- 스택 의 LIFO 개념을 인지하기 위한? 문제 인 것 같다.

- 스택에는 오름차순으로 들어간다는 점.

- 저는 원하는 결과 수열을 처음에 입력 받아서 큐에 넣어서 하나씩 비교 하였습니다.

- 스택에 넣는 과정에서 큐의 front에 있는 값과 비교를 해서 같지 않으면 스택에 넣고

- 같으면 스택에 넣었다가 뺀다 (한번은 들어갔다 나와야함.)

- 그 후 뺐을때 queue에서도 pop을 해준다.

- 그리고 그 상태에서 stack.top() 값과 queue.front()의 값이 같다면 또 빼주어야 한다 스택 큐 모두에서

- 그래서 for문을 모두 돈 후에 스택이 비어 있으면 수열이 제대로 완성이 될수 있는 것이므로 성공이고

- 그렇지 않다면 스택을 이용해서 원하는 수열을 만들 수가 없는 것이다.

- 그것을 구분하여 출력해주면 된다.( 안되는 경우에 +,-가 아닌 NO만 출력해야 하므로

- 반복문을 돌면서 출력을 해주면 안된다. 그래서 vector<bool>에 push,pop이 일어날 때 마다

- 차례대로 넣어놓고 마지막에 수열이 완성될 수 있는경우 이를 이용하여 +,-를 출력하였다.

- 자료구조는 자신이 필요하다 싶은, 그리고 더 효율적일 것 같은 자료구조를 선택하면 될거 같다.

- 저도 더 컴팩트하고 쉬운 방법은 없는 지 생각해보겠읍니다.

 

'학부생 공부 > 연습문제(백준)' 카테고리의 다른 글

백준 10989 수정렬하기3  (0) 2019.11.16
백준 10773 제로  (0) 2019.11.16
백준 2292 벌집  (0) 2019.11.13
백준 11650 좌표정렬하기  (0) 2019.11.13
백준 2164 카드2  (0) 2019.11.13

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

 

2292번: 벌집

위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌을 때, 벌집의 중앙 1에서 N번 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나가는지(시작과 끝을 포함하여)를 계산하는 프로그램을 작성하시오. 예를 들면, 13까지는 3개, 58까지는 5개를 지난다.

www.acmicpc.net

- 육각형이 나름 힌트?.... 모양이 보고 숫자를 파악해 보니까

- 다음 칸으로 넘어갈수록 한변에서 하나의 숫자들이 더 더해지고 있었다.

- 즉 계차수열? ..... 느낌.

 

'학부생 공부 > 연습문제(백준)' 카테고리의 다른 글

백준 10773 제로  (0) 2019.11.16
백준 1874 스택수열  (0) 2019.11.14
백준 11650 좌표정렬하기  (0) 2019.11.13
백준 2164 카드2  (0) 2019.11.13
백준 2839 설탕배달  (0) 2019.11.10

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

 

11650번: 좌표 정렬하기

첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.

www.acmicpc.net

- 입력받은 점을 x좌표 우선비교 하고 출력( 같을 경우는 y좌표를 비교하여 순서대로 출력)

- 문제는 매우 간단한데 

- int형 vector array를 선언해서 (2차원 배열 느낌)

- 입력받은 x,y 를 arr[x].push_back(y) 를 하여 일단 x값 대로 for문을 돌다가

- size가 1 일경우 -> 그대로 출력[0]번째(arr[i][0])

- size가 2 이상이면 -> 그 vector array를 sort하여(y값 오름차순 정렬) 순서대로 출력

 

@@ 비효율적이다...... 더 컴팩트하게 짤 수있을텐데.. 생각해볼게요.... @@

 

 

'학부생 공부 > 연습문제(백준)' 카테고리의 다른 글

백준 1874 스택수열  (0) 2019.11.14
백준 2292 벌집  (0) 2019.11.13
백준 2164 카드2  (0) 2019.11.13
백준 2839 설탕배달  (0) 2019.11.10
백준 15552 빠른입출력  (0) 2019.11.10

- 파이프 란 ?

 # 간단하게 말하자면 한 프로세스의 출력이 다른 프로세스의 입력으로 들어가서

    두개의 프로세스가 inter-communication 을 하는 것이다.

 # FIFO basis

 # half duplex ( full duplex를 굳이 하자면 가능 하기는 하지만 이를 권고)

    (보내는 쪽은 보내기만, 받는 쪽은 받기만)

 # 공통 부모인 프로세스나 친척들 끼리 파이프를 사용가능 (parent-child뿐만 아니라 child-child도 가능(공통조상에서        파이프를 열였을 경우))

 # 공통조상이 아닌 프로세스들 끼리 파이프와 같은 기능을 사용하고 싶을 때는 FIFO 를 이용

 #  #include<iostream>

     int pipe(int filedes[2]);

 # 프로세스가 파이프를 통해 read를 하려고 하는 경우

     -1. pipe is not empty : read를 하고 즉시 리턴 한다. (리턴값은 읽은 데이터의 바이트 수)

     -2. pipe is empty : read가 block된다. ( write를 통해서 들어올 때까지 기다림)

 # 프로세스가 파이프를 통해 write를 하려고 하는 경우

     -1. pipe is not full : 즉시 write하고 리턴한다.

     -2. pipe is full : 빈(여유)공간이 만들어 질때 까지 block(기다림)

 # 파이프의 한쪽이 closed(닫힌경우)

     -1 . (write 가 닫혔을 때) read의 경우 데이터 파일을 다 읽고 나면 0을 리턴한다.

     -2 . (read 가 닫혔을 때) write의 경우 write를 해도 read할 프로세스가 없다.

          커널이 SIGPIPE라는 시그널을 보낸다.(write를 실행한 프로세스에게)

                (default 값은 죽는것.)

          시그널을 무시하거나 잡아서(catch) 핸들러를 수행하거나 할경우 -1을 리턴하고

          errno을 EPIPE로 셋팅한다.

 

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

 

2164번: 카드2

N장의 카드가 있다. 각각의 카드는 차례로 1부터 N까지의 번호가 붙어 있으며, 1번 카드가 제일 위에, N번 카드가 제일 아래인 상태로 순서대로 카드가 놓여 있다. 이제 다음과 같은 동작을 카드가 한 장 남을 때까지 반복하게 된다. 우선, 제일 위에 있는 카드를 바닥에 버린다. 그 다음, 제일 위에 있는 카드를 제일 아래에 있는 카드 밑으로 옮긴다. 예를 들어 N=4인 경우를 생각해 보자. 카드는 제일 위에서부터 1234 의 순서로 놓여있다. 1을 버리

www.acmicpc.net

- 문제에 주어진 조건만 파악 한다음 차근차근 따라가면 된다.

- 자료구조 는 여러가지를 사용해서 해결할 수 있을 것이다.

- 저는 큐 (FIFO)를 사용했습니다.

- 카드 덱을 위에서 부터 하나씩 꺼내고 다시 밑으로 넣고 함으로 큐가 적당할 것 이라고 생각해서 이용하였습니다.

 

 

'학부생 공부 > 연습문제(백준)' 카테고리의 다른 글

백준 2292 벌집  (0) 2019.11.13
백준 11650 좌표정렬하기  (0) 2019.11.13
백준 2839 설탕배달  (0) 2019.11.10
백준 15552 빠른입출력  (0) 2019.11.10
백준 1085  (0) 2019.11.09

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

 

2839번: 설탕 배달

문제 상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그램 봉지와 5킬로그램 봉지가 있다. 상근이는 귀찮기 때문에, 최대한 적은 봉지를 들고 가려고 한다. 예를 들어, 18킬로그램 설탕을 배달해야 할 때, 3킬로그램 봉지 6개를 가져가도 되지만, 5킬로그램 3개와 3킬로그램 1개를 배달하면, 더 적은 개수의 봉지를 배달할 수

www.acmicpc.net

-3kg, 5kg만을 담을 수 있는 봉지만 있다.

- 처음에든 생각은 3과5의 최소공배수가 15이므로

   15보다 작거나 같게 만들고 (그 전까지는 모두 5kg에 담는다.)

- 잘못된 생각임을 깨달은건 16과 같은 수를 생각했을 때...이다..

- 16을 15보다 작게 만들어서 -15를 해서 1을 만들면 이는 담을 수 없는 수이다.

- 하지만 실제로 16은 5 두개와 3두개에 나누어 남을 수 있다.

- 그래서 아예 방향을 바꿨다. 

- 가능한 경우의 수를 모두 계산 하여 벡터에 넣은 후에 마지막에 sorting을 해서

   [0]번째에 있는 수를 출력하자! . 물론 empty일 경우에는 -1을 출력 하도록!

- 스스로 짠 코드 이고 시간적 효율성이 좋을 것 같지는 않다. (모든 가능한 경우의 수를 모두 구해서 넣으므로)

 

<코드>

 

'학부생 공부 > 연습문제(백준)' 카테고리의 다른 글

백준 11650 좌표정렬하기  (0) 2019.11.13
백준 2164 카드2  (0) 2019.11.13
백준 15552 빠른입출력  (0) 2019.11.10
백준 1085  (0) 2019.11.09
백준 11365 !밀비 급일  (0) 2019.11.06

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

 

15552번: 빠른 A+B

첫 줄에 테스트케이스의 개수 T가 주어진다. T는 최대 1,000,000이다. 다음 T줄에는 각각 두 정수 A와 B가 주어진다. A와 B는 1 이상, 1,000 이하이다.

www.acmicpc.net

- 아주 간단한 문제이지만

- 시간 제한과 매우 큰 테스트 케이스 사이즈 인 문제이다.

- cin.tie(NULL);
 -ios_base::sync_with_stdio(false);

-자료구조 실습 때나 문제해결기법 실습 때 c말고 c++ 을 쓰는 학생들도 있었기 때문에

 실습 문제의 아래 cin/cout을 사용할 경우 위에 저것을 선언해주어라

- 는 말이 항상 있었는데 구체적으로 어떤 역할을 하는지가 궁금해져서 이 기회에 알아보았다.

< cin.tie(NULL) >

default값은 cout,cin이 tie 되어 있다.

이것을 untie 하겠다.라는 것

이경우 라면 program 이 user에게 입력을 요구하기 전에 output이 flush 된다.

(기본적으로 cout의 output은 buffer가 가득차거나 수동적으로 flush 시켜전까지는 출력되지 않는다.)

만약 cin과 cout을 untie 한다면, cin으로 입력을 받기 전에 뭔가를 띄우고 싶다면 매번 수동적으로 cout을 flush 시켜줘야 한다.

 

ios_base::sync_with_stdio(false);

c 표준 stream과 c++ 표준 stream 의 동기화를 끊는다.

default는 모두 동기화 되어 있다 그래서 우리는 c,c++ 입출력 방식을 자유롭게 쓸 수 있다.

printf도 쓸 수 있고 cout도 쓸 수 있따.

이 동기화를 끊어 주면 c++ stream들은 독립적인 버퍼를 갖게되고, c와 혼용해서 쓰는 것이 위험해진다.

그리고 동기화된 c++ stream 은 thread-safe 하다.( 다른 thread의 output이 동시에 엑세스 해도 충돌하지 않는다.

동기화를 끊으면 사용하는 버퍼의 수가 줄어들기 때문에 실행속도 자체는 향상된다.

 

출처:https://codecollector.tistory.com/381

찾아보고 직접 코드를 작성하여 실행 해보았는데 나는 untie를 하고 나서

내가 스스로 flush를 해주지 않았는데도 출력이 잘 되었다...왜지?

 

*아 그리고 endl과 '\n'의 차이

이 문제에서 위의 두 사항을 모두 적용하고 출력해보았는데 

시간초과가 나왔는데 그 차이는 endl과 '\n' 의차이 였는데

endl은 개행만 해주는 것이 아니고 내부 버퍼도 비워주기 때문에 '\n'에 비해서 매우 느리다.

이것또한 알아두자 .

 

 

'학부생 공부 > 연습문제(백준)' 카테고리의 다른 글

백준 2164 카드2  (0) 2019.11.13
백준 2839 설탕배달  (0) 2019.11.10
백준 1085  (0) 2019.11.09
백준 11365 !밀비 급일  (0) 2019.11.06
백준 1002  (0) 2019.11.06

참조 타입 변수(레퍼런스) 는 별명과 같은 느낌이라고 보면 될 것이다.

c++의 포인터 와 레퍼런스의 차이점을 알아보자.

 

# 포인터는 null을 가리킬 수 있지만 참조 타입 변수는 null을 가리킬 수 없다.

   - 포인터를 초기화 하지 않거나 null을 가리키고 있는 포인터에 접근 했을 때

     발생하는 에러가 참조 타입 변수에서는 나타나지 않는다.

# 참조 타입 변수는 선언과 동시에 초기화 하지않으면 컴파일 오류가 발생한다.

# 포인터는 * , -> 등의 포인터 연산자를 통해서 접근 해야 하지만 참조 타입 변수는

   마치 지역변수 처럼 접근할 수 있다.

# 참조 타입 변수는 초기화 과정에서만 값을 할당 할 수 있고 이후에 다시 할당을

   시도 할 경우 컴파일 에러가 발생한다. 하지만 포인터 변수는 참조 대상을 언제든지 변경할 

   수 있다.

 

'학부생 공부 > C++' 카테고리의 다른 글

(21.05.20) next_permutation  (0) 2021.05.20
C++ memory [heap]  (0) 2020.12.24
C++ memory [stack]  (0) 2020.12.22
값이 [a,b]인 데이터의 개수를 반환하는 함수  (0) 2020.10.10
call by reference, call by value  (0) 2019.11.10

+ Recent posts