[BOJ]1920 ์ ์ฐพ๊ธฐ (kotlin,java)
โ๋ฌธ์ โ
๐Solution๐
ใฐ๏ธList.contins()ํจ์ ์ฌ์ฉ : ์๊ฐ์ด๊ณผ
fun main(){
val numsCount=readLine()
val nums=readLine()!!.split(" ")
val inputsCount=readLine()
val inputs=readLine()!!.split(" ")
inputs.forEach{
println("${if(nums.contains(it))1 else 0}\n")
}
์ด ์ฝ๋๋ ์๊ฐ์ด๊ณผ๊ฐ ๋๋ค.๐
๊ฐ์ฅ ๊ฐ๋จํ๊ฒ ๊ตฌํํ ์ ์๋ ๋ฐฉ๋ฒ์ด์ง๋ง ์๊ฐ ๋ณต์ก๋๊ฐ $O(n^2)$์ด ๋๋ค.
inputs.forEach{
println("${if(nums.contains(it))1 else 0}\n")
}
์ ํจ์์ ๊ฒฝ์ฐ forEach
์์ inputs์ ํ๋ฒ ์ํํ๋ฉฐ ๊ทธ ์์์ contains()
ํจ์๋ก ์ ํํ์์ ํ๊ฒ ๋๋ค.
๋ฐ๋ผ์ ๋ฐ๋ณต๋ฌธ ์์์ ๋ฐ๋ณต๋ฌธ์ด ๋์ํ๋ฏ๋ก ์๊ฐ๋ณต์ก๋๋ \(O(n^2)\)์ด ๋๋ค.
์ฝํ๋ฆฐ์ ๊ฐ ํจ์์ ๋ํด ์ ๋ชจ๋ฅด๋ฉด ์ฝ๋์ ํจ์จ์ฑ์ ํธ๋ค๋งํ๊ธฐ ํ๋ ๋ฐ ์ด๋ฐ ๋ํ ์ผ ํ ๋ถ๋ถ์ด ์ข ์ฌ๋ฏธ์๋ ๊ฒ ๊ฐ๋ค.โบ๏ธ
ใฐ๏ธTwo pointer ์๊ณ ๋ฆฌ์ฆ : ์๊ฐ์ด๊ณผ
fun main(){
val n=readLine()!!.toInt()
val nums=readLine()!!.split(" ").map{it.toLong()}
val sortedNums=nums.sorted()
val m=readLine()!!.toInt()
val checkNums=readLine()!!.split(" ").map{it.toLong()}
val checkNumsIndexMap=checkNums
.withIndex()
.groupBy { it.value }
.mapValues { it.value.map { it.index } }
val sortedCheckNums=checkNums.sorted()
var compareIndex=0 // ๋ฐฐ์ด ์ธ๋ฑ์ค๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ณ์
var checkIndex=0 // ํฌํจ์ฌ๋ถ๋ฅผ ํ์ธํ ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ณ์
val res=BooleanArray(m){false}
while(checkIndex<m&&compareIndex<n){
val num=sortedNums[compareIndex]
val check=sortedCheckNums[checkIndex]
if(num==check){
checkNumsIndexMap[check]?.forEach{
res[it]=true
}
checkIndex++
compareIndex++
}
else if(num>check){
checkIndex++
}
else compareIndex++
}
res.forEach{
print("${if(it)1 else 0}\n")
}
}
๋ ๋ฒ์งธ๋ก ์ ๊ทผํ ๋ฐฉ๋ฒ์ ์ต๊ทผ์ ๋ฐฐ์ด ํฌ ํฌ์ธํฐ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค!
์ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ด ๋์ํ๋ค.
- ๋ฐฐ์ด์ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
- ํฌํจ ์ฌ๋ถ๋ฅผ ํ์ธํด์ผ ํ๋ ๋ฐฐ์ด์ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ ๋ฐ ์๋ ์์น์ ๋งคํ
-
ํฌ ํฌ์ธํฐ ์๊ณ ๋ฆฌ์ฆ์ ํตํด ํฌํจ ์ฌ๋ถ ํ์ธ
์ธ๋ฑ์ค 0 ๋ถํฐ ์๋ ํ๋ฆ์ ๋ฐ๋ผ ๋น๊ต
(num : ์๋ ๋ฐฐ์ด์์ ํ์ฌ ๊ฐ๋ฆฌํค๋ ์์)
(check : ํฌํจ ์ฌ๋ถ๋ฅผ ํ์ธํด์ผ ํ๋ ๋ฐฐ์ด์์ ํ์ฌ ๊ฐ๋ฆฌํค๋ ์์)
์์ ๊ฐ์ด ๋์ํ๋ ์ฝ๋๋ ์๋์ ๊ฐ์ ๊ณ ๋ คํ ์ ์ด ์๋ค.
- ๋ฐฐ์ด ์ ๋ ฌ ์ ์๊ฐ ๋ณต์ก๋ :
- ํฌํจ ์ฌ๋ถ๋ฅผ ํ์ธํด์ผ ํ๋ ๋ฐฐ์ด ์ ๋ ฌ ๋ฐ ๋งคํ ์ ์๊ฐ ๋ณต์ก๋
- ํฌ ํฌ์ธํฐ ์๊ณ ๋ฆฌ์ฆ์์ ์๊ฐ ๋ณต์ก๋
sorted()
- ์ค๋ฆ์ฐจ์ ์ ๋ ฌํด์ค
- quick sort ๊ธฐ๋ฐ ์ ๋ ฌ
- ์ ๋ ฌ์ ์์ ์ (stable)
- ๊ธฐ์กด ๋ฆฌ์คํธ๋ ๋ณ๊ฒฝ๋์ง ์๊ณ ์๋ก์ด ์ ๋ ฌ๋ ๋ฆฌ์คํธ๋ฅผ ์์ฑํด ๋ฐํ
์ด๊ฒ๋ ์กฐ์ฌํ๋ค ๋ณด๋ ๊ธธ์ด์ง ๊ฒ ๊ฐ์์ ์ฌ๊ธฐ์๋ ๊ฐ๋จํ sorted()
ํจ์์ ๋ํด์ ์ค๋ช
ํ๊ณ ๋ค๋ฅธ ํฌ์คํ
์์ ์ฝํ๋ฆฐ์ ์ ๋ ฌ์ ๋ํ ์ ๋ฐ์ ์ธ ๋ด์ฉ์ ๋ค๋ค๋ณด๊ธฐ๋ก ํ๋ค!
ใฐ๏ธSet.contains() ํจ์ ์ฌ์ฉ : 1804ms
๋ง์ง๋ง์ผ๋ก๋ ์ฒซ ๋ฒ์งธ ์ ๊ทผ์์ ์ฝ๊ฐ ์์ ํด์ Set.contains()
์ ํ์ฉํ์ฌ ํ์์ ํด๋ดค๋ค.
set์ ์๋ฃ๊ตฌ์กฐ ์ list๋ณด๋ค ๋ ํจ์จ์ ์ผ๋ก ํฌํจ๋๋ ์์๋ฅผ ์ฐพ์ ์ ์์ด Set.contains()
๋ List.contins()
๋ณด๋ค ํจ์จ์ด ์ข๋ค.
์ฌ์ฉํ๋ set์ ์ข ๋ฅ๋ณ๋ก ํ์ ๋ฐฉ๋ฒ์ด ์กฐ๊ธ์ฉ ๋ฌ๋ผ์ ์ด๋ถ๋ถ๋ ๋์ค์ ๊ณต๋ถํด๋ณด๋ฉด ์ฌ๋ฏธ์์๊ฒ๊ฐ๋ค!
fun main(){
val n=readLine()!!.toInt()
val nums=readLine()!!.split(" ").map{it.toLong()}.toSet()
val m=readLine()!!.toInt()
val checkNums=readLine()!!.split(" ").map{it.toLong()}
checkNums.forEach{
print("${if(nums.contains(it))1 else 0}\n")
}
}
๐Advanced๐
๋ค๋ฅธ ์ฌ๋์ ํ์ด๋ฅผ ๋ณด๋ ๊ฐ์ฅ ๋น ๋ฅธ ํ์ด๋ 268ms๋ก ๋ด ํ์ด๋ณด๋ค 7๋ฐฐ ์ ๋ ๋นจ๋๋ค.
๋ค๋ฅธ ํ์ด๋ค๋ ๋๋ถ๋ถ 500ms๋๋ก ๋ด ํ์ด๋ณด๋ค 3๋ฐฐ์ ๋ ๋นจ๋๋ค.
๋ฐฑ์ค์ ์๊ณ ๋ฆฌ์ฆ ๊ตฌ๋ถ์ ๋ณด๋ ์ด์ง ํ์์ ํ์ฉํ์ฌ ๋น ๋ฅด๊ฒ ํ์ดํ ์ ์๋ ๋ฏ ํ๋ค.
ใฐ๏ธ์ด์ง ํ์ : 864ms
์ง๊ธ ์๊ฐํ๋ฉด ์ฒซ ๋ฒ์งธ ์๋ ํ์ ์ด์ง ํ์ ์ ๊ทผ์ ๊ณ ๋ คํด ๋ณผ ์๋ ์์์ํ ๋ฐ ํ๋ ์๊ฐ์ด ๋ ๋ค๐ฅฒ
์ด๋ฒ์๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ณ๊ฒฝ ๋ฟ๋ง ์๋๋ผ IO์ ๊ด๋ จ๋ ์ฝ๋๋ ๊ฐ์ ํด๋ณด์๋ค.
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
fun main(){
val br=BufferedReader(InputStreamReader(System.`in`))
val bw=BufferedWriter(OutputStreamWriter(System.out))
val n=br.readLine().toInt()
val nums=br.readLine().split(" ").map{it.toInt()}.toMutableList()
nums.sort()
val m=br.readLine().toInt()
val checkNums=br.readLine().split(" ").map{it.toInt()}
checkNums.forEach{
bw.write("${if(nums.binarySearch(it)<0)0 else 1}\n")
}
bw.flush()
}
-
Buffer๋ฅผ ์ฌ์ฉํ IO ํจ์จ ๊ฐ์
val br=BufferedReader(InputStreamReader(System.`in`))
- System.
in
: ํ์ค ์ ์ถ๋ ฅ ์คํธ๋ฆผ(ํค๋ณด๋ ๋ฑ) ์๋ฏธ - InputStreamReader : ๋ฐ์ดํธ ์คํธ๋ฆผ(InputStream)โ ๋ฌธ์ ์คํธ๋ฆผ(Reader)
- BufferedReader : InputStreamReader์์ ๋ณํํ ๋ฌธ์ ์คํธ๋ฆผ์ ๋ฒํผ๋ง.
val bw=BufferedWriter(OutputStreamWriter(System.out))
- System.out : ํ์ค ์ถ๋ ฅ ์คํธ๋ฆผ(์ฝ์ ์ถ๋ ฅ ๋ฑ) ์๋ฏธ
- OutputStreamWriter : ๋ฌธ์์คํธ๋ฆผ(Writer)โ ๋ฐ์ดํธ์คํธ๋ฆผ(OutputStreamWriter)
- BufferedWriter : ๋ฌธ์์คํธ๋ฆผ์ ๋ฒํผ๋งํ๋ค๊ฐ(
write()
) OutputStreamWriter๋ฅผ ์ฌ์ฉํด ๋ฐ์ดํธ ์คํธ๋ฆผ์ผ๋ก ๋ณํ ํ ํ๋ฒ์ ๋ด๋ณด๋(flush()
).
- System.
-
์ด์ง ํ์ ์ฌ์ฉ
val nums=br.readLine().split(" ").map{it.toInt()}.toMutableList() nums.sort()
- ์ด์ง ํ์์ ํ๊ธฐ ์ํด nums๋ฅผ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
- ์ด๋ ์ ๋ ฌ ๋ฐฉ๋ฒ์ quicksort
bw.write("${if(nums.binarySearch(it)<0)0 else 1}\n")
binarySearch()
ํจ์๋ก ์ด์งํ์ ์ํ
ํฌํฌ์ธํฐ ์๊ณ ๋ฆฌ์ฆ vs ์ด์งํ์ ์๊ณ ๋ฆฌ์ฆ
๋ด๊ฐ ์ด ๋ฐฉ๋ฒ์ผ๋ก ๋ฌธ์ ๋ฅผ ํ ๋ ๊ฐ์ฅ ๋ง์ด ๊ณ ๋ฏผํ๋ ๊ฑด ํฌ ํฌ์ธํฐ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํธ๋ ๊ฒ ๋ ํจ์จ์ ์ผ๋ก ๋ณด์๊ธฐ ๋๋ฌธ์ด๋ค.
์ด์ง ํ์์ ๊ฒฝ์ฐ ๋งค ์์๋ง๋ค ํ์์ ํด์ผ ํ๋๋ฐ ๋นํด ํฌ ํฌ์ธํฐ ์๊ณ ๋ฆฌ์ฆ์ ํ๋ฒ์ ๋ฐ๋ณต๋ฌธ์์ ๋ต์ ์ฐพ์๋ผ ์ ์์ผ๋ ๋ญ๊ฐ ๋ ํจ์จ์ ์ด์ฌ ๋ณด์๋ค.
๋น๊ต ํ๊ธฐ ์ฝ๊ฒ ๊ฐ ์ฝ๋์ ์ ์ฐจ ๋ณ๋ก ์ฌ์ฉ๋ ํจ์๋ฅผ ํ๋ก ์ ๋ฆฌํด๋ณด์๋ค.
๊ตฌ๋ถ | ํฌํฌ์ธํฐ | ์ด์งํ์ |
---|---|---|
์ซ์ ๋ฐฐ์ด ์ ๋ ฌ | split map sorted |
sort |
(์๊ฐ๋ณต์ก๋) | $O(nlogn)$ | $O(nlogn)$ |
ํ์ธ ์ซ์ ๋ฐฐ์ด ์ ๋ ฌ | groupBy mapValues sorted |
x |
(์๊ฐ๋ณต์ก๋) | $O(mlogm)$ | x |
ํ์ ์๊ณ ๋ฆฌ์ฆ | Two Pointer | Binary Search |
(์๊ฐ๋ณต์ก๋) | $O(n+m)$ | $O(m log n)$ |
์ ์ฒด ์๊ฐ ๋ณต์ก๋ | $O(nlogn+mlogm+n+m)$ | $O(nlogn+mlogn)$ |
๊ทธ๋ฅ ์๊ฐํ์ ๋๋ ํฌ ํฌ์ธํฐ ์๊ณ ๋ฆฌ์ฆ์ด ๋นจ๋ผ ๋ณด์๋๋ฐ ํฌ ํฌ์ธํฐ ์๊ณ ๋ฆฌ์ฆ์ ์ฐ๊ธฐ ์ํ ์ ์ฒ๋ฆฌ ๊ณผ์ ์์ ์ด์งํ์๋ณด๋ค ์ค๋ฒํค๋๊ฐ ๋ง์ด ์ผ์ด๋จ์ ์ ์ ์์๋ค.
๋ฐ๋ผ์ ์ด ๋ฌธ์ ์์๋ ์ด์งํ์์ ํ์ฉํ๋๊ฒ ๋ ์ ํฉํ๋ค๋ ๊ฒฐ๋ก ์ ๋ด๋ฆด ์ ์๋ค.
ใฐ๏ธSet.contains() + IO ๊ฐ์ : 676ms
๊ณต๋ถ๋ฅผ ํ๋ค ๋ณด๋ set.contains๊ฐ ์ด์ง ํ์๋ณด๋ค ํจ์จ์ด ์ข์ง ์์๊น ํ๋ ์๊ฐ์ด ๋ฌธ๋ฉ ๋ค์ด ์ธ ๋ฒ์งธ ์๋ํ ์ฝ๋์์ IO๋ฅผ ๋ฒํผ๋ฅผ ์ฌ์ฉํด ๊ฐ์ ํด ๋ณด์๋ค.
fun main(){
val br=BufferedReader(InputStreamReader(System.`in`))
val bw=BufferedWriter(OutputStreamWriter(System.out))
val n=br.readLine().toInt()
val nums=br.readLine().split(" ").map{it.toLong()}.toSet()
val m=br.readLine().toInt()
val checkNums=br.readLine().split(" ").map{it.toLong()}
checkNums.forEach{
bw.write("${if(nums.contains(it))1 else 0}\n")
}
bw.flush()
}
๊ฒฐ๊ณผ๋ 676ms๋ก ๊ฐ์ฅ ๋นจ๋๋ค!
์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ์ธ ์ค ์์๋๋ฐ ์ ์ถ๋ ฅ์ ๋นํจ์จ์ด ๊ฐ์ฅ ํฐ ๋ฌธ์ ์๋๋ณด๋ค.๐
์ฝ๊ฐ ํํํ๊ธฐ๋ ํ์ง๋ง set์ contains()
ํจ์๋ฅผ ์กฐ์ฌํ๋ค ๋ณด๋ ์ด๊ฒ๋ ๊ณต๋ถ ๊ฑฐ๋ฆฌ๊ฐ ๊ฝค ์์ด์ ์คํ๋ ค ์ข๋ค!๐
๐ JAVA๋ก ํ์ด๋ณด๊ธฐ๐
๋ง์ ๊ฐ์์๋ ์ฝํ๋ฆฐ์ผ๋ก ์ฝํ ๋ฅผ ์ค๋นํ๊ณ ์ถ์ง๋ง ์ฝํ ์์ ์ฝํ๋ฆฐ์ ์ ์ง๋ ๋๋ฌด๋ ์ข์ผ๋ฏ๋ก ๊ฒธ์ฌ๊ฒธ์ฌ ๋ง์ง๋ง ์ฝ๋๋ฅผ ์๋ฐ๋ก ์ฝ๋ฉํ๋ฉด์ ์๋ฐ๋ ๊ฐ์ด ์ฐ์ตํด๋ณด๊ธฐ๋ก ํ๋ค.๐ฅฒ
import java.util.HashSet;
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n=sc.nextInt();
sc.nextLine();
HashSet<Integer> set= new HashSet<Integer>();
String[] nums=sc.nextLine().split(" ");
for(int i=0;i<n;i++){
set.add(Integer.parseInt(nums[i]));
}
int m=sc.nextInt();
sc.nextLine();
String[] checkNums=sc.nextLine().split(" ");
for(int i=0;i<m;i++){
int num=Integer.parseInt(checkNums[i]);
System.out.println(set.contains(num)?1:0);
}
}
}
๊ฐ์ ์๊ณ ๋ฆฌ์ฆ์ธ๋ฐ ์๊ฐ์ฐจ์ด๊ฐ ๋ง์ด๋๋ค..ใ
์์ง ์๋ฐ๊ฐ ๋ฏธ์ํด์ ๊ทธ๋ฐ๊ฐ ๋ณด๋ค.
์๋ฐ๋ก ์ต์ ํํ๋ ๊ฒ๋ ํ๊ณ ์ถ์ง๋ง ์ง๊ธ์ ๋๋ฌด ๋ฐฉ์ ์ด๋ผ์ ๋ค์์ ๋ค๋ฅธ ์ฝ๋๋ํ ํฌ์คํ ์์ ํด๋ณด๊ธฐ๋ก ํ๋ค๐ฅฒ
๋๊ธ๋จ๊ธฐ๊ธฐ