문제출처 : https://www.acmicpc.net/problem/1260


1. 문제요약

- dfs와 bfs 방문순서

- dfs 방문순서 출력 후

  bfs 방문순서 출력


2. 접근방법

- dfs, bfs


3. 시간복잡도

- O(VE)


4. 회고

- 다른사람보다 시간이 걸린이유는

  1) 입력 시간

  2) 다른사람은 자료구조로 인접리스트를 썻고, 나는 인접행렬을 썼음

     난 출력이 순서대로 나와야 하기에 인접행렬을 인덱스로 검색하면 자동으로 순서가 되므로 인접행렬을 씀

     인접리스트를 쓴 다른사람들은 sort 함



소스코드



[출처 : BOJ, 문제에 대한 모든 권리는 BOJ(acmicpc.net, startlink)에 있음]

'먹고살려면 > boj' 카테고리의 다른 글

BOJ 1707 이분 그래프  (0) 2018.01.29
BOJ 11724 연결 요소의 개수  (0) 2018.01.26
BOJ 11052 붕어빵 판매하기  (0) 2018.01.25
BOJ 2011 암호코드  (0) 2018.01.25
BOJ 2225 합분해  (0) 2018.01.25

문제출처 : https://www.acmicpc.net/problem/11052


1. 문제요약

- 붕어 빵을 N개 팔아서 남는 최대 수익?

- 붕어빵을 i개 씩 묶어서 판매하는 가격은 Pi

- 붕어빵이 4개 남아있고, 1개 팔때 2 / 2개 팔때 5, 3개 팔때 6 / 4개 팔때 7인 경우

  붕어빵을 2개 2개 씩 팔면 10이 최대 수익


- 1 <= N <= 1,000

- 1 <= Pi <= 10,000


2. 접근방법

- 최대값은 최대값에서 찾는다.

- N 번째 붕어빵을 판매했을 때 최대 수익을 d[n]이라 하면

- N 번째 최대 수익은 이전까지 최대 수익(d[0] ~ d[n-1]) 중에 남은 붕어빵을 세트로 판매한 가격의 합의 최대

- 위의 예시를 따르자면
  d[1] = P1
  d[2] = 1 + 1 or 2 = d[1] + P1 or d[0] + P2
  d[3] = 1 + 1 + 1 or 1 + 2(2 + 1) or 3 = d[1] + P2(1 + 2) or d[2] + P1(1 + 1과 2 중의 큰값 + 1) or d[0] + P3(3)
  d[4] = 1 + 1 + 1 + 1 or 1 + 2 + 1(2 + 1 + 1, 1 + 1 + 2) or 1 + 3(3 + 1) or 4 = d[1] + P3 or d[2] + P2 or d[3] + P1 or d[0] + P4

- 즉, d[n] = max(d[0] + Pn, d[1] + Pn-1, d[2] + Pn-2, ... , d[n-1] + P1)


3. 시간복잡도

- 2 + 3 + ... + n = n(n+1)/2 = 약 500,000


4. 회고

- 생각해보면 굳이 d 배열을 쓸 필요없이 p 배열 하나면 되는 거였네



소스코드



[출처 : BOJ, 문제에 대한 모든 권리는 BOJ(acmicpc.net, startlink)에 있음]

'먹고살려면 > boj' 카테고리의 다른 글

BOJ 11724 연결 요소의 개수  (0) 2018.01.26
BOJ 1260 DFS와 BFS  (0) 2018.01.26
BOJ 2011 암호코드  (0) 2018.01.25
BOJ 2225 합분해  (0) 2018.01.25
BOJ 9461 파도반 수열  (0) 2018.01.24

문제출처 : https://www.acmicpc.net/problem/2011


1. 문제요약

- 알파벳 A ~ Z를 숫자 1 ~ 26에 대응 하여 암호를 만듦

- 25114 라는 암호를 만들었을 때, 해석 되는 가짓수는?

- 암호의 길이 N

- 1 <= N <= 5,000


2. 접근방법

- 길이가 n일 때, i 번째 숫자 까지 해석되는 경우의 수를 d[i]

- 최대 두 글자가 합쳐 질 수 있으므로

  d[i] = d[i-1] + d[i-2]


- 단, 0이 포함되어 있거나, 26을 넘어가는 숫자는 제외

- 01 인 경우, 숫자 0은 해석할 수 없으므로 d[1] = 0

- 10 인 경우, 숫자 1은 해석할 수 있으므로 d[1] = 1

                 숫자 0은 해석할 수 없으므로 1과 0은 따로 해석할 수 없고, 10은 해석 가능하므로 d[2] = 1

- 45 인 경우, 숫자 4, 5는 따로 해석 가능하지만, 45는 해석 할 수 없음. d[1] = 1, d[2] = 1


- 즉, 한 자릿수는 0 이외면 d[i] += d[i-1]

       두 자릿수는 10이상 26 이하면 d[i] += d[i-2]


3. 시간복잡도

- n


4. 회고

- 아에 생각을 잘못함...

-                   0 0 0 0 0

                   /           \

          0 | 0 0 0         0 0 | 0 0 0

- 이런식으로 나눠서 제일 마지막에 

  1개가 남고 0이 아니면 return 1

  2개가 남고 0이상 27 이하 이면 return 2

                 X0 인 경우 return 1

                 0X 인 경우 return 0

                 27 이상 return 0

- 이렇게 나눠서 생각했음

  너무 복잡하고 3333333 인경우 못골라냄...


- long long 은 약 18자릿수 까지 밖에 저장 못함...

- 5000 자릿수는 문자열로 받아야 함

  string 숫자를 int 숫자로 변환은 c[0] - '0'


- 넘 소스코드 좀 보자

- 난 n[i]와 d[i]의 인덱스를 같이 쓸려고 했는데

  같이 쓰면 d[1]일때 문자 2개의 경우의 수를 판단해야 되서 line 15와 같이 삽입했는데 그러지 말고

  d[n] : 길이 n번째 까지 만들 수 있는 암호의 수 라고 하면

  d[1]이 a[0]로 만들 수 있는 암호의 수가 되어서 line 15를 쓸 필요가 없었네



소스코드 : 맞은 소스


소스코드 : 틀린 소스



[출처 : BOJ, 문제에 대한 모든 권리는 BOJ(acmicpc.net, startlink)에 있음]

'먹고살려면 > boj' 카테고리의 다른 글

BOJ 1260 DFS와 BFS  (0) 2018.01.26
BOJ 11052 붕어빵 판매하기  (0) 2018.01.25
BOJ 2225 합분해  (0) 2018.01.25
BOJ 9461 파도반 수열  (0) 2018.01.24
BOJ 1966 제곱수의 합  (0) 2018.01.23

+ Recent posts