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

 

9095번: 1, 2, 3 더하기

문제 정수 4를 1, 2, 3의 합으로 나타내는 방법은 총 7가지가 있다. 합을 나타낼 때는 수를 1개 이상 사용해야 한다. 1+1+1+1 1+1+2 1+2+1 2+1+1 2+2 1+3 3+1 정수 n이 주어졌을 때, n을 1, 2, 3의 합으로 나타내는 방법의 수를 구하는 프로그램을 작성하시오. 입력 첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 정수 n이 주어진다. n은 양수이며 11보다 작다. 출력 각

www.acmicpc.net

 

간단한 다이나믹 프로그래밍 문제라고 할수 있겠습니다.

 

사실 처음 할때 개념을 이해하기가 꽤 힘들었던 것 같았던 기억이 있습니다....

 

이번에 아이패드를 사면서 사용하면서 풀고 있는데 보면서 약간 이해를 도울 수 있었으면 좋겠네요

 

목표지점 n으로 가기 위해 정수 123만 사용할수 있기 때문에

 

4이상의 숫자들은  1칸 가고 목표지점에 가는 경우의 수 dp[n-1]

                        2칸 가고 목표지점에 가는 경우의 수 dp[n-2]

                        3칸 가고 목표지점에 가는 경우의 수 dp[n-3]

 

으로 이해하시면 편하지 않을까 생각합니다.

 

<필기>

 

<코드>

 

'알고리즘 문제풀이 > 다이나믹 프로그래밍' 카테고리의 다른 글

백준 11726 [C++]  (0) 2020.12.14
백준 7570 [C++]  (0) 2020.12.02
백준 12865 [C++]  (0) 2020.11.29
백준 1932  (0) 2020.03.02
백준 2579  (0) 2020.02.01

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

 

1181번: 단어 정렬

첫째 줄에 단어의 개수 N이 주어진다. (1≤N≤20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.

www.acmicpc.net

정렬에 관련된 문제입니다.

 

sorting을 하면서 조건을 조금씩만 걸어서 주면 되는 문제이구요

 

compare 을 선언해서 sort를 하는데 조건으로 사용하였고

 

같은 문자가 있는경우 생략해서 출력해야 하는데 이는 입력을 받을때나 또는 따로 비교를 해서 제거를 하려 하면

 

비교를 하는데 있어서 따로 시간을 또 사용해야 할 것 같아서

 

출력을 할때 비교하여 생략하는 방식으로 구현하였습니다.

 

'알고리즘 문제풀이 > 정렬' 카테고리의 다른 글

백준 1620 [C++]  (0) 2021.01.09
백준 2887 [C++]  (0) 2020.10.27
백준 10825 [C++]  (0) 2020.10.25
백준 10814  (0) 2020.03.02
백준 1427  (0) 2020.01.08

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

 

2178번: 미로 탐색

첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.

www.acmicpc.net

문제를 분석해 보면 최소한의 점

 

시작하는위치(1,1) 과 가야하는점(N,M)은 정해져 있습니다.

 

어떻게 하면 최단거리로 갈 수 있는지를 구하는 문제인데

 

DFS로 구현할경우 시간초과의 문제를 겪을 수 있습니다.(최악의경우)

 

BFS 냄새가 풀풀...

 

BFS를 돌면서 큐에다가 다음 깊이의 점들을 모두 넣는 식입니다.

 

그렇게 하다가 목적지가 맞을경우 BREAK 하도록!

 

기본적인 BFS문제가 아닐까 싶습니다.

 

 

 

<MAIN> 함수 입니다.

 

 

'알고리즘 문제풀이 > DFS와 BFS' 카테고리의 다른 글

백준 2583  (0) 2020.03.02
백준 14502  (0) 2020.02.17
백준 11724  (0) 2020.02.13
백준 1260  (0) 2020.01.14
백준 2667  (0) 2020.01.14

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

 

1260번: DFS와 BFS

첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사이에 여러 개의 간선이 있을 수 있다. 입력으로 주어지는 간선은 양방향이다.

www.acmicpc.net

 

DFS와 BFS를 탐색을 하는 기본문제입니다.

 

개념을 익히는 정도 라고 하면 되겠네요!

 

깊이우선 탐색을 먼저 하고 너비우선 탐색을 하면 됩니다.

 

이차원 배열을 통해서 점과 점이 연결되었는지 여부를 확인(간선)

 

간선은 입력받을떄 [x][y] =1은 물론 [y][x]=1도 넣어주었습니다(양방향 간선 이므로)

 

일차원 배열을 통해 방문을 했는지 여부를 확인하는 용도로 사용하였습니다.

 

<main> 함수

 

'알고리즘 문제풀이 > DFS와 BFS' 카테고리의 다른 글

백준 2583  (0) 2020.03.02
백준 14502  (0) 2020.02.17
백준 11724  (0) 2020.02.13
백준 2178  (0) 2020.01.14
백준 2667  (0) 2020.01.14

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

 

2667번: 단지번호붙이기

<그림 1>과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집들의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여기서 연결되었다는 것은 어떤 집이 좌우, 혹은 아래위로 다른 집이 있는 경우를 말한다. 대각선상에 집이 있는 경우는 연결된 것이 아니다. <그림 2>는 <그림 1>을 단지별로 번호를 붙인 것이다. 지도를 입력하여 단지수를 출력하고, 각 단지에 속하는 집의 수

www.acmicpc.net

DFS 기본 문제 느낌이였습니다.

 

깊이우선 탐색입니다.

 

한 점(집) 을 발견하면 일단 그 집과 연결된 모든 집을 탐색하고(탐색하면서 방문 했다고 체크)

 

다음에 FOR문을 돌때는 집이 있어도 이미 방문되었다고 표시가 되어 있으면

 

DFS를 돌지 않도록 하였습니다.

 

MAP은 그냥 정적으로 만들었고 (N)값 범위가 정해져 있으므로 N의 최대값으로 설정 하였습니다.

 

체크나 출력은 N값을 이용하면 되므로..

 

'알고리즘 문제풀이 > DFS와 BFS' 카테고리의 다른 글

백준 2583  (0) 2020.03.02
백준 14502  (0) 2020.02.17
백준 11724  (0) 2020.02.13
백준 2178  (0) 2020.01.14
백준 1260  (0) 2020.01.14

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

 

1427번: 소트인사이드

첫째 줄에 정렬하고자하는 수 N이 주어진다. N은 1,000,000,000보다 작거나 같은 자연수이다.

www.acmicpc.net

간단한 정렬문제!

'알고리즘 문제풀이 > 정렬' 카테고리의 다른 글

백준 1620 [C++]  (0) 2021.01.09
백준 2887 [C++]  (0) 2020.10.27
백준 10825 [C++]  (0) 2020.10.25
백준 10814  (0) 2020.03.02
백준 1181  (0) 2020.01.15

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

 

2493번: 탑

첫째 줄에 탑의 수를 나타내는 정수 N이 주어진다. N은 1 이상 500,000 이하이다. 둘째 줄에는 N개의 탑들의 높이가 직선상에 놓인 순서대로 하나의 빈칸을 사이에 두고 주어진다. 탑들의 높이는 1 이상 100,000,000 이하의 정수이다.

www.acmicpc.net

 

처음에는 시간초과가 3번 정도 났나...

 

문제 파악은  별게 없는 것 같습니다.

 

그리고 레이저는 입력방향의 반대 방향으로 쏘기 때문에 입력을 받으면서

 

지금 들어와있는 입력 값들만 보면 됩니다.

 

처음에는 그 건물로 부터 이전에 들어온 값들을 보면서 크기를 비교 했는데 시간초과

 

최악의 경우 시간을 훨씬 뛰어 넘기 떄문이겠죠

 

그래서 비교의 수를 줄이기 위해 어떻게 할까 하다가

 

만약 1번 건물의 높이가 4이고 2번에 들어온 건물의 높이가 8이면 그 이후 건물들은 1번 건물은 볼필요도 없습니다.

 

즉 약간 높은건물에 가려서 보이지 않는 다는 느낌을 떠올린다면 스택을 이용하여 풀수 있습니다.

 

새로운 높은 건물이 들어 온다면 그 이전의 건물들은 모두 스택에서 빼버리는 거죠

 

숫자가 작을때는 별로 차이가 안나겠지만 숫자가 엄청 커질경우 시간차이가 상당 할 것으로 보입니다.

 

-첫번째 시간초과 났던 소스 입니다.-

 

 

-스택을 이용하여 시간초과를 해결한 코드 입니다.-

 

 

 

'알고리즘 문제풀이 > 스택' 카테고리의 다른 글

백준 1406 [C++]  (0) 2021.01.09
백준 10799 [C++]  (0) 2021.01.09
백준 1874 [C++]  (0) 2021.01.09
백준 3986  (0) 2020.03.02

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

 

1305번: 광고

첫째 줄에 광고판의 크기 L이 주어지고, 둘째 줄에 현재 광고판에 보이는 문자열이 주어진다. L은 백만보다 작거나 같은 자연수이다.

www.acmicpc.net

입력 값과 출력값은 간단해서

 

따로 말할건 없고

 

kmp알고리즘을 공부하고 첫 문제였는데

 

lps table을 만들면되는 문제인데

 

prefix와 suffix를 찾으면 되는 문제이다.

 

즉 입력받은 문자열의 lps table을 구한 후 

 

문자열의 마지막 글자 의 lps table에 해당되는 값을 보면되는데

 

해당 전광판에서 적혀있는문구는 뒤에 아직 나오지 않은 문자열이 있고(1초마다 나옴)

 

입력 문자열의 prefix와 suffix만 같으면 1초뒤에 나올 문자는 그 뒤에 이어지는 문자열이 나온다라고

 

생각하고 구해주면 된다.

 

 

 

+ Recent posts