๐Ÿฅ‡ [Baekjoon / Java] 1700. ๋ฉ€ํ‹ฐํƒญ ์Šค์ผ€์ค„๋ง

์ดํ•˜์–€ยท2024๋…„ 6์›” 4์ผ
0

๐Ÿฃ ๋ฐฑ์ค€

๋ชฉ๋ก ๋ณด๊ธฐ
17/33

๋ฌธ์ œ ์„ค๋ช…


๐Ÿ’ก Info

๋‚ด์šฉ

๊ธฐ์ˆ™์‚ฌ์—์„œ ์‚ด๊ณ  ์žˆ๋Š” ์ค€๊ทœ๋Š” ํ•œ ๊ฐœ์˜ ๋ฉ€ํ‹ฐํƒญ์„ ์ด์šฉํ•˜๊ณ  ์žˆ๋‹ค. ์ค€๊ทœ๋Š” ํ‚ค๋ณด๋“œ, ํ—ค์–ด๋“œ๋ผ์ด๊ธฐ, ํ•ธ๋“œํฐ ์ถฉ์ „๊ธฐ, ๋””์ง€ํ„ธ ์นด๋ฉ”๋ผ ์ถฉ์ „๊ธฐ ๋“ฑ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ „๊ธฐ์šฉํ’ˆ์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์–ด์ฉ” ์ˆ˜ ์—†์ด ๊ฐ์ข… ์ „๊ธฐ์šฉํ’ˆ์˜ ํ”Œ๋Ÿฌ๊ทธ๋ฅผ ๋บ๋‹ค ๊ฝ‚์•˜๋‹ค ํ•˜๋Š” ๋ถˆํŽธํ•จ์„ ๊ฒช๊ณ  ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ค€๊ทœ๋Š” ์ž์‹ ์˜ ์ƒํ™œ ํŒจํ„ด์„ ๋ถ„์„ํ•˜์—ฌ, ์ž๊ธฐ๊ฐ€ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ์ „๊ธฐ์šฉํ’ˆ์˜ ์‚ฌ์šฉ์ˆœ์„œ๋ฅผ ์•Œ์•„๋‚ด์—ˆ๊ณ , ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ”Œ๋Ÿฌ๊ทธ๋ฅผ ๋นผ๋Š” ํšŸ์ˆ˜๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ณ ์•ˆํ•˜์—ฌ ๋ณด๋‹ค ์พŒ์ ํ•œ ์ƒํ™œํ™˜๊ฒฝ์„ ๋งŒ๋“ค๋ ค๊ณ  ํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด 3 ๊ตฌ(๊ตฌ๋ฉ์ด ์„ธ ๊ฐœ ๋‹ฌ๋ฆฐ) ๋ฉ€ํ‹ฐํƒญ์„ ์“ธ ๋•Œ, ์ „๊ธฐ์šฉํ’ˆ์˜ ์‚ฌ์šฉ ์ˆœ์„œ๊ฐ€ ์•„๋ž˜์™€ ๊ฐ™์ด ์ฃผ์–ด์ง„๋‹ค๋ฉด,

  1. ํ‚ค๋ณด๋“œ
  2. ํ—ค์–ด๋“œ๋ผ์ด๊ธฐ
  3. ํ•ธ๋“œํฐ ์ถฉ์ „๊ธฐ
  4. ๋””์ง€ํ„ธ ์นด๋ฉ”๋ผ ์ถฉ์ „๊ธฐ
  5. ํ‚ค๋ณด๋“œ
  6. ํ—ค์–ด๋“œ๋ผ์ด๊ธฐ

ํ‚ค๋ณด๋“œ, ํ—ค์–ด๋“œ๋ผ์ด๊ธฐ, ํ•ธ๋“œํฐ ์ถฉ์ „๊ธฐ์˜ ํ”Œ๋Ÿฌ๊ทธ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ๋ฉ€ํ‹ฐํƒญ์— ๊ฝ‚์€ ๋‹ค์Œ ๋””์ง€ํ„ธ ์นด๋ฉ”๋ผ ์ถฉ์ „๊ธฐ ํ”Œ๋Ÿฌ๊ทธ๋ฅผ ๊ฝ‚๊ธฐ ์ „์— ํ•ธ๋“œํฐ์ถฉ์ „๊ธฐ ํ”Œ๋Ÿฌ๊ทธ๋ฅผ ๋นผ๋Š” ๊ฒƒ์ด ์ตœ์ ์ผ ๊ฒƒ์ด๋ฏ€๋กœ ํ”Œ๋Ÿฌ๊ทธ๋Š” ํ•œ ๋ฒˆ๋งŒ ๋นผ๋ฉด ๋œ๋‹ค.

๐Ÿ“ฅ์ž…๋ ฅ ์กฐ๊ฑด

  • ์ฒซ ์ค„์—๋Š” ๋ฉ€ํ‹ฐํƒญ ๊ตฌ๋ฉ์˜ ๊ฐœ์ˆ˜ N (1 โ‰ค N โ‰ค 100)๊ณผ ์ „๊ธฐ ์šฉํ’ˆ์˜ ์ด ์‚ฌ์šฉํšŸ์ˆ˜ K (1 โ‰ค K โ‰ค 100)๊ฐ€ ์ •์ˆ˜๋กœ ์ฃผ์–ด์ง„๋‹ค.
  • ๋‘ ๋ฒˆ์งธ ์ค„์—๋Š” ์ „๊ธฐ์šฉํ’ˆ์˜ ์ด๋ฆ„์ด K ์ดํ•˜์˜ ์ž์—ฐ์ˆ˜๋กœ ์‚ฌ์šฉ ์ˆœ์„œ๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค.
  • ๊ฐ ์ค„์˜ ๋ชจ๋“  ์ •์ˆ˜ ์‚ฌ์ด๋Š” ๊ณต๋ฐฑ๋ฌธ์ž๋กœ ๊ตฌ๋ถ„๋˜์–ด ์žˆ๋‹ค.
    2 7
    2 3 2 3 1 2 7

๐Ÿ“ค์ถœ๋ ฅ ์กฐ๊ฑด

  • ํ•˜๋‚˜์”ฉ ํ”Œ๋Ÿฌ๊ทธ๋ฅผ ๋นผ๋Š” ์ตœ์†Œ์˜ ํšŸ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜์‹œ์˜ค.
    2


๋ฌธ์ œ ์ดํ•ด


  • ์ฃผ์–ด์ง„ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋Š” N, ์ „๊ธฐ์šฉํ’ˆ์— ๋ถ™์€ ์ˆซ์ž๋ฅผ ์ž…๋ ฅ๋ฐ›๊ณ  ํ•˜๋‚˜์”ฉ ํ”Œ๋Ÿฌ๊ทธ๋ฅผ ๋นผ๋Š” ์ตœ์†Œ ํšŸ์ˆ˜ ๊ตฌํ•˜๊ธฐ
    • ์ฒ˜์Œ ๋ฐฐ์—ด N์ž๋ฆฌ๊นŒ์ง€๋Š” ๋ชจ๋‘ ์ฑ„์šฐ๊ณ (i=0 ~ N)
    • ๊ทธ ์ฑ„์šด ๋ฐฐ์—ด๊ณผ ๋‹ค์Œ ์ˆซ์ž(i = N ~ K)์˜ ๊ต์ง‘ํ•ฉ์ด ์žˆ๋Š”์ง€ ํ™•์ธ
    • ์—†๋‹ค๋ฉด count ์ฆ๊ฐ€


์•Œ๊ณ ๋ฆฌ์ฆ˜


์‹ค์ œ ํ’€์ด ์‹œ๊ฐ„ : 20๋ถ„

  • ์ž…๋ ฅ
    • ๋ฉ€ํ‹ฐํƒญ ๊ตฌ๋ฉ ๊ฐœ์ˆ˜ N ์ž…๋ ฅ๋ฐ›๊ธฐ
    • ์ „๊ธฐ์šฉํ’ˆ ์ด ์‚ฌ์šฉํšŸ์ˆ˜ K ์ž…๋ ฅ๋ฐ›๊ธฐ
    • ์ „๊ธฐ์šฉํ’ˆ ๋ฒˆํ˜ธ ๋ฐฐ์—ด arr ์ž…๋ ฅ๋ฐ›๊ธฐ
  • ๊ณ„์‚ฐ
    • ์ตœ์†Œ ํšŸ์ˆ˜์ธ count ์„ ์–ธ
    • ๋ฐฐ์—ด์„ ์ €์žฅํ•  ๋ฐฐ์—ด multiTab ์„ ์–ธ
    • ์ฒ˜์Œ ๋ฐฐ์—ด N์ž๋ฆฌ๊นŒ์ง€๋Š” ๋ชจ๋‘ ์ €์žฅ(i=0 ~ N)
      • multiTab[i] = arr[i]++;
    • ๊ทธ ์ฑ„์šด ๋ฐฐ์—ด๊ณผ ๋‹ค์Œ ์ˆซ์ž(i = N ~ K)์˜ ๊ต์ง‘ํ•ฉ์ด ์žˆ๋Š”์ง€ ํ™•์ธ
      • ์—†๋‹ค๋ฉด count++
  • ์ถœ๋ ฅ
    • count ์ถœ๋ ฅ
import java.util.*;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int N = sc.nextInt();
		int K = sc.nextInt();
		
		int[] arr = new int[N];
		for(int i=0; i<N; i++) {
			arr[i] = sc.nextInt();
		}
		
		int count = 0;
		
		int[] multiTab = new int[N+1];
		
		for(int i=0; i<K; i++) {
			multiTab[arr[i]]++;
		}
		
		for (int i=N; i<K; i++) {
		    if (multiTab[arr[i]] != arr[i]) count++;
		}
		System.out.println(count);	
	}

}


์˜ค๋‹ต ์ฒดํฌ


  • ์ถœ๋ ฅ์ด ์ œ๋Œ€๋กœ ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ ๋ฐœ์ƒ
    • [1] arr ๋ฐฐ์—ด์˜ ๋ฒ”์œ„๋ฅผ N โ†’ K๋กœ ๋ณ€๊ฒฝ
    • [2] multiTab ๋ฐฐ์—ด์„ โ†’ HashSet ํ˜•ํƒœ๋กœ ๋ณ€๊ฒฝ
    • [3] ์ฑ„์šด ๋ฐฐ์—ด๊ณผ ๋‹ค์Œ ์ˆซ์ž์˜ ๊ต์ง‘ํ•ฉ์„ ํ™•์ธํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜์ •
      • i=0 ~ K๊นŒ์ง€ ๋ฉ€ํ‹ฐํƒญ ๋ฐฐ์—ด arr์— ๋„ฃ์–ด์ฃผ๊ณ , ๊ทธ arr[i]๊ฐ€ multiTab์— ์žˆ๋‹ค๋ฉด continue๋กœ ๋„˜์–ด๊ฐ€๋„๋ก ์„ค์ •ํ•˜๊ธฐ
      • ๋ฉ€ํ‹ฐํƒญ์ด ๊ฝ‰ ์ฐฌ๋‹ค๋ฉด(๋ฉ€ํ‹ฐํƒญ.size() == N)
        • for(int j : multiTab) { โ†’ ๋ฉ€ํ‹ฐํƒญ ๋ฐฐ์—ด์— ์ €์žฅ๋œ ์ˆ˜๋ฅผ ์ˆœํšŒ
        • ํ˜„์žฌ ๋ฉ€ํ‹ฐํƒญ ๋ฐฐ์—ด์— ์žˆ๋Š” ์ˆซ์ž๊ฐ€ ์ƒˆ๋กœ ์ž…๋ ฅ๋˜๋Š” ์ˆซ์ž์™€ ๋™์ผํ•œ์ง€ ํ™•์ธ
          for (int k = i + 1; k < K; k++) {
                              if (arr[k] == j) {
                                  idx = k;
                                  break;
                              }
        • if (idx == -1) { out = j; break; } โ†’ ๋™์ผํ•œ ์ˆซ์ž๊ฐ€ ์—†๋‹ค๋ฉด ํ˜„์žฌ ์ˆซ์ž๋ฅผ ์ œ๊ฑฐํ•  ์ˆซ์ž๋กœ ๋ณด๊ธฐ(out)
        • if (idx > far) { far = idx; out = j; } โ†’ ๋™์ผํ•œ ์ˆซ์ž๊ฐ€ ์žˆ๋‹ค๋ฉด ๋„˜์–ด๊ฐ€๊ธฐ
        • multiTab.remove(out); multiTab.add(arr[i]); count++; โ†’ ๋นผ์•ผํ•  ์ˆซ์ž๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , ์ƒˆ๋กœ์šด ์ˆซ์ž๋ฅผ ์‚ฝ์ž…
        • ๋‹จ, else { multiTab.add(arr[i]); } โ†’ multiTab ๋ฐฐ์—ด์— ๊ณต๊ฐ„์ด ์žˆ๋‹ค๋ฉด ์ผ๋‹จ ์ฑ„์›Œ์•ผ ํ•จ!!
//before
//[1]
int[] arr = new int[N];
for(int i=0; i<N; i++) {
	arr[i] = sc.nextInt();
}

...
//[2]
int[] multiTab = new int[N+1];

//[3]
for(int i=0; i<K; i++) {
	multiTab[arr[i]]++;
}

for (int i=N; i<K; i++) {
    if (multiTab[arr[i]] != arr[i]) count++;
}
System.out.println(count);
//after
//[1]
int[] arr = new int[K];
for(int i=0; i<K; i++) {
	arr[i] = sc.nextInt();
}

...

//[2]
Set<Integer> multiTab = new HashSet<>();

//[3]
for(int i=0; i<K; i++) {
	//๋ฉ€ํ‹ฐํƒญ์— ์ด๋ฏธ ์žˆ๋‹ค๋ฉด ๋„˜์–ด๊ฐ€๋„๋ก
	if(multiTab.contains(arr[i])) {
		continue;
	}
	
	//๋ฉ€ํ‹ฐํƒญ์ด ๊ฝ‰์ฐฌ๋‹ค๋ฉด
	if(multiTab.size() == N) {
		int far = -1; //๋ฉ€ํ‹ฐํƒญ์—์„œ ๊ฐ€์žฅ ๋จผ ์ „๊ธฐ์šฉํ’ˆ
		int out = -1; //๋ฉ€ํ‹ฐํƒญ์—์„œ ๋บ„ ์ „๊ธฐ์šฉํ’ˆ
		
		//๋ฉ€ํ‹ฐํƒญ์— ์žˆ๋Š” ์ „๊ธฐ์šฉํ’ˆ ์ค‘ ๊ฐ€์žฅ ๋‚˜์ค‘์— ์‚ฌ์šฉํ•  ๊ฒƒ ์ฐพ๊ธฐ
		for(int j : multiTab) {
			int idx = -1;
			for (int k = i + 1; k < K; k++) {
                    if (arr[k] == j) {
                        idx = k;
                        break;
                    }
                }
                if (idx == -1) {
                    out = j;
                    break;
                }
                if (idx > far) {
                    far = idx;
                    out = j;
                } 
            }
						// ์ฐพ์€ ์ „๊ธฐ์šฉํ’ˆ์„ ๋ฉ€ํ‹ฐํƒญ์—์„œ ๋นผ๊ณ  ํ˜„์žฌ ์ „๊ธฐ์šฉํ’ˆ์„ ๊ฝ‚์Œ
            multiTab.remove(out);
            multiTab.add(arr[i]);
            count++;
        } else {
            // ๋ฉ€ํ‹ฐํƒญ์— ๋นˆ ๊ตฌ๋ฉ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ํ˜„์žฌ ์ „๊ธฐ์šฉํ’ˆ์„ ๊ฝ‚์Œ
            multiTab.add(arr[i]);
        }
}
System.out.println(count);


์ตœ์ข… ํ’€์ด


์‹ค์ œ ํ’€์ด ์‹œ๊ฐ„ : 50๋ถ„(์ฒซ ํ’€์ด ์‹œ๊ฐ„ ํฌํ•จ)

  • ์ž…๋ ฅ
    • ๋ฉ€ํ‹ฐํƒญ ๊ตฌ๋ฉ ๊ฐœ์ˆ˜ N ์ž…๋ ฅ๋ฐ›๊ธฐ
    • ์ „๊ธฐ์šฉํ’ˆ ์ด ์‚ฌ์šฉํšŸ์ˆ˜ K ์ž…๋ ฅ๋ฐ›๊ธฐ
    • ์ „๊ธฐ์šฉํ’ˆ ๋ฒˆํ˜ธ ๋ฐฐ์—ด arr ์ž…๋ ฅ๋ฐ›๊ธฐ
  • ๊ณ„์‚ฐ
    • ์ตœ์†Œ ํšŸ์ˆ˜์ธ count ์„ ์–ธ
    • ๋ฐฐ์—ด์„ ์ €์žฅํ•  ๋ฐฐ์—ด multiTab ์„ ์–ธ(Hashset์œผ๋กœ)
    • multiTab ๋ฐฐ์—ด๊ณผ ๋‹ค์Œ ์ˆซ์ž(i = N ~ K)์˜ ๊ต์ง‘ํ•ฉ์ด ์žˆ๋Š”์ง€ ํ™•์ธ
      • i=0 ~ K๊นŒ์ง€ ๋ฉ€ํ‹ฐํƒญ ๋ฐฐ์—ด arr์— ๋„ฃ์–ด์ฃผ๊ณ , ๊ทธ arr[i]๊ฐ€ multiTab์— ์žˆ๋‹ค๋ฉด continue๋กœ ๋„˜์–ด๊ฐ€๋„๋ก ์„ค์ •ํ•˜๊ธฐ
      • ๋ฉ€ํ‹ฐํƒญ์ด ๊ฝ‰ ์ฐฌ๋‹ค๋ฉด(๋ฉ€ํ‹ฐํƒญ.size() == N)
        • for(int j : multiTab) { โ†’ ๋ฉ€ํ‹ฐํƒญ ๋ฐฐ์—ด์— ์ €์žฅ๋œ ์ˆ˜๋ฅผ ์ˆœํšŒ
        • ํ˜„์žฌ ๋ฉ€ํ‹ฐํƒญ ๋ฐฐ์—ด์— ์žˆ๋Š” ์ˆซ์ž๊ฐ€ ์ƒˆ๋กœ ์ž…๋ ฅ๋˜๋Š” ์ˆซ์ž์™€ ๋™์ผํ•œ์ง€ ํ™•์ธ
          for (int k = i + 1; k < K; k++) {
                              if (arr[k] == j) {
                                  idx = k;
                                  break;
                              }
        • if (idx == -1) { out = j; break; } โ†’ ๋™์ผํ•œ ์ˆซ์ž๊ฐ€ ์—†๋‹ค๋ฉด ํ˜„์žฌ ์ˆซ์ž๋ฅผ ์ œ๊ฑฐํ•  ์ˆซ์ž๋กœ ๋ณด๊ธฐ(out)
        • if (idx > far) { far = idx; out = j; } โ†’ ๋™์ผํ•œ ์ˆซ์ž๊ฐ€ ์žˆ๋‹ค๋ฉด ๋„˜์–ด๊ฐ€๊ธฐ
        • multiTab.remove(out); multiTab.add(arr[i]); count++; โ†’ ๋นผ์•ผํ•  ์ˆซ์ž๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , ์ƒˆ๋กœ์šด ์ˆซ์ž๋ฅผ ์‚ฝ์ž…
        • ๋‹จ, else { multiTab.add(arr[i]); } โ†’ multiTab ๋ฐฐ์—ด์— ๊ณต๊ฐ„์ด ์žˆ๋‹ค๋ฉด ์ผ๋‹จ ์ฑ„์›Œ์•ผ ํ•จ!!
  • ์ถœ๋ ฅ
    • count ์ถœ๋ ฅ
import java.util.*;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int N = sc.nextInt();
		int K = sc.nextInt();
		
		int[] arr = new int[K];
		for(int i=0; i<K; i++) {
			arr[i] = sc.nextInt();
		}
		
		int count = 0;
		
		Set<Integer> multiTab = new HashSet<>();
		
		for(int i=0; i<K; i++) {
			//๋ฉ€ํ‹ฐํƒญ์— ์ด๋ฏธ ์žˆ๋‹ค๋ฉด ๋„˜์–ด๊ฐ€๋„๋ก
			if(multiTab.contains(arr[i])) {
				continue;
			}
			
			//๋ฉ€ํ‹ฐํƒญ์ด ๊ฝ‰์ฐฌ๋‹ค๋ฉด
			if(multiTab.size() == N) {
				int far = -1; //๋ฉ€ํ‹ฐํƒญ์—์„œ ๊ฐ€์žฅ ๋จผ ์ „๊ธฐ์šฉํ’ˆ
				int out = -1; //๋ฉ€ํ‹ฐํƒญ์—์„œ ๋บ„ ์ „๊ธฐ์šฉํ’ˆ
				
				//๋ฉ€ํ‹ฐํƒญ์— ์žˆ๋Š” ์ „๊ธฐ์šฉํ’ˆ ์ค‘ ๊ฐ€์žฅ ๋‚˜์ค‘์— ์‚ฌ์šฉํ•  ๊ฒƒ ์ฐพ๊ธฐ
				for(int j : multiTab) {
					int idx = -1;
					for (int k = i + 1; k < K; k++) {
                        if (arr[k] == j) {
                            idx = k;
                            break;
                        }
                    }
                    if (idx == -1) {
                        out = j;
                        break;
                    }
                    if (idx > far) {
                        far = idx;
                        out = j;
                    } 
                }
				// ์ฐพ์€ ์ „๊ธฐ์šฉํ’ˆ์„ ๋ฉ€ํ‹ฐํƒญ์—์„œ ๋นผ๊ณ  ํ˜„์žฌ ์ „๊ธฐ์šฉํ’ˆ์„ ๊ฝ‚์Œ
                multiTab.remove(out);
                multiTab.add(arr[i]);
                count++;
            } else {
                // ๋ฉ€ํ‹ฐํƒญ์— ๋นˆ ๊ตฌ๋ฉ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ํ˜„์žฌ ์ „๊ธฐ์šฉํ’ˆ์„ ๊ฝ‚์Œ
                multiTab.add(arr[i]);
            }
		}
		System.out.println(count);	
	}

}

profile
์–ธ์  ๊ฐ€ ๋‚ด ์ฝ”๋“œ๋กœ ์„ธ์ƒ์— ๊ธฐ์—ฌํ•  ์ˆ˜ ์žˆ๋„๋ก, BE ๊ฐœ๋ฐœ ๊ธฐ๋ก ๋…ธํŠธโ˜˜๏ธ

0๊ฐœ์˜ ๋Œ“๊ธ€