46
첫번째 term 진행 현황

쏙 알고스터디 01

Embed Size (px)

Citation preview

첫번째 term 진행 현황

• SOCC의 알고리즘스터디(이하 알고스터디)는 현재 문제 풀이 방식으로

진행되고 있습니다.

• 스터디는 한 달씩 term으로 나뉘어 진행되며 , term이 종료되기 전에

적어도 5개 이상의 알고리즘 문제를 푸는 것이 목표입니다.

• 한 term마다 10개의 문제가 깃허브 repository에 게시됩니다.

Repository 주소 : https://github.com/becxer/algostudy

문제를푼사람은 repository에소스코드를올립니다.

Repository 주소 : https://github.com/becxer/algostudy

0

1

2

3

4

5

6

mj juns becxer shkim jslee oh

문제 수

문제수

5

3 3

1

0

5

문제풀이

Quick Change

문제링크 : http://59.23.113.171/30stair/quick_change/quick_change.php?pname=quick_change

소스코드링크 : https://github.com/becxer/algostudy/blob/master/Deposit_001/04_quick_change/quick_change_sh.java

문제

5 $ 이내로는 동전으로 거슬러 줌.

동전의 개수를 최소화해라

화폐 단위(quartes $0.25 / dimes $0.10 / nickels $0.05 / pennies $0.01)

입력 : 124

출력 : 4 QUARTER(S), 2 DIME(S), 0 NICKEL(S), 4 PENNY(S)

입력 : cents C (1 <= C <= 500)

출력 : Q QUARTER(S), D DIME(S), n NICKEL(S), P PENNY(S)

입출력 형식

입출력 예

7

<출처 : dovelet>

문제 풀이

목적

총 동전개수 최소화

큰 단위의 동전 개수 최대화

8

문제 풀이

1) Input Quarter 개수 최대화 … 나머지①

2) 나머지① Dime 개수 최대화 … 나머지②

3) 나머지② Nickel 개수 최대화 … 나머지③

4) 나머지③ = Penny 개수

큰 단위의 동전 개수부터 최대화

코드

q : Quarter 개수d : Dime 개수n : Nickel 개수p : Penny 개수

q1 : 나머지 ①d1 : 나머지 ②n1 : 나머지 ③

(출력)

9

Moving Table

문제링크 : http://59.23.113.171/30stair/moving_table/moving_table.php?pname=moving_table

소스코드링크 : https://github.com/becxer/algostudy/blob/master/Deposit_001/05_moving_table/becxer.cpp

문제

1. 어떤방 A 에서어떤방 B로 테이블을옮기는데드는시간은 10분이다.

2. 옮기는작업동안이동시겹치는복도를공유할수없다.

3. 옮겨야하는작업의리스트가있을때, 최소로필요로하는분수를출력하라

문제풀이

0 1 2 … 198 199

각각의방은해당방의앞쪽복도로맵핑할수있다.

문제풀이맵핑을하고나면,

이문제는각각의 ‘복도점유블록’을가지고얼마나낮게쌓을 수있느냐를묻는것과같다

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...

문제풀이이블록을어떻게최적화할수있는지알아보자.

가장아래블록을기준으로 겹치는임의의블록 N개를보자.

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...

문제풀이여기서잘보면, 겹치는블록중 서로겹치지않는블록이있다

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...

문제풀이이들은같은레벨에위치가가능하므로옮기도록한다.

만약겹치는블록이있다면, Swap 을한다.

(Swap을해도빨간색과겹치지않으므로전체높이는높아지지않는다)

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...

문제풀이계속해서이과정을되풀이하게되면,

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...

문제풀이계속해서이과정을되풀이하게되면,

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...

문제풀이계속해서이과정을되풀이하게되면,

결국 SWAP 이불가능한모두 겹치는부분을빼고는모두최적화가가능하다.

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...

문제풀이따라서, 블록이차지하는 way의빈도수가가장많은것이 최소높이이다.

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...

3 3 3

풀이 코드

Lake

문제링크 : http://59.23.113.171/30stair/lake/lake.php?pname=lake

소스코드링크 : https://github.com/becxer/algostudy/blob/master/Deposit_001/10_lake/lake_oh4851.c

문제

호수의 개수를 구하는 문제

(상,하,좌,우,대각선으로 연결된 곳 W(물)는 같은 호수로 본다)

입력

행 N , 열 M 이 입력으로 주어진다.

(1 <= N <= 100; 1 <= M <= 100)

입출력예

입력: 8 6

출력: 3

W . . . W .

. W W . W W

. . W . W W

. . . . W .

. W . . W W

W W . . . W

. W . W . W

. W W . . W

W 물

. 땅

문제풀이

영상처리의 라벨링과 동일한 작업 과정을 거침

1.

2.

최초로 W가 발견되는 위치까지 탐색

W가 발견 될 경우 이를 n번째 호수로 표시하고 배

열의 인접한 점을 탐색

만약 인접한 곳에 W가 없다면 1.의위치에서 다

시 W가 발견되는 지점을 찾고 2., 3.의 과정 반복

3.

W . . . W .

. W W . W W

. . W . W W

. . . . W .

. W . . W W

W W . . . W

. W . W . W

. W W . . W

문제풀이

W와 .을 입력 받으면

W -> 255(흰색)

. -> 0(검은색)

으로 매핑함

문제풀이

왼쪽에서 오른쪽, 위에서 아래의 순서로

W(255)를 발견할때까지 배열을 탐색

좌측 그림의 예에서는 (0, 0)에서 255인 점을 발견

스택에 (0, 0)을 PUSH

(0, 0)

STACK

문제풀이

스택이 비어있지 않다면, POP을 수행하고 해당 위치

를 COUNT값으로 표시함

그 후 인접한 점(상, 하, 좌, 우, 대각)을 탐색하여 배

열의 유효범위를 벗어나지 않고 255인 위치이면 해 당

점을 PUSH하고 -1로 표시(재접근 방지)

(1, 1)

(0, 0)

STACK

1

문제풀이

마찬가지로 스택이 비어있지 않다면, POP을 수행하

고 해당 위치를 COUNT값으로 표시함

그 후 인접한 점(상, 하, 좌, 우, 대각)을 탐색하여 배

열의 유효범위를 벗어나지 않고 255인 위치이면 해 당

점을 PUSH하고 -1로 표시(재접근 방지)

(2, 2)

(1, 2)

(1, 1)

STACK

1

1

문제풀이

마찬가지로 스택이 비어있지 않다면, POP을 수행하

고 해당 위치를 COUNT값으로 표시함

그 후 인접한 점(상, 하, 좌, 우, 대각)을 탐색하여 배

열의 유효범위를 벗어나지 않고 255인 위치이면 해 당

점을 PUSH하고 -1로 표시(재접근 방지)

(2, 2)

(1, 2)

STACK

1

1

1

문제풀이

(1, 2)인 점을 POP해서 COUNT(1)로 표시하고 나면

스택이 비게 되므로 첫번째 호수를 찾는 작업을 마침

그 후 (0, 0)에서부터 다시 W(255)를 탐색해 나감

(1, 2)

STACK

1

1 1

1

문제풀이

(0, 4)에서 다음 W(255)를 발견하고 앞선 과정과마찬가지로 반복함

(0, 4)

STACK

1

1 1

1

문제풀이

위의 과정을 반복하면 좌측과 같은 결과가 완성됨

호수의 갯수는 COUNT값을 출력하면 됨

STACK

1 2

1 1 2 2

1 2 2

2

3 2 2

3 3 2

3 3 2

3 3 2

소스코드입력: N, M을 입력받고 W(물)입력 시 255로 매핑

탐색: 배열을 탐색하며 W(255)인 위치를 찾고

PUSH

라벨링: 스택에서 POP한 점을 COUNT값으로

시하고 인접 배열 탐색

PUSH, POP은 자유롭게 구현 가능-

출력: 라벨링을 마친 후 COUNT값출력

추가정보

해당 문제는 위와 같은 알고리즘 외에 아래의 알고리즘으로도 해결

가능함

1.

2.

Connected Component Labeling

Grassfire Labeling

결국 중복된 탐색 없이 배열의 인접한 위치를 묶어주고 묶은 것의 갯수를 파악할 수 있으면

해당 문제를 풀 수 있음

tw

문제링크 : http://59.23.113.171/30stair/tw/tw.php?pname=tw

소스코드링크 : https://github.com/becxer/algostudy/blob/master/Deposit_001/03_tw/tw_mj.cpp

문제

3 4 2 3

모든 tw는 레이저 신호를 왼쪽으로 발사한다.

하나의 탑에서 발사된 레이저 신호는 가장 먼저

만나는 단 하나의 탑에서만 수신이 가능하다.

각각의 탑에서 발사한 레이저 신호를 어느 탑에

서 수신하는지를 알아내는 문제

입력

탑의 수 N과 N개의 탑들의 높이가 주어진다. 탑들

의 높이는 1 이상 100,000,000이하의 정수이다.

입출력 예

입력 : 4

3 4 2 3

출력 : 0 0 2 2높이

2

2

문제풀이

• 탑들의 높이는 1 이상 100,000,000 이하

의 정수이기 때문에 단순히 큰 tw를 찾

으면 time error 가 날 수 있다.

• 오른쪽에서는 단순히 기존의 큰 값보다

지금의 tower가 크면 0 출력

그렇지 않으면 현재 tower보다 높은 값

을 탐색하기 위해 for문을 한번 더 사용

하였다.

• 따라서 시간복잡도가 O(𝑛2 ) 이기 때문

에 시간초과 에러가 생겼다.

End 에 큰 tw높이 저장

현재 tw보다 높은 값 탐색

문제풀이

• Tw의 가장 큰 값을 차곡차곡 쌓아두었

다가 현재 tw의 높이보다 높은 것을 탐

색하는 문제이므로 stack으로 접근해 보

기로 한다.

• C사용자들을 위해 STL을 사용하지 않고

stack을 직접 구현해 볼 예정이다.

• Stack을 구현할 때는 배열과

top이 필요하다.

2

4top

1

3

문제풀이

현재 tower의 높이가 stack 의 top

보다 작을 때 까지 stack에서 pop을

진행한다.

만약 stack에 남은 것이 없다면 신호를 수

신할 수 있는 tower가 없는 것이기 때문

에 0을 출력해준다.

Stack의 top에 있는 것이 현재 tower의

신호를 수신할 수 있는 것이므로 현재

위치 (tower 번호)를 출력해준다.

코드

bits

문제링크 : http://59.23.113.171/30stair/bits/bits.php?pname=bits

소스코드링크 : https://github.com/becxer/algostudy/tree/master/Deposit_001/07_bits/bits_juns.cpp

CONTENTS

1. 프로젝트 선정 배경 및동기2. 개발 목표

3. 개발 내용

4. 개발 기술 및 방법

5. 전체 시스템 구성 및 주요부소개6. 결과 및 시연

문제 설명

CONTENTS

문제 풀이

n = 4, m = 2

1의 개수에 따라다시 정렬

• 0 0 0 0• 0 0 0 1• 0 0 1 0• 0 1 0 0 • 1 0 0 0• 0 0 1 1• 0 1 0 1• 0 1 1 0• 1 0 0 1• 1 0 1 0• 1 1 0 0 • 0 1 1 1• 1 0 1 1• 1 1 0 1• 1 1 1 0• 1 1 1 1

• 0 0 0 0• 0 0 0 1• 0 0 1 0• 0 0 1 1 • 0 1 0 0• 0 1 0 1• 0 1 1 0• 0 1 1 1• 1 0 0 0• 1 0 0 1• 1 0 1 0 • 1 0 1 1• 1 1 0 0• 1 1 0 1• 1 1 1 0• 1 1 1 1

``

1의 개수 0개: 1 개

1의 개수 1개: 4 개

1의 개수 2개: 6 개

1의 개수 3개: 4 개

1의 개수 4개: 1 개

CONTENTS

문제 풀이

n = 4, m = 2

1의 개수에 따라다시 정렬

• 0 0 0 0• 0 0 0 1• 0 0 1 0• 0 1 0 0 • 1 0 0 0• 0 0 1 1• 0 1 0 1• 0 1 1 0• 1 0 0 1• 1 0 1 0• 1 1 0 0 • 0 1 1 1• 1 0 1 1• 1 1 0 1• 1 1 1 0• 1 1 1 1

• 0 0 0 0• 0 0 0 1• 0 0 1 0• 0 0 1 1 • 0 1 0 0• 0 1 0 1• 0 1 1 0• 0 1 1 1• 1 0 0 0• 1 0 0 1• 1 0 1 0 • 1 0 1 1• 1 1 0 0• 1 1 0 1• 1 1 1 0• 1 1 1 1

``

1의 개수 0개: 1 개

1의 개수 1개: 4 개

1의 개수 2개: 6 개

1의 개수 3개: 4 개

1의 개수 4개: 1 개

즉, n 개 중에 1을 m 개 이하의 개수를 모두 더하면 된다.이는 조합 공식을 이용하여 구할 수 있다.

CONTENTS

문제 풀이

조합nCr = n C n-r

즉, 5 개 중 2개 선택 = 5개 중 3 개 선택

n C r = n C n-r

𝒏 𝑪 𝟏 = 𝒏

𝟏

𝒏 𝑪 𝟐 =𝒏 ∗ (𝒏 − 𝟏)

𝟐 ∗ 𝟏

= n C 1 * (𝒏−𝟏)

𝟐

𝒏 𝑪 𝟑 = 𝒏 𝑪 𝟐 * (𝒏−𝟐)

𝟑

𝒏 𝑪𝒎 = 𝒏𝑪(𝒎 − 𝟏) * (𝒏−𝒎+𝟏)

𝒎

CONTENTS

소스 코드