-
[Algo Rhythm๐บ๐] ํ๋ก๊ทธ๋๋จธ์ค ๊ณ ๋์ Kit ์ ๋ง๋๊ธฐAlgo Rhythm๐บ๐/Programmers 2020. 7. 6. 20:55
๋ฌธ์ ์ค๋ช
์ฌ๋ฌ ๊ฐ์ ์ ๋ง๋๊ธฐ๋ฅผ ๋ ์ด์ ๋ก ์ ๋จํ๋ ค๊ณ ํฉ๋๋ค. ํจ์จ์ ์ธ ์์ ์ ์ํด์ ์ ๋ง๋๊ธฐ๋ฅผ ์๋์์ ์๋ก ๊ฒน์ณ ๋๊ณ , ๋ ์ด์ ๋ฅผ ์์์ ์์ง์ผ๋ก ๋ฐ์ฌํ์ฌ ์ ๋ง๋๊ธฐ๋ค์ ์๋ฆ ๋๋ค. ์ ๋ง๋๊ธฐ์ ๋ ์ด์ ์ ๋ฐฐ์น๋ ๋ค์ ์กฐ๊ฑด์ ๋ง์กฑํฉ๋๋ค.
- ์ ๋ง๋๊ธฐ๋ ์์ ๋ณด๋ค ๊ธด ์ ๋ง๋๊ธฐ ์์๋ง ๋์ผ ์ ์์ต๋๋ค.
- ์ ๋ง๋๊ธฐ๋ฅผ ๋ค๋ฅธ ์ ๋ง๋๊ธฐ ์์ ๋๋ ๊ฒฝ์ฐ ์์ ํ ํฌํจ๋๋๋ก ๋๋, ๋์ ์ ๊ฒน์น์ง ์๋๋ก ๋์ต๋๋ค.
- ๊ฐ ์ ๋ง๋๊ธฐ๋ฅผ ์๋ฅด๋ ๋ ์ด์ ๋ ์ ์ด๋ ํ๋ ์กด์ฌํฉ๋๋ค.
- ๋ ์ด์ ๋ ์ด๋ค ์ ๋ง๋๊ธฐ์ ์ ๋์ ๊ณผ๋ ๊ฒน์น์ง ์์ต๋๋ค.์๋ ๊ทธ๋ฆผ์ ์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์๋ฅผ ๋ณด์ฌ์ค๋๋ค. ์ํ์ผ๋ก ๊ทธ๋ ค์ง ๊ตต์ ์ค์ ์ ์ ๋ง๋๊ธฐ์ด๊ณ , ์ ์ ๋ ์ด์ ์ ์์น, ์์ง์ผ๋ก ๊ทธ๋ ค์ง ์ ์ ํ์ดํ๋ ๋ ์ด์ ์ ๋ฐ์ฌ ๋ฐฉํฅ์ ๋๋ค.
์ด๋ฌํ ๋ ์ด์ ์ ์ ๋ง๋๊ธฐ์ ๋ฐฐ์น๋ ๋ค์๊ณผ ๊ฐ์ด ๊ดํธ๋ฅผ ์ด์ฉํ์ฌ ์ผ์ชฝ๋ถํฐ ์์๋๋ก ํํํ ์ ์์ต๋๋ค.
(a) ๋ ์ด์ ๋ ์ฌ๋ ๊ดํธ์ ๋ซ๋ ๊ดํธ์ ์ธ์ ํ ์ '()'์ผ๋ก ํํํฉ๋๋ค. ๋ํ ๋ชจ๋ '()'๋ ๋ฐ๋์ ๋ ์ด์ ๋ฅผ ํํํฉ๋๋ค.
(b) ์ ๋ง๋๊ธฐ์ ์ผ์ชฝ ๋์ ์ฌ๋ ๊ดํธ '('๋ก, ์ค๋ฅธ์ชฝ ๋์ ๋ซํ ๊ดํธ ')'๋ก ํํ๋ฉ๋๋ค.์ ์์ ๊ดํธ ํํ์ ๊ทธ๋ฆผ ์์ ์ฃผ์ด์ ธ ์์ต๋๋ค.
์ ๋ง๋๊ธฐ๋ ๋ ์ด์ ์ ์ํด ๋ช ๊ฐ์ ์กฐ๊ฐ์ผ๋ก ์๋ฆฌ๋๋ฐ, ์ ์์์ ๊ฐ์ฅ ์์ ์๋ ๋ ๊ฐ์ ์ ๋ง๋๊ธฐ๋ ๊ฐ๊ฐ 3๊ฐ์ 2๊ฐ์ ์กฐ๊ฐ์ผ๋ก ์๋ฆฌ๊ณ , ์ด์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ฃผ์ด์ง ์ ๋ง๋๊ธฐ๋ค์ ์ด 17๊ฐ์ ์กฐ๊ฐ์ผ๋ก ์๋ฆฝ๋๋ค.
์ ๋ง๋๊ธฐ์ ๋ ์ด์ ์ ๋ฐฐ์น๋ฅผ ํํํ ๋ฌธ์์ด arrangement๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, ์๋ฆฐ ์ ๋ง๋๊ธฐ ์กฐ๊ฐ์ ์ด ๊ฐ์๋ฅผ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
์ ํ์ฌํญ
-
arrangement์ ๊ธธ์ด๋ ์ต๋ 100,000์ ๋๋ค.
-
arrangement์ ์ฌ๋ ๊ดํธ์ ๋ซ๋ ๊ดํธ๋ ํญ์ ์์ ์ด๋ฃน๋๋ค.
๋๋ ์ด๋ป๊ฒ ํ์๋
์ฒซ๋ฒ์งธ ์๋ (Queue ์ฌ์ฉ/ 100์ ๋ง์ ์ 10์ ๐ญ)
import java.util.Stack; import java.util.Queue; import java.util.LinkedList; import java.util.Arrays; import java.util.stream.Collectors; class Solution { public int solution(String arrangement) { int numSlicedIronBar = 0; Queue<String> arrgQ = new LinkedList<>(); int numAccumLaser = 0, numValidLaser = 0; int level = 0; // init arrgQ = Arrays.stream(arrangement.split("")).collect(Collectors.toCollection(LinkedList::new)); while(!arrgQ.isEmpty()) { String curr = arrgQ.remove(); if(arrgQ.isEmpty() && curr.equals(")")) { // deal with the last one // System.out.println("Level : " + level); // System.out.println("# valid laser : " + numValidLaser); numSlicedIronBar += (level > 0) ? (numValidLaser + 1) : 0; break; } String next = arrgQ.element(); if(isLaser(curr, next)) { arrgQ.remove(); // revmove ')' if(level > 0) { numAccumLaser++; numValidLaser++; } continue; } if(curr.equals("(")) { // level up numValidLaser = 0; level++; } if(curr.equals(")")) { // level down // System.out.println("Level : " + level); // System.out.println("# valid laser : " + numValidLaser); numSlicedIronBar += (level > 0) ? (numValidLaser + 1) : 0; level--; numAccumLaser = (level > 0) ? numAccumLaser : 0; numValidLaser = numAccumLaser; } } return numSlicedIronBar; } public boolean isLaser(String curr, String next) { return (curr.equals("(") && next.equals(")")); } }
๋๋ฒ์งธ ์๋ (stack ์ฌ์ฉ)
import java.util.Stack; import java.util.Arrays; import java.util.ArrayList; import java.util.stream.Collectors; class Solution { public int solution(String arrangement) { int numSlicedIronBar = 0; // pre-processing String revisedArrg = arrangement.replace("()", "0"); // init ArrayList<String> arrgLIst = Arrays.stream(revisedArrg.split("")) .collect(Collectors.toCollection(ArrayList::new)); Stack<String> lParens = new Stack<>(); for(String curr : arrgLIst) { if(isLaser(curr)) { numSlicedIronBar += lParens.size(); continue; } if(curr.equals("(")) { lParens.push(curr); } if(curr.equals(")")) { lParens.pop(); numSlicedIronBar += 1; } } return numSlicedIronBar; } public boolean isLaser(String curr) { return curr.equals("0"); } }
๋๋ ์ ์ ๋ ๊ฒ ํ์๋
์ฒซ๋ฒ์งธ ์๋
์ฒซ๋ฒ์งธ ์๋๋ '(์๋ฆฐ ์ ๋ง๋๊ธฐ์ ๊ฐ์) = (์ ๋ง๋๊ธฐ ์ฐ์ง ๋ฐฉํฅ์ ์๋ ๋ ์ด์ ์ ๊ฐ์ + 1)' ์ด๋ผ๋ ์ฑ์ง์ ์ด์ฉํด์ ์ฝ๋๋ฅผ ์์ฑํ๋ค. ๊ตฌ์ฒด์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ ์๋์ ๊ฐ๋ค.
-
arrangement๋ฅผ ๋๋ ์ ํ์ ๋ฃ๋๋ค.
-
ํ๊ฐ ๋น ๋๊น์ง ์๋ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
-
๋๊ฐ์ฉ ์ดํด๋ณด๋๋ฐ ๋ ์ด์ ์ด๋ฉด ์ฆ, ํ๋๊ฐ '('์ด๊ณ ๋ค๋ฅธ ํ๋๊ฐ ')'์ด๋ฉด '๋์ ๋ ๋ ์ด์ ๊ฐ์'์ '์ ํจํ ๋ ์ด์ ๊ฐ์'๋ฅผ 1์ฉ ์ฆ๊ฐํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฐ๋ณต๋ฌธ์ continueํ๋ค.
-
๋ง์ฝ ๋ ์ด์ ๊ฐ ์๋๊ณ ํ์ฌ popํ ๋ฌธ์๊ฐ '('์ด๋ฉด ์ฆ, ์ ๋ง๋๊ธฐ๊ฐ ํ๋ ์์ด๋ฉด level์ 1 ์ฆ๊ฐํ๊ณ '์ ํจํ ๋ ์ด์ ๊ฐ์'๋ฅผ 0์ผ๋ก ์ด๊ธฐํํ๋ค.
-
๋ง์ฝ ๋ ์ด์ ๊ฐ ์๋๊ณ ํ์ฌ popํ ๋ฌธ์๊ฐ ')'์ด๋ฉด ์ฆ, ์ ๋ง๋๊ธฐ๊ฐ ์์ธ level์ด ์ค์ด๋ค๋ฉด level์ ์ดํด๋ด์ 0๋ณด๋ค ํฌ๋ฉด '์๋ฆฐ ์ ๋ง๋๊ธฐ ๊ฐ์'์ '์ ํจํ ๋ ์ด์ ๊ฐ์' + 1๋งํผ ์ฆ๊ฐํ๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด 0๋งํผ ์ฆ๊ฐํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋์ level์ 1 ๊ฐ์ํ๊ณ level์ ํ์ธํด์ '๋์ ๋ ๋ ์ด์ ๊ฐ์'๊ฐ 0๋ณด๋ค ํด ๊ฒฝ์ฐ ๊ทธ๋๋ก ๋๊ณ ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ 0์ ์ด๊ธฐํํ๋ค. ๋ง์ง๋ง์ผ๋ก '์ ํจํ ๋ ์ด์ ๊ฐ์'๋ฅผ '๋์ ๋ ๋ ์ด์ ๊ฐ์'๋ก ์ด๊ธฐํํ๋ค.
-
์ด๋ ๊ฒ ํ๋๋ ํ ์คํธ๋ ํต๊ณผํ๋๋ฐ ์ ์ ์ฝ๋๋ฅผ ์ ์ถํ๋๊น 1๋ฒ๊ณผ 3๋ฒ์ ์ ์ธํ๊ณ ๋ ์คํจ๋ค..
์ด๋๊ฐ ํ๋ฆฐ๊ฑธ๊น... ๐ญ๐ญ
๋๋ฒ์งธ ์๋
๋๋ฒ์งธ ์๋๋ ์๋ ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํ๋ค.
์ด ์๋๋ '๋ ์ด์ ๋ฅผ ๋ง๋๊ธฐ ์ '('์ ๊ฐ์ = ํ ๋ง๋ ๋ง๋๊ธฐ์ ๊ฐ์' ๋ผ๋ ์ฑ์ง๊ณผ ')์ ๋ง๋๋ฉด ํ ๋ง๋ ๋ง๋๊ธฐ์ ๊ฐ์๋ฅผ 1์ฉ ์ฆ๊ฐํ๋ค.'๋ผ๋ ์ฑ์ง์ ์ด์ฉํ๋ค. ๊ตฌ์ฒด์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ ์๋์ ๊ฐ๋ค.
-
๋ ์ด์ ๋ฅผ ์๋ฏธํ๋ '()'์ '0'์ผ๋ก replaceํ๋ค.
-
์์ ํ arrg๋ฅผ list์ ์ ์ฅํ๋ค.
-
'('์ ์ ์ฅํ๋ ์คํ(lParens)์ผ๋ก ์ด๊ธฐํํ๋ค.
-
์๋์ ๊ฐ์ ๊ณผ์ ์ผ๋ก list๋ฅผ ์ํํ๋ค.
-
ํ์ฌ ๋ฌธ์๊ฐ ๋ ์ด์ ์ด๋ฉด ํ ๋ง๋ ์ ๋ง๋๊ธฐ์ ๊ฐ์๋ฅผ lParens์ ํฌ๊ธฐ๋งํผ ์ฆ๊ฐํ๋ค.
-
ํ์ฌ ๋ฌธ์๊ฐ '('์ด๋ฉด lParens์ ํ์ฌ ๋ฌธ์๋ฅผ pushํ๋ค.
-
ํ์ฌ ๋ฌธ์๊ฐ ')'์ด๋ฉด lParens๋ฅผ popํ ๋ค ํ ๋ง๋ ์ ๋ง๋๊ธฐ์ ๊ฐ์๋ฅผ 1๋งํผ ์ฆ๊ฐํ๋ค.
-
๋๋ ๋ฌด์์ ๋ฐฐ์ ๋
๋ ๋๋ผ๋ ๊ฒ์ด์ง๋ง ๋ด๊ฒ ํ ๊ฐ์ง ๋ฐฉ๋ฒ๋ง ๊ณ ์งํ์ง ์๋ ์ ์ฐํ ์ฌ๊ณ ๊ฐ ํ์ํ๋ค๊ณ ์๊ฐํ๋ค.
์ ์ฐํ ์ฌ๊ณ ๋ฅผ ๊ฐ์ง๊ธฐ ์ํด์๋ ๋ค๋ฅธ ์ฌ๋๋ค์ ์ฝ๋๋ ์ฝ์ด๋ณด๊ณ ์๋ก์ด ๋ฐฉ๋ฒ๋ค์ ๋ฐฐ์์ ๋ง์ด ์ ํ์๊ฐ ์๋ค. ๊ณต๋ถํ์!
'Algo Rhythm๐บ๐ > Programmers' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
-