[Baekjoon] 33559/Infinite Array Swaps/Python/ํŒŒ์ด์ฌ

ไบ•ยท2025๋…„ 3์›” 17์ผ
0

๋ฌธ์ œํ’€์ด

๋ชฉ๋ก ๋ณด๊ธฐ
49/56
post-thumbnail

๐Ÿ’ก๋ฌธ์ œ

์ด ๋ฌธ์ œ๋Š” Finite Array Swaps์™€ ๊ตต์€ ๊ธ€์”จ๋กœ ์ ํžŒ ๋ถ€๋ถ„๊ณผ ์ž…์ถœ๋ ฅ๋งŒ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

๋™์šฐ๋Š” ๊ธธ์ด๊ฐ€ NN์ธ ๋‘ ๋ฐฐ์—ด A=[A1,A2,โ‹ฏโ€‰,AN]A=\left[ A_1,A_2,\cdots ,A_N \right]๊ณผ
B=[B1,B2,โ‹ฏโ€‰,BN]B=\left[ B_1,B_2,\cdots ,B_N \right]์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

๋™์šฐ๋Š” ๋‘ ๋ฐฐ์—ด์— ๋‹ค์Œ ๋‘ ์‹œํ–‰์„ ๊ฐ๊ฐ ์›ํ•˜๋Š” ๋งŒํผ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ตํ™˜ํ•˜๋Š” ๋‘ ์›์†Œ์˜ ์ธ๋ฑ์Šค๋Š” ๋‹ฌ๋ผ์•ผ ํ•œ๋‹ค.

  • ๋ฐฐ์—ด AA์—์„œ ๋‘ ์›์†Œ๋ฅผ ๊ณจ๋ผ ๊ตํ™˜ํ•œ๋‹ค.
  • ๋ฐฐ์—ดBB์—์„œ ๋‘ ์›์†Œ๋ฅผ ๊ณจ๋ผ ๊ตํ™˜ํ•œ๋‹ค.

์ด ์—ฐ์‚ฐ์„ ํ†ตํ•ด ์–ป์€ ์ตœ์ข… ์ƒํƒœ์—์„œ์˜ ๋‘ ๋ฐฐ์—ด์„ Aโ€ฒ=[A1โ€ฒ,A2โ€ฒ,โ‹ฏโ€‰,ANโ€ฒ]A^\prime=\left[ A_1^\prime,A_2^\prime,\cdots ,A_N^\prime \right]๊ณผ Bโ€ฒ=[B1โ€ฒ,B2โ€ฒ,โ‹ฏโ€‰,BNโ€ฒ]B^\prime=\left[ B_1^\prime,B_2^\prime,\cdots ,B_N^\prime \right]์ด๋ผ ํ•  ๋•Œ, ๋™์šฐ๋Š” Aiโ€ฒ=Biโ€ฒA_i^\prime=B_i^\prime๋ฅผ ๋งŒ์กฑํ•˜๋Š” ์Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ตœ๋Œ€ํ™”ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ๋‘ ๋ฐฐ์—ด์ด ์ฃผ์–ด์งˆ ๋•Œ, ์ด๋ฅผ ์ตœ๋Œ€๋กœ ํ•˜๋Š” ๊ตํ™˜์„ ์ฐพ์•„๋ณด์ž.

์ž…๋ ฅ

์ฒซ ๋ฒˆ์งธ ์ค„์— ๋‘ ๋ฐฐ์—ด์˜ ๊ธธ์ด N(1โ‰คNโ‰ค105)N(1\le N\le 10^5)์ด ์ฃผ์–ด์ง„๋‹ค.

๋‘ ๋ฒˆ์งธ ์ค„์— ๋ฐฐ์—ด AA์˜ ์›์†Œ A1,A2,โ‹ฏโ€‰,AN(1โ‰คAiโ‰ค109)A_1,A_2,\cdots ,A_N(1\le A_i\le 10^9)์ด ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์ฃผ์–ด์ง„๋‹ค.

์„ธ ๋ฒˆ์งธ ์ค„์— ๋ฐฐ์—ด BB์˜ ์›์†Œ B1,B2,โ‹ฏโ€‰,BN(1โ‰คBiโ‰ค109)B_1,B_2,\cdots ,B_N(1\le B_i\le 10^9)์ด ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์ฃผ์–ด์ง„๋‹ค.

์ฃผ์–ด์ง€๋Š” ์ž…๋ ฅ์€ ๋ชจ๋‘ ์ •์ˆ˜์ด๋‹ค.

์ถœ๋ ฅ

GUN์ด ์“ด ๊ณก์˜ ๊ตฌ๊ฐ„์˜ ์ดˆ๋‹น ๋ฐ•์ž ๋ณ€ํ™”๋Ÿ‰์˜ ํ•ฉ์„ ์ž…๋ ฅ ์ˆœ์„œ๋Œ€๋กœ Q ์ค„์— ๊ฑธ์ณ ์ถœ๋ ฅํ•œ๋‹ค.

์˜ˆ์ œ์ž…๋ ฅ

6
2 4 3 3 2 4
3 1 6 8 2 2

์˜ˆ์ œ์ถœ๋ ฅ

3
4 3 2 4 3 2
1 6 2 8 3 2

๐Ÿ“–๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ Code

import sys
import collections

'''
๊ทธ๋ƒฅ ๊ฐ™์€๊ฑฐ ์ฐพ์œผ๋ฉด ์•ˆ๋จ?
1์ดˆ์— 10**5
๊ทผ๋ฐ for ํ•˜๋‚˜๋กœ ํ•ด์•ผ ํ•˜๋„ค
'''


def find_same_numbers(a,b):
    count_a = collections.Counter(a)
    count_b = collections.Counter(b)

    combinations_number = []
    not_combinations_a = []
    not_combinations_b = []

    for i in set(a+b):
        if i in count_a and i in count_b:
            common = min(ca := count_a[i],cb := count_b[i])
            combinations_number.extend([i] * common)
            if (cnt_a := ca - common) > 0:
                not_combinations_a.extend([i] * cnt_a)
            if (cnt_b := cb - common) > 0:
                not_combinations_b.extend([i] * cnt_b)
        elif i in count_a:
            not_combinations_a.extend([i] * count_a[i])
        else:
            not_combinations_b.extend([i] * count_b[i])
    return combinations_number, not_combinations_a,not_combinations_b


def main():
    inputs = sys.stdin.read().split()
    n = int(inputs[0])
    combinations_number,not_combinations_a,not_combinations_b =(
        find_same_numbers(inputs[1:n+1],inputs[n+1:]))

    sys.stdout.write(str(len(combinations_number))+'\n')
    sys.stdout.write(" ".join(combinations_number + not_combinations_a) + '\n')
    sys.stdout.write(" ".join(combinations_number + not_combinations_b))


if __name__ == '__main__':
    main()

โœ๏ธํ’€์ด๊ณผ์ •

๋ฌธ์ œ๋ฅผ ์ž˜๋ชป ์ฝ์–ด์„œ ์‹œ๊ฐ„์„ ๋งŽ์ด ์†Œ๋น„ํ•œ ๋ฌธ์ œ. ๋‹จ์ˆœ ๊ตฌํ˜„ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋‹ˆ, ์ข…์ด์— ์ˆ˜๋„์ฝ”๋“œ๋ฅผ ์ ์–ด์„œ ์—ฃ์ง€ ์ผ€์ด์Šค๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š”๊ฒŒ ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  sys.stdout.write ์‹ค์ˆ˜๋กœ 2๋ฒˆ ํ‹€๋ ค์„œ ๋ฉ˜ํƒˆ์ด ์•ฝ๊ฐ„ ํ”๋“ค๋ ธ๋‹ค. ์•ž์œผ๋กœ๋Š”, print๋ฅผ ์“ฐ๊ณ  ์ตœ์ ํ™” ํ•  ๋•Œ ๋ณ€๊ฒฝํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

2๋“ฑ. 1๋“ฑ์˜ ๊ฒฝ์šฐ dic.get์„ ์ด์šฉํ•จ. ๋‚˜๋Š” Counter๋ฅผ ์‚ฌ์šฉ. ์ผ€์ด์Šค ์ฐจ์ด๋ผ๊ณ  ์ƒ๊ฐ.


๐Ÿง  ์ฝ”๋“œ ๋ฆฌ๋ทฐ

  1. ํ•จ์ˆ˜ ๋ถ„๋ฆฌ : match_elements ํ•จ์ˆ˜๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ, ๋ฐฐ์—ด์—์„œ ๋งค์นญ ๊ฐ€๋Šฅํ•œ ์›์†Œ์™€ ๋‚จ์€ ์›์†Œ๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ๋กœ์ง์„ ๋ชจ๋“ˆํ™” ํ–ˆ์Šต๋‹ˆ๋‹ค.
  2. ๊ฐ€๋…์„ฑ, ๋ณ€์ˆ˜๋ช…, ์ถœ๋ ฅ ํ˜•์‹, ์ˆœ์„œ ๋ณด์žฅ, ์ž…๋ ฅ ํŒŒ์‹ฑ์„ ์ฃผ์˜ํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ› ๏ธAI ๊ฐœ์„  ์ฝ”๋“œ

import sys
import collections

def match_elements(array_a, array_b):
    """
    ๋‘ ๋ฐฐ์—ด์—์„œ ๊ฐ ์›์†Œ์˜ ๋“ฑ์žฅ ๋นˆ๋„๋ฅผ ๊ณ„์‚ฐํ•œ ํ›„,
    - matched: ๋‘ ๋ฐฐ์—ด ๋ชจ๋‘์—์„œ ๋งค์นญ ๊ฐ€๋Šฅํ•œ ์›์†Œ(์ตœ์†Œ ๋นˆ๋„๋งŒํผ) ๋ฆฌ์ŠคํŠธ
    - remaining_a: array_a์—์„œ ๋งค์นญ ํ›„ ๋‚จ์€ ์›์†Œ ๋ฆฌ์ŠคํŠธ
    - remaining_b: array_b์—์„œ ๋งค์นญ ํ›„ ๋‚จ์€ ์›์†Œ ๋ฆฌ์ŠคํŠธ
    ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    """
    count_a = collections.Counter(array_a)
    count_b = collections.Counter(array_b)

    matched = []       # ๋‘ ๋ฐฐ์—ด์—์„œ ๋งค์นญ๋œ ์›์†Œ๋“ค์„ ์ €์žฅ
    remaining_a = []   # array_a์—๋งŒ ๋‚จ๋Š” ์›์†Œ๋“ค์„ ์ €์žฅ
    remaining_b = []   # array_b์—๋งŒ ๋‚จ๋Š” ์›์†Œ๋“ค์„ ์ €์žฅ

    # ๋‘ ๋ฐฐ์—ด์— ๋“ฑ์žฅํ•˜๋Š” ๋ชจ๋“  ๊ณ ์œ  ์›์†Œ์— ๋Œ€ํ•ด ์ฒ˜๋ฆฌ
    for element in set(array_a + array_b):
        # element๊ฐ€ ๋‘ ๋ฐฐ์—ด ๋ชจ๋‘์— ์žˆ์„ ๊ฒฝ์šฐ
        if element in count_a and element in count_b:
            common = min(count_a[element], count_b[element])
            matched.extend([element] * common)
            # array_a์— ๋‚จ๋Š” ๊ฐœ์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด ์ถ”๊ฐ€
            if (leftover_a := count_a[element] - common) > 0:
                remaining_a.extend([element] * leftover_a)
            # array_b์— ๋‚จ๋Š” ๊ฐœ์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด ์ถ”๊ฐ€
            if (leftover_b := count_b[element] - common) > 0:
                remaining_b.extend([element] * leftover_b)
        # element๊ฐ€ array_a์—๋งŒ ์žˆ์„ ๊ฒฝ์šฐ
        elif element in count_a:
            remaining_a.extend([element] * count_a[element])
        # element๊ฐ€ array_b์—๋งŒ ์žˆ์„ ๊ฒฝ์šฐ
        else:
            remaining_b.extend([element] * count_b[element])
    return matched, remaining_a, remaining_b

def main():
    data = sys.stdin.read().split()
    n = int(data[0])
    # ๋ฐฐ์—ด A์™€ B๋ฅผ ๊ฐ๊ฐ n๊ฐœ์˜ ์›์†Œ๋กœ ๋ถ„๋ฆฌ
    array_a = data[1:n+1]
    array_b = data[n+1:2*n+1]

    matched, leftover_a, leftover_b = match_elements(array_a, array_b)
    # ์ตœ์ข… ๋ฐฐ์—ด์€ ๋งค์นญ๋œ ์›์†Œ๋ฅผ ์•ž๋ถ€๋ถ„์— ๋‘๊ณ  ๋‚˜๋จธ์ง€ ์›์†Œ๋ฅผ ๋’ค์— ์ด์–ด๋ถ™์ž…๋‹ˆ๋‹ค.
    final_array_a = matched + leftover_a
    final_array_b = matched + leftover_b

    sys.stdout.write(str(len(matched)) + '\n')
    sys.stdout.write(" ".join(final_array_a) + '\n')
    sys.stdout.write(" ".join(final_array_b))
    
if __name__ == '__main__':
    main()

๐Ÿ’ป๊ฒฐ๊ณผ

๋ฐฑ์ค€๋ฌธ์ œ ๋ณด๋Ÿฌ๊ฐ€๊ธฐ


๐Ÿ–ฑ๏ธ์ฐธ๊ณ  ๋งํฌ

ํŒŒ์ด์ฌ ์ฐธ๊ณ  ๋”•์…”๋„ˆ๋ฆฌ ์ž๋ฃŒํ˜•

profile
์šฐ๋ฌผ ์•ˆ์—์„œ ๋ฌด์–ธ๊ฐ€ ๋งŒ๋“œ๋Š” ์‚ฌ๋žŒ

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