-
[Algo Rhythm๐บ๐] ํ๋ก๊ทธ๋๋จธ์ค ๊ณ ๋์ kit ๊ตฌ๋ช ๋ณดํธAlgo Rhythm๐บ๐/Programmers 2020. 7. 8. 20:01
๋ฌธ์ ์ค๋ช
๋ฌด์ธ๋์ ๊ฐํ ์ฌ๋๋ค์ ๊ตฌ๋ช ๋ณดํธ๋ฅผ ์ด์ฉํ์ฌ ๊ตฌ์ถํ๋ ค๊ณ ํฉ๋๋ค. ๊ตฌ๋ช ๋ณดํธ๋ ์์์ ํ ๋ฒ์ ์ต๋ 2๋ช ์ฉ ๋ฐ์ ํ ์ ์๊ณ , ๋ฌด๊ฒ ์ ํ๋ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ์ฌ๋๋ค์ ๋ชธ๋ฌด๊ฒ๊ฐ [70kg, 50kg, 80kg, 50kg]์ด๊ณ ๊ตฌ๋ช ๋ณดํธ์ ๋ฌด๊ฒ ์ ํ์ด 100kg์ด๋ผ๋ฉด 2๋ฒ์งธ ์ฌ๋๊ณผ 4๋ฒ์งธ ์ฌ๋์ ๊ฐ์ด ํ ์ ์์ง๋ง 1๋ฒ์งธ ์ฌ๋๊ณผ 3๋ฒ์งธ ์ฌ๋์ ๋ฌด๊ฒ์ ํฉ์ 150kg์ด๋ฏ๋ก ๊ตฌ๋ช ๋ณดํธ์ ๋ฌด๊ฒ ์ ํ์ ์ด๊ณผํ์ฌ ๊ฐ์ด ํ ์ ์์ต๋๋ค.
๊ตฌ๋ช ๋ณดํธ๋ฅผ ์ต๋ํ ์ ๊ฒ ์ฌ์ฉํ์ฌ ๋ชจ๋ ์ฌ๋์ ๊ตฌ์ถํ๋ ค๊ณ ํฉ๋๋ค.
์ฌ๋๋ค์ ๋ชธ๋ฌด๊ฒ๋ฅผ ๋ด์ ๋ฐฐ์ด people๊ณผ ๊ตฌ๋ช ๋ณดํธ์ ๋ฌด๊ฒ ์ ํ limit๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, ๋ชจ๋ ์ฌ๋์ ๊ตฌ์ถํ๊ธฐ ์ํด ํ์ํ ๊ตฌ๋ช ๋ณดํธ ๊ฐ์์ ์ต์๊ฐ์ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
์ ํ์ฌํญ
-
๋ฌด์ธ๋์ ๊ฐํ ์ฌ๋์ 1๋ช ์ด์ 50,000๋ช ์ดํ์ ๋๋ค.
-
๊ฐ ์ฌ๋์ ๋ชธ๋ฌด๊ฒ๋ 40kg ์ด์ 240kg ์ดํ์ ๋๋ค.
-
๊ตฌ๋ช ๋ณดํธ์ ๋ฌด๊ฒ ์ ํ์ 40kg ์ด์ 240kg ์ดํ์ ๋๋ค.
-
๊ตฌ๋ช ๋ณดํธ์ ๋ฌด๊ฒ ์ ํ์ ํญ์ ์ฌ๋๋ค์ ๋ชธ๋ฌด๊ฒ ์ค ์ต๋๊ฐ๋ณด๋ค ํฌ๊ฒ ์ฃผ์ด์ง๋ฏ๋ก ์ฌ๋๋ค์ ๊ตฌ์ถํ ์ ์๋ ๊ฒฝ์ฐ๋ ์์ต๋๋ค.
์ด๋ป๊ฒ ํ์๋
์ฒซ๋ฒ์งธ ์๋ (20์ )
import java.util.Arrays; import java.util.ArrayList; import java.util.stream.Collectors; class Solution { public int solution(int[] people, int limit) { int numBoats = 0; //init ArrayList<Integer> peopleList = Arrays.stream(people) .boxed() .collect(Collectors.toCollection(ArrayList::new)); while(!peopleList.isEmpty()) { int personWeight = peopleList.remove(0); for(int i = 0; i < peopleList.size(); i++) { if(personWeight + peopleList.get(i) <= limit) { //total <= limit peopleList.remove(i); break; } } numBoats++; } return numBoats; } }
๋๋ฒ์งธ ์๋(์ ํ์ฑ : 75, ํจ์จ์ฑ : 0)
import java.util.Arrays; class Solution { public int solution(int[] people, int limit) { int numBoat = 0; int numPassenger = 0; int n = people.length; boolean twoOnBoard; boolean[] saved = new boolean[n]; // default : false Arrays.sort(people); for(int i = n-1; i >= 0; i--) { if(saved[i]) continue; saved[i] = true; // ith man on board twoOnBoard = false; for(int j = i-1; j >= 0; j--) { if(!saved[j] && people[i] + people[j] <= limit) { saved[j] = true; // jth man on board twoOnBoard = true; numBoat++; break; } } if(!twoOnBoard) numBoat++; } return numBoat; } }
์ธ๋ฒ์งธ ์๋(์ ํ์ฑ : 75, ํจ์จ์ฑ : 0)
import java.util.Arrays; class Solution { public int solution(int[] people, int limit) { int numPassenger = 0; int n = people.length; int numBoat = n; boolean[] saved = new boolean[n]; // default : false Arrays.sort(people); for(int i = n-1; i >= 0; i--) { if(saved[i]) continue; saved[i] = true; // ith man on board for(int j = i-1; j >= 0; j--) { if(!saved[j] && people[i] + people[j] <= limit) { saved[j] = true; // jth man on board numBoat--; break; } } } return numBoat; } }
๋ค๋ฒ์งธ ์๋(์ ํ์ฑ : 75, ํจ์จ์ฑ : 0)
import java.util.Arrays; class Solution { public int solution(int[] people, int limit) { int n = people.length; int numBoat = n; int lightestIdx = 0; int lightest, heaviest; Arrays.sort(people); for(heaviest = n-1; heaviest >= 0; heaviest--) { if(lightestIdx == heaviest) break; // no man to save for(lightest = lightestIdx; lightest < heaviest; lightest++) { if(people[heaviest] + people[lightest] <= limit) { lightestIdx++; numBoat--; break; } } } return numBoat; } }
์ต์ข ์ฝ๋(100์ ๐ญ)
import java.util.Arrays; class Solution { public int solution(int[] people, int limit) { int n = people.length; int numBoat = n; int lightest = 0, heaviest = n - 1; Arrays.sort(people); while(lightest < heaviest) { // no man is able to ride with the heaviest man if(people[lightest] + people[heaviest] > limit) { heaviest--; continue; } // The heaviest and the lightest are able to ride together else { heaviest--; lightest++; numBoat--; } } return numBoat; } }
์ ์ ๋ ๊ฒ ํ์๋
์ฒซ๋ฒ์งธ ์๋
๋ฌธ์ ๋ฅผ ์ฒ์ฒํ ์๊ฐํด๋ณด๋ ๊ฒฐ๊ตญ ๋๊ฐ ๋จผ์ ๊ตฌ๋ช ๋ณดํธ๋ฅผ ํ๋์ง๋ ์ค์ํ์ง ์๊ณ ๊ตฌ๋ช ๋ณดํธ๋ฅผ ํ๋ pair๋ฅผ ๋ง๋๋ ๊ฒ์ด ์ค์ํ๋ค๋ ๊ฒ์ ๊นจ๋ฌ์๋ค. ๊ทธ๋์ ์ฌ๋๋ค์ ๋ฌด๊ฒ๋ฅผ ๋ํ๋ด๋ ๋ฐฐ์ด people์ arraylist์ ์ ์ฅํด์ ์ง์ ์ฐพ์ผ๋ฉด ์ง๊ณผ ํจ๊ป arraylist์์ ์ญ์ ํ๊ณ ์ง์ ์ฐพ์ง ๋ชป ํ๋ฉด ์๊ธฐ ํผ์๋ง ์ญ์ ๋๋๋ก ์ฝ๋๋ฅผ ๊ตฌํํ๋ค.
๋๋ฒ์งธ ์๋
์ฒซ๋ฒ์งธ ์คํจ ํ ์๊ฐํด๋ณด๋ ์ด ๋ฌธ์ ๊ฐ ์๊ณ ๋ฆฌ์ฆ ์๊ฐ์ ๋ฐฐ์ด Knapsack problem๊ณผ ๋ฎ์๋ค๋ ๊ฒ์ ์๊ฒ ๋์๋ค. ๋ด๊ฐ ๊ธฐ์ตํ๋ Knapsack problem์ ํต์ฌ์ '๊ฝ๊ฝ ์ฑ์ ๋ฃ๊ธฐ'์๋ค. ๊ทธ๋์ ๊ตฌ๋ช ๋ณดํธ์ ๊ฝ๊ฝ ์ฑ์๋ฃ๊ธฐ ์ํด ๊ฐ์ฅ ๋ฌด๊ฑฐ์ด ์ฌ๋ ํ๋์ ๊ทธ ์ฌ๋๋ณด๋ค ๋ ๋ฌด๊ฑฐ์ด ์์๋ก ์ญ ํ์ด๋ณด๋ฉด์ ์ง์ ์ฐพ๊ธฐ๋ก ํ๋ค.
์๊ณ ๋ฆฌ์ฆ์ ์ ํํ์ผ๋ ์๊ฐ์ด ๋๋ฌด ์ค๋ ๊ฑธ๋ ธ๋ค.
์ธ๋ฒ์งธ ์๋
๋๋ฒ์งธ ์คํจ ํ ์๊ฐํด๋ณด๋ ๋ณ์ ์ฌ์ฉ์ด ๋๋ฌด ๋ง์ ๊ฒ์ด ์์ธ์ผ์ง๋ ๋ชจ๋ฅธ๋ค๋ ์๊ฐ์ด ๋ค์๋ค.
๊ทธ๋์ ๋ณ์๋ฅผ ์ค์ด๊ธฐ ์ํด ๊ณ ๋ฏผํ๋ ์ค ์ต์ ์ ๊ฒฝ์ฐ ํ ์ฌ๋๋น ํ๋์ ๋ณดํธ๊ฐ ํ์ํ๋ค๋ ๊ฒ์ ์๊ฒ ๋์๋ค.
๊ทธ๋์ ์ผ๋จ ๋ณดํธ๋ฅผ ์ฌ๋์ ์๋ก ์ด๊ธฐํํ๊ณ ๋ ์ฌ๋์ด ๊ตฌ๋ช ๋ณดํธ์ ํ์นํ ์กฐ๊ฑด์ด ๋ง์กฑ๋๋ฉด ๋ณดํธ์ ์๋ฅผ ์ค์ด๋๋ก ์ฝ๋๋ฅผ ์์ฑํ๋ค.
๋๋ฒ์งธ ์๋์ ๋ง์ฐฌ๊ฐ์ง๋ก ์๊ณ ๋ฆฌ์ฆ์ ์ ํํ์ผ๋ ์๊ฐ์ด ๋ฌธ์ ์๋ค.
๋ค๋ฒ์งธ ์๋
์ธ๋ฒ์งธ ์คํจ ํ ์๊ฐํด๋ณด๋ '๊ฝ๊ฝ ์ฑ์๋ฃ๊ธฐ'๋ฅผ ๋น ๋ฅด๊ฒ ํ๋ ค๋ฉด ๋ฌด๊ฑฐ์ด ์ฌ๋๊ณผ ๊ทธ ์ฌ๋๋ณด๋ค ๋ ๋ฌด๊ฑฐ์ด ์ฌ๋ ์์๋๋ก ๋ณด๋ ๊ฒ์ด ์๋๋ผ ๊ฐ์ฅ ๋ฌด๊ฑฐ์ด ์ฌ๋๊ณผ ๊ฐ์ฅ ๊ฐ๋ฒผ์ด ์ฌ๋ ์์๋๋ก ๋ณด์์ผ ํ๋ค๋ ๊ฒ์ ๊นจ๋ฌ์๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ ๊ฒ ์ฝ๋๋ฅผ ์์ฑํ ๊ฒฝ์ฐ ๊ฐ ์ฌ๋์ ๊ตฌ์กฐ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ saved๋ผ๋ boolean ํ์ ์ ๋ฐฐ์ด๋ ํ์ํ์ง ์๋ค๋ ๊ฒ์ ๊นจ๋ฌ์๋ค.
์ธ๋ฒ์งธ ์๋์ ๋ง์ฐฌ๊ฐ์ง๋ก ์๊ณ ๋ฆฌ์ฆ์ ์ ํํ์ผ๋ ์ฌ์ ํ ๋๋ ธ๋ค.
์ต์ข ์ฑ๊ณต
๋ค๋ฒ์งธ ์คํจ ํ ๊ณ์ ์๊ฐํ๋ค.
'์ ๋ ฌ ํ ์๊ฐ๋ณต์ก๋ O(n) ์์ ์ฒ๋ฆฌํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น?'
๊ทธ ๋ ๋ง์นจ ์ผ๋ง ์ ๊ธฐ์ฌ์์ ์ฐพ์๋ณธ two-pointer ๊ธฐ๋ฒ์ด ๋ ์ฌ๋๋ค.
Two pointer ๊ธฐ๋ฒ์ ํต์ฌ์ '์ ๋ ฌ๋ ์ซ์๋ค ์ ๋์ ๋ ์ง์ ์ ๊ฐ๋ฆฌํค๊ณ ๊ฐ๋ฆฌํจ ๋ฐฉํฅ์ ์๋ ๊ฐ๋ค์ ๊ณฑ/ ํฉ/ ์ฐจ ๋ฑ์ด ๋ดํฌํ๋ ์๋ฏธ๋ฅผ ํ์ ํด์ ๊ฐ๋ฆฌํจ ๋ฐฉํฅ์ ์ฎ๊ธฐ๋ ๊ฒ'์ด๋ค.
์๊ฐํด๋ณด๋ ์ ๋ ฌ์ ํ๋ฉด ๊ฐ์ฅ ๋ฌด๊ฑฐ์ด ์ฌ๋์ด ์ค๋ฅธ์ชฝ์, ๊ฐ์ฅ ๊ฐ๋ฒผ์ด ์ฌ๋์ด ์ผ์ชฝ์ผ๋ก ์ค๊ฒ ๋๋ค.
๋ง์ฝ ๊ฐ์ฅ ๋ฌด๊ฑฐ์ด ์ฌ๋๊ณผ ๊ฐ์ฅ ๊ฐ๋ฒผ์ด ์ฌ๋์ ๋ฌด๊ฒ ํฉ์ด limit๋ณด๋ค ํฌ๋ค๋ฉด ๊ทธ๊ฒ์ด ๋ดํฌํ๋ ์๋ฏธ๋ '๊ฐ์ฅ ๋ฌด๊ฑฐ์ด ์ฌ๋๊ณผ ๊ฐ์ด ๊ตฌ๋ช ๋ณดํธ๋ฅผ ํ ์ ์๋ ์ฌ๋์ ์๋ค'์ด๋ค. ์๋ํ๋ฉด ๊ฐ์ฅ ๊ฐ๋ฒผ์ด ์ฌ๋๋ ๊ฐ์ด ๋ชป ํ๋๋ฐ ๊ทธ ์ฌ๋๋ณด๋ค ๋ฌด๊ฑฐ์ด ์ฌ๋๋ค์ ๋น์ฐํ ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๊ฐ์ ๋ ผ๋ฆฌ๋ก ๊ฐ์ฅ ๊ฐ๋ฒผ์ด ์ฌ๋๊ณผ ๊ฐ์ฅ ๋ฌด๊ฑฐ์ด ์ฌ๋์ ๋ฌด๊ฒ ํฉ์ด limit๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ผ๋ฉด ๊ทธ๊ฒ์ด ๋ดํฌํ๋ ์๋ฏธ๋ '๊ฐ์ฅ ๋ฌด๊ฑฐ์ด ์ฌ๋๊ณผ ๊ฐ์ฅ ๊ฐ๋ฒผ์ด ์ฌ๋์ ๊ฐ์ด ๊ตฌ๋ช ๋ณดํธ๋ฅผ ํ ์ ์๋ค.'์ด๋ค.
์ด ๋๊ฐ์ง๋ฅผ ์ด์ฉํด์ ์ฝ๋๋ฅผ ์์ฑํ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฒฐ๊ณผ๋ ๋์ฑ๊ณต ๐ญ
๋ฌด์์ ๋ฐฐ์ ๋
ํฌ๊ธฐํ์ง ์๊ณ ์๊ฐํ๊ณ ๋ ์๊ฐํ๋ ์ฐ์ต์ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ํฌํฌ์ธํฐ ์๊ณ ๋ฆฌ์ฆ์ด ์ฐ์ด๋ ์ค์ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํด์ ๊ธฐ์๋ค. ๐
'Algo Rhythm๐บ๐ > Programmers' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
-