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

- 대표적인 swap 예제 이다.

Call by value로 swap을 할경우 swap 함수에서 변수의 값을 전달 받기는 하지만

Num1,과 num2의 값만 넘겨 받았을 뿐 그것이 num1과 num2는 아니기 때문에

함수가 종료되면 main 함수에 직접 영향을 끼치지 못한다.

Call by reference의 경우 주소를 통해 전달 받은 값들을 변경하는 것이므로

종료된 이후에도 참조 했던 주소의 값들이 바뀌어 있으므로 main함수에 있는 num1과

Num2도 영향을 받아 swap이 된다.

그리고 call by value 이용하여 함수에 접근 할 경우 value 값을 저장할 새로운 공간을 할당

받아야 하므로

call by reference에 비하여 시간이 더욱 오래 걸린다.

<예시코드>

<결과창>

 

 

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

- 현재 한수의 위치 x, y  그리고 직사각형이 가로변의 길이와 높이가 입력으로 차례대로 들어온다.

- 직사각형이므로 가로로 쭉뻗은 두 변과 세로로 쭉 뻗은 두 변이 있을것이다

- 좌표평면을 생각해서 4가지 방향으로 가는 길중 가장 짧은 길을 찾아 그 값을 출력하면 된다.

 

1085번: 직사각형에서 탈출

첫째 줄에 x y w h가 주어진다. w와 h는 1,000보다 작거나 같은 자연수이고, x는 1보다 크거나 같고, w-1보다 작거나 같은 자연수이고, y는 1보다 크거나 같고, h-1보다 작거나 같은 자연수이다.

www.acmicpc.net

 

 

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

백준 2164 카드2  (0) 2019.11.13
백준 2839 설탕배달  (0) 2019.11.10
백준 15552 빠른입출력  (0) 2019.11.10
백준 11365 !밀비 급일  (0) 2019.11.06
백준 1002  (0) 2019.11.06

 # 메모리 영역의 구성

 

메모리 영역은 위와 같이 구성되는데 "가상 메모리의 구성" 이다.

스택 영역은 주로 지역변수, 매개변수, 함수의 반환값, 함수 호출의 주소 등이 저장된다.

힙영역은 주로 동적 할당을 할 때 사용되는 영역인데 다들 잘 알듯이

c++에서 new, delete이 c 에서 malloc, free 등이 있는데 동적 할당을 하고 사용을 했으면 해제 하는것에도 주의를

기울여 주어야 할것이다. 

 

 

# 다른 영역의 메모리를 사용할 때의 속도의 차이는 어떻게 될까?

- 이를 한번 알아보도록 하자.!

- 배열은  int 형으로 크기는 10000

- 충분한 횟수의 함수 호출(1000001)

-#include<time.h> , clock_t 를 이용한 시간 계산

 

 1. 배열을 정적영역에 선언해서 할당 받는 함수.

 2. 배열을 스택영역에 선언해서 할당 받는 함수.

 3. 배열을 힙영역에 선언해서 할당 받는 함수.

 

코드의 이해는 어렵지 않을 것이다. 다음과 같다.

결과는 어떻게 될까?.....

 

<결과화면>

위와 같다. 시간 자체 값은 변경될수 있지만

비교를 해보면 

정적영역에 선언   <   스택영역에 선언  <  힙영역에 선언

순이다.

 

동적할당의 경우

-컴퓨터의 저장소는 <  레지스터 / 캐쉬 L1 / 캐쉬 L2  /  memory / HDD >

 순으로 왼쪽에 있는 저장장치 일수록 속도가 빠르고 용량이 작으며 용량당 가격이 비싸다.

오른쪽으로 갈수록 느리지만 용량이 크고 값이 싸다

그래서 OS에게 요청해서 memory allocation 은 memory에서 일어나므로 느릴수 밖에 없다.

 

일반적인 힙 성능 문제들이 있다.

- 할당 작업으로 인한 속도 저하

        만약 사용가능한 블록이 사용가능 목록에 없다면 런타임에 더 큰 블록을 찾거나 새블록을 할당 받아와야한다.

- 해체 작업으로 인한 속도저하

- 힙 경합으로 인한 속도 저하 

        두개이상의 쓰레드가 접근 하려고 하는 경우 한 쪽 작업이 완료되어야 접근가능

-힙 손상으로 인한 속도 저하

 

알고 싶었던 내용과 그러한 현상이 나타난 이유를 기재 해보았습니다.

틀린 부분이 있을 수 있습니다. 알려주시면 수정하겠습니다. !

 

 

'학부생 공부 > 생각들' 카테고리의 다른 글

abstract data type 어떤 이유?  (0) 2019.12.01
go to문? 왜 남아 있지?  (0) 2019.11.06

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

- 한줄 씩 입력을 받으면서

  들어온 문자들의 역순으로 출력을 해주면 된다.

- scanf를 통해서 입력을 받는다 (\n) 이 나올 때 까지 한줄씩

- 길이를 체크해서 반대로 출력해주면 된다.

 

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

백준 2164 카드2  (0) 2019.11.13
백준 2839 설탕배달  (0) 2019.11.10
백준 15552 빠른입출력  (0) 2019.11.10
백준 1085  (0) 2019.11.09
백준 1002  (0) 2019.11.06

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

- 터렛문제이다.

- 학점에 신경쓰자고... 다른 공부를 하다가 이제 꾸준히 백준을 하루에 조금씩 풀어야겠다고 생각하고

  푼 첫 번째 문제이다.

- 처음에 든 생각은 map을 만들어서 탐색을 할까 했는데

  요구하는 조건(몇개의 위치가 가능 -> 몇개의 점에서 만나는지) 그리고 값의 범위(2만)

  을 보니 이 방법은 좋지 않겠다고 생각.

- 그래서 두 점과 점사이의 거리와 입력으로 들어오는 r1,r2를 비교하면

  원이 어떤식으로 만나는지가 분류가 된다는 생각.

 

 

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

백준 2164 카드2  (0) 2019.11.13
백준 2839 설탕배달  (0) 2019.11.10
백준 15552 빠른입출력  (0) 2019.11.10
백준 1085  (0) 2019.11.09
백준 11365 !밀비 급일  (0) 2019.11.06

+ Recent posts