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


1. 문제요약

- N*N 맵, 5 <= N <= 25

- 0 빈공간 / 1 집

- 상하좌우로 연결된 집을 하나의 단지

- 단지의 갯수와 각 단지별 집의 갯수를 오름차순으로 출력


2. 접근방법

- 방문한적이 없고, 집이면 방문해서 상하좌우로 연결된 모든집을 방문하여 단지를 만듬

- 단지를 만들면서 집의 갯수를 같이 셈

- bfs / dfs 모두 가능


3. 시간복잡도

- 모든 칸을 한번씩 방문하므로 N^2 = 625


4. 회고

- 전역변수를 안쓰고 리턴값을 쓰니까 조금 귀찮기는 한데 초기화를 안해도 되서 

- 나름의 장단점이 있는데 음...


- 방문한 집이면 맵 자체를 1 -> 0 으로 바꾸면 check 배열을 안써도 됨

- cin 만 쓰려니 공백없는 정수를 받을때는 불편함...


- sort 없이 1차원 배열을 최대 집 갯수 만큼 선언해서 단지 갯수를 입력함.

a[집 갯수] = 단지 갯수
for(int i = 0; i < n*n + 1; i++){
    for(int j = 0; j < a[i]; j++){
        cout << i << "\n";
    }
}

18.2.7

소스코드 수정 - num이 필요없잖아.. 벡터를 쓰는데

dfs만 수정함


소스코드 : dfs


소스코드 : bfs


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

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

BOJ 9205 맥주 마시면서 걸어가기  (0) 2018.01.03
BOJ 1325 효율적인 해킹  (0) 2017.12.27
BOJ 10448 유레카 이론  (0) 2017.12.26
BOJ 2231 분해합  (0) 2017.12.26
BOJ 1966 프린터 큐  (0) 2017.12.26

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


1. 문제요약

- Tn = n(n+1)/2

- 자연수 K가 주어졌을 때 세개의 Tn 으로 나타낼 수 있으면 1, 없으면 0

- 3 <= K <= 1,000


2. 접근방법

- Tn이 몇개나 필요할까? => n(n+1)/2 <= 1,000 을 만족하는 n은 대충 44, 45

- T1 ~ T45 까지 3개를 뽑으면 되므로 45 * 45 * 45 = 91,125 이므로 1초 내에 들어옴

- 즉, 브루트 포스


- 여기서 45 * 45 * 45는 중복이 포함

- T1 + T1 + T2 / T1 + T2 + T1 / T2 + T1 + T1 은 같은 경우 이므로 제외 하면 조금 더 빨라 지겠지?

※ 실제로 다 해본 경우는 32ms / 중복 제외한 경우는 28ms


3. 시간복잡도

- N^3 = 91,125


4. 회고

- 미리 결과 합을 구해두면 출력에 편함

- 어차피 시간내에 들어오므로 굳이 안해도 됨


- 미리 구한 다른 사람은 0ms 인데 난 왜 28ms 이냐!!!

- 싱크 안맞춘 cin 때문인가.... T의 갯수가 몇개인지 모르니


- 미리 세개의 합을 구한 배열을 지역변수에서는 T45 + T45 + T45 = 3105 이상으로 잡아야 오버 인덱스 안남

  전역변수로 선언한다면 100 개 정도는 더 잡아주는 거 같음 3000개로도 통과되네



소스코드



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

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

BOJ 1325 효율적인 해킹  (0) 2017.12.27
BOJ 2667 단지번호붙이기  (0) 2017.12.27
BOJ 2231 분해합  (0) 2017.12.26
BOJ 1966 프린터 큐  (0) 2017.12.26
BOJ 7568 덩치  (0) 2017.12.19

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


1. 문제요약

- 어떤 자연수 M => 세 자릿수 라면 100a + 10b + c => M + a + b + c = N 즉, M과 각 자릿수의 합을 분해합, M을 생성자, N을 분해합

- 1 <= N <= 1,000,000 인 자연수 N이 주어 졌을 때 가장 작은 생성자는?


2. 접근방법

- 생성자는 분해합을 넘을 수 없으므로 1 부터 N-1 까지의 모든 수를 다 해보자


- 좀 더 생각해보면 분해합 N이 만들어 질 수 있는 생성자의 최대 자릿수는 6자릿수

  (생성자가 1,000,000 이면 분해합은 1,000,001 이므로 7 자릿수는 나올 수 없음)

  각 자릿수의 최대 값은 9

  즉, 생성자는 분해합 보다 54 이상 작을 수 없음.

  N-54 부터 N-1 까지만 찾으면 됨.

  가장 작은 수 부터 찾을 거니 처음 만나는 생성자가 최소값


3. 시간복잡도

- 두 가지 경우 모두 N

- 당연히 실제 시간은 전체 검색시 8ms / 55개 검사시 0ms


4. 회고

- 처음엔 다 했는데...

- 다른 사람의 소스 코드를 보고 깨달음

- 각 자릿수 합의 최대 범위



소스코드



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

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

BOJ 2667 단지번호붙이기  (0) 2017.12.27
BOJ 10448 유레카 이론  (0) 2017.12.26
BOJ 1966 프린터 큐  (0) 2017.12.26
BOJ 7568 덩치  (0) 2017.12.19
BOJ 6603 로또  (0) 2017.12.19

+ Recent posts