🧩 Algorithm/SWEA

[SWEA] 1979. 어디에 단어가 λ“€μ–΄κ°ˆ 수 μžˆμ„κΉŒ (Python/D2)

devCloud 2023. 11. 10. 19:28
728x90
 

SW Expert Academy

SW ν”„λ‘œκ·Έλž˜λ° μ—­λŸ‰ 강화에 도움이 λ˜λŠ” λ‹€μ–‘ν•œ ν•™μŠ΅ 컨텐츠λ₯Ό ν™•μΈν•˜μ„Έμš”!

swexpertacademy.com


μ„€λͺ…

NxN ν¬κΈ°μ˜ λ‹¨μ–΄ νΌμ¦μ—μ„œ νŠΉμ • κΈΈμ΄ Kλ₯Ό κ°–λŠ” λ‹¨μ–΄κ°€ λ“€μ–΄κ°ˆ μˆ˜ μžˆλŠ” μžλ¦¬μ˜ μˆ˜λ₯Ό μΆœλ ₯ν•œλ‹€.
κ²€μ€μƒ‰μœΌλ‘œ μΉ ν•΄μ§„ κ³³μ€ λ‹¨μ–΄κ°€ λ“€μ–΄κ°ˆ μˆ˜ μ—†λ‹€. ν°μƒ‰μœΌλ‘œ μΉ ν•΄μ§„ κ³³μ—λ§Œ λ„£μ„ μˆ˜ μžˆλ‹€. κ²€μ€μƒ‰ = 0, ν°μƒ‰ = 1
κ°€λ‘œ ν˜Ήμ€ μ„Έλ‘œλ‘œ λ‹¨μ–΄λ₯Ό λ†“을 μˆ˜ μžˆλ‹€. λ‹¨μ–΄μ˜ κΈΈμ΄μ™€ ν”½μ…€μˆ˜λŠ” κ°™μ•„μ•Ό ν•œλ‹€.

 

풀이

κ°€λ‘œμ™€ μ„Έλ‘œλ₯Ό λ‚˜λˆ μ„œ 풀이

1. NxN 퍼즐을 이쀑 리슀트둜 μž…λ ₯λ°›λŠ”λ‹€.

2. λ¨Όμ € κ°€λ‘œλ₯Ό ν•œ 쀄 μ”© νƒμƒ‰ν•œλ‹€.

  • 탐색 쀑에 픽셀이 1이면, 카운트 값을 μ¦κ°€μ‹œν‚¨λ‹€.
  • 0을 λ§Œλ‚˜λ©΄, 카운트 κ°’κ³Ό 단어 μžλ¦Ώμˆ˜λž‘ λ§žλŠ”μ§€ ν™•μΈν•œλ‹€. 
  • μžλ¦Ώμˆ˜μ™€ 맞으면 κ²°κ³Όκ°’ 증가 ν›„ μΉ΄μš΄νŠΈκ°’ μ΄ˆκΈ°ν™”, λ§žμ§€ μ•ŠμœΌλ©΄ μΉ΄μš΄νŠΈκ°’λ§Œ μ΄ˆκΈ°ν™”ν•œλ‹€. 단어 μžλ¦Ώμˆ˜μ— 맞게 이어져야 ν•˜κΈ° λ•Œλ¬Έμ— μ΄ˆκΈ°ν™”κ°€ ν•„μš”ν•˜λ‹€. 
  • κ°€λ‘œ ν•œ 쀄을 νƒμƒ‰ν•œ 후에, μΉ΄μš΄νŠΈκ°’κ³Ό 단어 μžλ¦Ώμˆ˜λž‘ λ§žλŠ”μ§€ ν™•μΈν•œλ‹€. 5x5 퍼즐과 단어 길이가 3이라고 ν•  λ•Œ, 첫째 쀄이 0 0 1 1 1이라고 ν•΄λ³΄μž. μœ„ 과정을 거치면, 0을 λ§Œλ‚¬μ„ λ•Œ μžλ¦Ώμˆ˜λž‘ λ§žμ§€ μ•ŠμœΌλ―€λ‘œ 카운트 값은 계속 0μ΄μ—ˆλ‹€κ°€, 1을 λ§Œλ‚¬μ„ λ•Œ 카운트 값이 μ¦κ°€ν•œλ‹€. ν•œ 쀄이 λ‹€ 끝났을 μ‹œμ κΉŒμ§€λ„ 카운트 값은 μ¦κ°€ν•œλ‹€. ν•œ 쀄이 λ‹€ λλ‚˜κ³  λ‹€μŒ 쀄 νƒμƒ‰ν•˜κΈ° 전에, 이 ν•œ 쀄을 νŒλ‹¨ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ μ½”λ“œμ΄λ‹€. 

3. μ„Έλ‘œλ₯Ό ν•œ 쀄 μ”© νƒμƒ‰ν•œλ‹€.

  • μœ„μ˜ κ°€λ‘œλ₯Ό 탐색할 λ•Œμ™€ λ˜‘κ°™μ€λ° ν•œ κ°€μ§€ λ‹€λ₯Έ 점은, 인덱슀의 μˆœμ„œμ΄λ‹€. i와 j μœ„μΉ˜λ₯Ό λ°”κΏ”μ€€λ‹€.

4. 탐색이 λͺ¨λ‘ λλ‚¬μœΌλ©΄ 결과값을 좜λ ₯ν•œλ‹€.

 

Solution

t = int(input())

for tc in range(1, t+1):
    n, k = map(int, input().split())
    puzzle = [list(map(int, input().split())) for _ in range(n)]
    ans = 0 #κ²°κ³Όκ°’
    for i in range(n): #κ°€λ‘œ 확인
        cnt = 0
        for j in range(n):
            if puzzle[i][j] == 1: 
                cnt += 1
            else: #0일 λ•Œ, λ§Œμ•½ 7x7 νΌμ¦μ—μ„œ 단어가 3자리일 λ•Œ κ°€λ‘œμ—μ„œ 2κ°€μ§€κ°€ λ‚˜μ˜¬ 수 있기 λ•Œλ¬Έ
                if cnt == k: #μΉ΄μš΄νŠΈκ°’κ³Ό 단어 μžλ¦Ώμˆ˜λž‘ 맞으면
                    ans += 1 #결과값에 1을 λ”ν•˜κ³ 
                    cnt = 0 #μΉ΄μš΄νŠΈκ°’ μ΄ˆκΈ°ν™”
                else: #μΉ΄μš΄νŠΈκ°’κ³Ό 단어 μžλ¦Ώμˆ˜λž‘ λ§žμ§€ μ•ŠμœΌλ©΄
                    cnt = 0 #결과값은 λ¬΄μ‹œν•˜κ³ , μΉ΄μš΄νŠΈκ°’ μ΄ˆκΈ°ν™”
        if cnt == k: 
            ans += 1
            
    for i in range(n): #μ„Έλ‘œ 확인
        cnt = 0
        for j in range(n):
            if puzzle[j][i] == 1: #인덱슀 i, j 주의
                cnt += 1
            else: 
                if cnt == k:
                    ans += 1
                    cnt = 0
                else:
                    cnt = 0
        if cnt == k:
            ans += 1
    print('#'+str(tc), ans)

 

TIL

βœ” list(zip(*a)) : μ „μΉ˜ν–‰λ ¬μ„ μƒμ„±ν•œλ‹€.

# μ „μΉ˜ν–‰λ ¬ 생성
a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
b = list(zip(*a))
b
>>> [(1, 4, 7), (2, 5, 8), (3, 6, 9)]

 

μ „μΉ˜ν–‰λ ¬ μ‚¬μš©

t = int(input())
def calc(puzzle):
    ans = 0
    for i in range(n):
        cnt = 0
        for j in range(n):
            if puzzle[i][j] == 1:
                cnt += 1
            else:  
                if cnt == k:
                    ans += 1 
                    cnt = 0  
                else: 
                    cnt = 0
        if cnt == k:
            ans += 1
    return ans

for tc in range(1, t+1):
    n, k = map(int, input().split())
    puzzle = [list(map(int, input().split())) for _ in range(n)]
    ans = 0
    ans += calc(puzzle) #κ°€λ‘œ
    ans += calc(list(zip(*puzzle))) #μ„Έλ‘œ
    print('#'+str(tc), ans)

 

μ „μΉ˜ν–‰λ ¬μ„ μ‚¬μš©ν–ˆμ„ λ•Œ, 더 κ°„λ‹¨ν•˜κ²Œ ν’€ 수 μžˆλ‹€.


πŸ‘©‍πŸ’» 회고

κ·Έλž˜ν”„ 탐색 μ•Œκ³ λ¦¬μ¦˜μ„ 써야 ν•˜λ‚˜ ν–ˆμ§€λ§Œ ꡳ이 그럴 ν•„μš”λŠ” μ—†λŠ” λ¬Έμ œμ˜€λ‹€. ν˜„μž¬ μœ„μΉ˜μ—μ„œ 주변을 탐색할 ν•„μš”κ°€ μ—†κΈ° λ•Œλ¬Έμ΄λ‹€. 카운트λ₯Ό ν•΄μ£ΌλŠ” 것이 핡심이라고 μƒκ°ν•œλ‹€. 쑰건을 μƒκ°ν•˜λŠλΌκ³  μ‹œκ°„μ„ 였래 썼닀. 

1μ°¨ μ œμΆœμ— μ‹€νŒ¨ν–ˆλŠ”λ° input 파일 쀑 6개만 λ§žμ•˜λ‹€κ³  ν•œλ‹€. μ²˜μŒμ—” κ°€λ‘œ νƒμƒ‰μ˜ else 뢀뢄을 μ΄λ ‡κ²Œ μž‘μ„±ν–ˆλŠ”λ° μžμ„Ένžˆ λ³΄λ‹ˆ j와 iλ₯Ό λ°˜λŒ€λ‘œ μ μ–΄μ„œ ν‹€λ Έλ˜ 것이닀.. λ„ˆλ¬΄ 아쉽닀. κ·Έλž˜λ„ ν‹€λ¦° ν’€μ΄λŠ” μ•„λ‹ˆλΌλŠ” 생각에 μ•ˆμ‹¬μ΄ 됐닀. 심지어 μœ„μ˜ 두 κ°€μ§€ 풀이보닀 이 μ½”λ“œλ‘œ ν–ˆμ„ λ•Œκ°€ 속도와 λ©”λͺ¨λ¦¬ μƒμ—μ„œ 쑰금 더 νš¨μœ¨μ μ΄λ‹€.

elif puzzle[i][j] == 0 and cnt == k: #0을 λ§Œλ‚¬λŠ”λ° μΉ΄μš΄νŠΈκ°’κ³Ό 단어 μžλ¦Ώμˆ˜λž‘ κ°™λ‹€λ©΄
    ans += 1 #κ²°κ³Όκ°’ 증가
    cnt = 0 #μΉ΄μš΄νŠΈκ°’ μ΄ˆκΈ°ν™”
elif puzzle[j][i] == 0: #0을 λ§Œλ‚˜κ³ , μΉ΄μš΄νŠΈκ°’κ³Ό 단어 μžλ¦Ώμˆ˜λž‘ λ§žμ§€ μ•ŠμœΌλ©΄
	cnt = 0 #κ·Έλƒ₯ μΉ΄μš΄νŠΈκ°’λ§Œ μ΄ˆκΈ°ν™”

 

κ·Έλž˜λ„ 더 λ‹€μ–‘ν•œ 방법도 생각할 수 μžˆλŠ” κΈ°νšŒκ°€ μžˆμ—ˆλ‹€! λ‹€λ₯Έ 풀이λ₯Ό λ³΄λ‹ˆ λŒ€μΆ© λ‹€ λΉ„μŠ·ν•˜κ²Œ ν‘Ό 것 κ°™μ•„μ„œ 닀행이닀. 그리고 μ „μΉ˜ν–‰λ ¬μ„ μ‚¬μš©ν•΄μ„œ 반볡적인 μ½”λ“œλ₯Ό λ§Œλ“€μ§€ μ•Šμ•„λ„ λœλ‹€λŠ” 것도 μ•Œκ²Œ 됐닀.

728x90