์•Œ๊ณ ๋ฆฌ์ฆ˜๐Ÿฅš/๋ฌธ์ œํ’€์ด (Python)

[Programmers] ์ž๋ฌผ์‡ ์™€ ์—ด์‡  (Lv.3) 2024/3/31

๐Ÿช„ํ•˜๋ฃจ๐Ÿช„ 2024. 3. 31. 22:11
728x90
๋ฌธ์ œ ์ œ๋ชฉ ์ •๋‹ต๋ฅ  ๋‚œ์ด๋„
์ž๋ฌผ์‡ ์™€ ์—ด์‡  40% Lv.3
 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

 

๋ฌธ์ œ์š”์•ฝ

์ž๋ฌผ์‡ ์˜ ํ™ˆ๊ณผ ์—ด์‡ ์˜ ๋Œ๊ธฐ ๋ถ€๋ถ„์ด ๋ชจ๋‘ ์ผ์น˜ํ•  ๋•Œ, ์ž๋ฌผ์‡ ๊ฐ€ ์—ด๋ฆฐ๋‹ค.

์กฐ๊ฑด 1) ์—ด์‡ ๋Š” ํšŒ์ „+์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.

์กฐ๊ฑด 2) ์กฐ๊ฑด1 ์ดํ›„ ์—ด์‡ ์˜ ๋Œ๊ธฐ๊ฐ€ ์ž๋ฌผ์‡ ์˜ ๋Œ๊ธฐ์™€ ์ผ์น˜ํ•˜๋ฉด ์•ˆ ๋œ๋‹ค.

 

 

ํ’€์ด

Step1. ์ž๋ฌผ์‡ ์˜ ํ™ˆ๊ณผ ์—ด์‡ ์˜ ๋Œ๊ธฐ์˜ ์œ„์น˜ ์ฐพ๊ธฐ

  • ์ตœ๋Œ€ ์ ๊ณผ ์ตœ์†Œ ์ ์„ ๊ตฌํ•œ ๋’ค ๊ฐœ์ˆ˜๋ฅผ ์„ผ๋‹ค.
  • y์ถ• ์œ„์˜ ์–‘์˜ ์ •์ˆ˜์˜ ์ ์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ผ๋‹ค.(x์ถ• ์œ„์˜ ์–‘์˜ ์ •์ˆ˜์˜ ์ ์˜ ๊ฐœ์ˆ˜๋Š” ์„ธ์ง€ ์•Š๋Š”๋‹ค)

Step2. ์—ด์‡ ๋ฅผ ํšŒ์ „+์ด๋™์‹œํ‚ค๋ฉฐ ์ž๋ฌผ์‡ ์˜ ํ™ˆ๊ณผ ์—ด์‡ ์˜ ๋Œ๊ธฐ๊ฐ€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธ

  • ์ ์–ด๋„ ํ•˜๋‚˜์˜ ์นธ์€ ์ผ์น˜ํ•ด์•ผ ํ•œ๋‹ค. ์ด๋™๋ฒ”์œ„  : #0~lock+key-1
  • ์—ด์‡ ์˜ ๋Œ๊ธฐ์™€ ์ž๋ฌผ์‡ ์˜ ๋Œ๊ธฐ๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ์ผ์น˜ํ•˜๋ฉด ์•ˆ๋œ๋‹ค.
  • ์—ด์‡ ์˜ ๋Œ๊ธฐ์™€ ์ž๋ฌผ์‡ ์˜ ํ™ˆ์ด ๋ชจ๋‘ ์ผ์น˜ํ•ด์•ผ ํ•œ๋‹ค.
  • ์˜ค๋ฅธ์ชฝ 90๋„ ํšŒ์ „์‹œ [x, y] -> [y, len(key)-1-x]

 

โ€ปโ€ป ํ’€์ด๋Š” ๋ชจ๋‘ ๋งž์•˜๋Š”๋ฐ, list๋Š” ์‚ฝ์ž…๋œ ์ˆœ์„œ๋Œ€๋กœ ๋ณด์ „์ด ์•ˆ๋˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค. + heapq์™€ list์™€ ์œ ์‚ฌํ•œ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ์ง€๋‹Œ๋‹ค.

def rotate(key_xy, key_size):
    answer=[]
    for xy in key_xy:
        answer.append([xy[1], key_size-1-xy[0]])
    return answer

def solution(key, lock):
    key_xy=[[row_idx, col_idx] for row_idx in range(len(key)) for col_idx in range(len(key)) if key[row_idx][col_idx]==1]
    lock_xy=[[row_idx, col_idx] for row_idx in range(len(lock)) for col_idx in range(len(lock)) if lock[row_idx][col_idx]==0]
    
    if len(lock_xy)==0:
        return True
    if len(key_xy)<len(lock_xy):
        return False

    for _ in range(0, 4):
        for row_idx in range(-(len(key)-1), len(lock), 1): #0~lock+key-1
            for col_idx in range(-(len(key)-1), len(lock), 1):
                now_lock_xy=lock_xy[:]
                now_key_xy=[]
                for xy in key_xy:
                    if (xy[0]+row_idx)>=0 and (xy[0]+row_idx)<len(lock) and (xy[1]+col_idx)>=0 and (xy[1]+col_idx)<len(lock):
                        now_key_xy.append([xy[0]+row_idx, xy[1]+col_idx])

                now_key_xy.sort()
                now_lock_xy.sort()
                
                while len(now_lock_xy)>0 and len(now_key_xy)>0:
                    key_element=now_key_xy[-1]
                    lock_element=now_lock_xy[-1]
                    if key_element==lock_element:
                        now_key_xy.pop()
                        now_lock_xy.pop()
                    else:
                        break
                if len(now_lock_xy)==0 and len(now_key_xy)==0:
                    print(_, row_idx, col_idx)
                    return True
        key_xy=rotate(key_xy, len(key))
    return False
728x90