deo2kim
λ§žμ™œν‹€
deo2kim
전체 방문자
였늘
μ–΄μ œ
  • λΆ„λ₯˜ 전체보기
    • CS
      • Algorithm
      • Data Structure
      • Network
      • DB
      • OS
    • Algorithm Problem
      • Python
      • JavaScript
    • Programming language
      • Python
      • JavaScript
    • Tool
      • Jquery
      • React
    • 개발
    • Infra

λΈ”λ‘œκ·Έ 메뉴

  • ν™ˆ
  • νƒœκ·Έ
  • λ°©λͺ…둝

곡지사항

인기 κΈ€

졜근 λŒ“κΈ€

졜근 κΈ€

ν‹°μŠ€ν† λ¦¬

λ°˜μ‘ν˜•
hELLO Β· Designed By μ •μƒμš°.
deo2kim

λ§žμ™œν‹€

[python] λ°±μ€€ - 2240. μžλ‘λ‚˜λ¬΄
Algorithm Problem/Python

[python] λ°±μ€€ - 2240. μžλ‘λ‚˜λ¬΄

2020. 9. 3. 08:57
λ°˜μ‘ν˜•

πŸ€”λ¬Έμ œ ν•΄κ²°

 S1 | λ‹€μ΄λ‚˜λ―Ήν”„λ‘œκ·Έλž˜λ°

 

1.  λ‹΅μ€ Xμ΄ˆμ— Y번 μ›€μ§μ—¬μ„œ 먹은 μ΅œλŒ€μ˜ μžλ‘ 갯수! λ³€μˆ˜κ°€ 2κ°œμ΄λ‹ˆ 2차원 리슀트λ₯Ό λ§Œλ“ λ‹€.
λ‹€λ₯Έ λΆ„λ“€μ˜ 닡을 보면 μžλ‘(μ‚¬λžŒ ν—·κ°ˆλ¦Ό)의 μœ„μΉ˜κΉŒμ§€ μ €μž₯ν•˜μ—¬ 3μ°¨μ›μœΌλ‘œ λ§Œλ“ λ‹€.
ν•˜μ§€λ§Œ 이동 νšŸμˆ˜μ— 따라 μžλ‘(μ‚¬λžŒ)의 μœ„μΉ˜λŠ” μ €μ ˆλ‘œ μ •ν•΄μ§„λ‹€.
ν™€μˆ˜λ²ˆ 움직이면 2번 λ‚˜λ¬΄μ—, 짝수번 움직이면 1번 λ‚˜λ¬΄μ— μžˆλ‹€.

 

2. 행을 초(0~μžλ‘κ°―μˆ˜) 열을 움직일 수 μžˆλŠ” 횟수(0~W) 만큼 2차원 리슀트λ₯Ό λ§Œλ“ λ‹€.

dp의 0번째 행은 0μ΄ˆλ•Œ, 0번째 열은 움직이지 μ•Šμ•˜μ„ λ•Œ

 

3. %μ€‘μš”%

 (1) λ°›μ•„ λ¨ΉλŠ” 쑰건:

  a. iμ΄ˆμ— μžλ‘κ°€ 1λ²ˆμ—μ„œ λ–¨μ–΄μ§€κ³  이동 νšŸμˆ˜κ°€ 짝수(j % 2 == 0, 1번 λ‚˜λ¬΄μ— μœ„μΉ˜)ν•˜λ©΄

  b. iμ΄ˆμ— μžλ‘κ°€ 2λ²ˆμ—μ„œ λ–¨μ–΄μ§€κ³  이동 νšŸμˆ˜κ°€ ν™€μˆ˜(j % 2 == 1, 2번 λ‚˜λ¬΄μ— μœ„μΉ˜)ν•˜λ©΄
 i-1초 λ•Œ j번 μ§Έ μœ„μΉ˜μ˜ μžλ‘ μˆ˜μ™€ i-1초 λ•Œ j-1번 μ§Έ μœ„μΉ˜μ˜ μžλ‘ 수 쀑 큰 값에 + 1ν•˜μ—¬ dp[i][j]λ₯Ό μ±„μš΄λ‹€.

  (2) μ•ˆ λ¨ΉλŠ” 쑰건:

  a. iμ΄ˆμ— μžλ‘μ™€ μžλ‘(μ‚¬λžŒ)이 μ—‡κ°ˆλ¦΄ λ•Œ

 i-1초 λ•Œ j-1, j 번 째의 max값을 λ„£μœΌλ©΄ λœλ‹€.

ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ DP

πŸ’¨ DPλŠ” 점화식을 μ„Έμš°λŠ” 것이 맀우 μ€‘μš”ν•˜λ‹€!

 

πŸ’»μ†ŒμŠ€ μ½”λ“œ

import sys
if __name__ == "__main__":
    T, W = map(int, input().split())
    plums = [0]
    for i in range(T):
        plums.append(int(sys.stdin.readline()))

    dp = [[0]*(W+1) for _ in range(T+1)]

    for i in range(1, T+1):
        # ν•œλ²ˆλ„ 움직이지 μ•Šμ•˜μ„ λ•Œ(dp[i][0]을 μ±„μš°λŠ” κ³Όμ •)
        if plums[i] == 1:  # μžλ‘κ°€ 1λ²ˆμ—μ„œ λ–¨μ–΄μ§ˆ λ•Œλ§Œ λ°›μ•„ 먹을 수 μžˆλ‹€.
            dp[i][0] = dp[i-1][0] + 1  
        else:  
            dp[i][0] = dp[i-1][0]   

        # 이동 횟수λ₯Ό 1λ²ˆλΆ€ν„° W λ²ˆκΉŒμ§€ μ›€μ§μ΄λ©΄μ„œ 체크
        for j in range(1, W+1):
            if j > i:
                break
                
            # μžλ‘κ°€ 1λ²ˆμ—μ„œ λ–¨μ–΄μ§€κ³ , 그것을 λ°›μ•„ λ¨ΉκΈ°
            if plums[i] == 1 and j % 2 == 0:
                # μ›€μ§μ—¬μ„œ 받아먹을 것인가, ν˜„μž¬μœ„μΉ˜μ—μ„œ 받아먹을 것인가
                # μ–΄μ§œν”Ό μ΄λ™ν•œ νšŸμˆ˜λŠ” κ°™λ‹€(μ§€κΈˆ μ΄λ™ν•˜κ±°λ‚˜ 이전에 μ΄λ™ν–ˆκ±°λ‚˜)
                dp[i][j] = max(dp[i-1][j], dp[i-1][j-1]) + 1

            # μžλ‘κ°€ 2λ²ˆμ—μ„œ λ–¨μ–΄μ§€κ³ , 그것을 λ°›μ•„ λ¨ΉκΈ°
            elif plums[i] == 2 and j % 2 == 1:
                dp[i][j] = max(dp[i-1][j], dp[i-1][j-1]) + 1
                
            # κ·Έ μ™Έ - μ•ˆλ¨ΉλŠ”λ‹€ - κ·ΈλŒ€λ‘œ μžˆκ±°λ‚˜ μ›€μ§μ—¬μ„œ μ•ˆλ¨ΉμŒ
            else:
                dp[i][j] = max(dp[i-1][j], dp[i-1][j-1])

    print(max(dp[-1]))


 

πŸ“•λ¬Έμ œ 확인

좜처: BACKJOON ONLINE JUDGE

링크: https://www.acmicpc.net/problem/2240

 

2240번: μžλ‘λ‚˜λ¬΄

μžλ‘λŠ” μžλ‘λ₯Ό μ’‹μ•„ν•œλ‹€. κ·Έλž˜μ„œ 집에 μžλ‘λ‚˜λ¬΄λ₯Ό 심어두고, μ—¬κΈ°μ„œ μ—΄λ¦¬λŠ” μžλ‘λ₯Ό λ¨Ήκ³ λŠ” ν•œλ‹€. ν•˜μ§€λ§Œ μžλ‘λŠ” ν‚€κ°€ μž‘μ•„μ„œ μžλ‘λ₯Ό λ”°λ¨Ήμ§€λŠ” λͺ»ν•˜κ³ , μžλ‘κ°€ λ–¨μ–΄μ§ˆ λ•ŒκΉŒμ§€ κΈ°λ‹€λ¦° λ‹€μŒμ— λ–¨μ–΄

www.acmicpc.net




문제

μžλ‘λŠ” μžλ‘λ₯Ό μ’‹μ•„ν•œλ‹€. κ·Έλž˜μ„œ 집에 μžλ‘λ‚˜λ¬΄λ₯Ό 심어두고, μ—¬κΈ°μ„œ μ—΄λ¦¬λŠ” μžλ‘λ₯Ό λ¨Ήκ³ λŠ” ν•œλ‹€. ν•˜μ§€λ§Œ μžλ‘λŠ” ν‚€κ°€ μž‘μ•„μ„œ μžλ‘λ₯Ό λ”°λ¨Ήμ§€λŠ” λͺ»ν•˜κ³ , μžλ‘κ°€ λ–¨μ–΄μ§ˆ λ•ŒκΉŒμ§€ κΈ°λ‹€λ¦° λ‹€μŒμ— λ–¨μ–΄μ§€λŠ” μžλ‘λ₯Ό λ°›μ•„μ„œ λ¨Ήκ³ λŠ” ν•œλ‹€. μžλ‘λ₯Ό μž‘μ„ λ•Œμ—λŠ” μžλ‘κ°€ ν—ˆκ³΅μ— μžˆμ„ λ•Œ μž‘μ•„μ•Ό ν•˜λŠ”λ°, μ΄λŠ” μžλ‘κ°€ λ§λž‘λ§λž‘ν•˜μ—¬ λ°”λ‹₯에 λ–¨μ–΄μ§€λ©΄ λͺ» 먹을 μ •λ„λ‘œ λ­‰κ°œμ§€κΈ° λ•Œλ¬Έμ΄λ‹€.

λ§€ μ΄ˆλ§ˆλ‹€, 두 개의 λ‚˜λ¬΄ 쀑 ν•˜λ‚˜μ˜ λ‚˜λ¬΄μ—μ„œ μ—΄λ§€κ°€ λ–¨μ–΄μ§€κ²Œ λœλ‹€. λ§Œμ•½ μ—΄λ§€κ°€ λ–¨μ–΄μ§€λŠ” μˆœκ°„, μžλ‘κ°€ κ·Έ λ‚˜λ¬΄μ˜ μ•„λž˜μ— μ„œ 있으면 μžλ‘λŠ” κ·Έ μ—΄λ§€λ₯Ό 받아먹을 수 μžˆλ‹€. 두 개의 λ‚˜λ¬΄λŠ” κ·Έλ‹€μ§€ 멀리 λ–¨μ–΄μ Έ μžˆμ§€ μ•ŠκΈ° λ•Œλ¬Έμ—, μžλ‘λŠ” ν•˜λ‚˜μ˜ λ‚˜λ¬΄ μ•„λž˜μ— μ„œ μžˆλ‹€κ°€ λ‹€λ₯Έ λ‚˜λ¬΄ μ•„λž˜λ‘œ λΉ λ₯΄κ²Œ(1μ΄ˆλ³΄λ‹€ 훨씬 짧은 μ‹œκ°„μ—) 움직일 수 μžˆλ‹€. ν•˜μ§€λ§Œ μžλ‘λŠ” 체λ ₯이 κ·Έλ‹€μ§€ μ’‹μ§€ λͺ»ν•΄μ„œ 많이 움직일 μˆ˜λŠ” μ—†λ‹€.

μžλ‘λŠ” T(1≤T≤1,000)초 λ™μ•ˆ λ–¨μ–΄μ§€κ²Œ λœλ‹€. μžλ‘λŠ” μ΅œλŒ€ W(1≤W≤30)번만 움직이고 μ‹Άμ–΄ ν•œλ‹€. λ§€ μ΄ˆλ§ˆλ‹€ μ–΄λŠ λ‚˜λ¬΄μ—μ„œ μžλ‘κ°€ λ–¨μ–΄μ§ˆμ§€μ— λŒ€ν•œ 정보가 μ£Όμ–΄μ‘Œμ„ λ•Œ, μžλ‘κ°€ 받을 수 μžˆλŠ” μžλ‘μ˜ 개수λ₯Ό κ΅¬ν•΄λ‚΄λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€. μžλ‘λŠ” 1번 μžλ‘λ‚˜λ¬΄ μ•„λž˜μ— μœ„μΉ˜ν•΄ μžˆλ‹€κ³  ν•œλ‹€.

μž…λ ₯

첫째 쀄에 두 μ •μˆ˜ T, Wκ°€ μ£Όμ–΄μ§„λ‹€. λ‹€μŒ T개의 μ€„μ—λŠ” 각 μˆœκ°„μ— μžλ‘κ°€ λ–¨μ–΄μ§€λŠ” λ‚˜λ¬΄μ˜ λ²ˆν˜Έκ°€ 1 λ˜λŠ” 2둜 μ£Όμ–΄μ§„λ‹€.

좜λ ₯

첫째 쀄에 μžλ‘κ°€ 받을 수 μžˆλŠ” μžλ‘μ˜ μ΅œλŒ€ 개수λ₯Ό 좜λ ₯ν•œλ‹€.

λ°˜μ‘ν˜•
μ €μž‘μžν‘œμ‹œ λΉ„μ˜λ¦¬ λ³€κ²½κΈˆμ§€

'Algorithm Problem > Python' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[python] λ°±μ€€ - 11052. μΉ΄λ“œ κ΅¬λ§€ν•˜κΈ° / 16194. μΉ΄λ“œ κ΅¬λ§€ν•˜κΈ° 2  (0) 2020.09.05
[python] λ°±μ€€ - 1722. μˆœμ—΄μ˜ μˆœμ„œ  (0) 2020.09.04
[python] λ°±μ€€ - 9084. 동전  (0) 2020.09.02
[python] ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ - 블둝 μ΄λ™ν•˜κΈ°(2020 KAKAO BLIND RECRUITMENT)  (0) 2020.09.01
[python] ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ - 가사 검색(2020 KAKAO BLIND RECRUITMENT)  (0) 2020.08.31
    'Algorithm Problem/Python' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
    • [python] λ°±μ€€ - 11052. μΉ΄λ“œ κ΅¬λ§€ν•˜κΈ° / 16194. μΉ΄λ“œ κ΅¬λ§€ν•˜κΈ° 2
    • [python] λ°±μ€€ - 1722. μˆœμ—΄μ˜ μˆœμ„œ
    • [python] λ°±μ€€ - 9084. 동전
    • [python] ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ - 블둝 μ΄λ™ν•˜κΈ°(2020 KAKAO BLIND RECRUITMENT)
    deo2kim
    deo2kim
    μ½”λ”© κΈ°λ‘ν•˜κΈ°

    ν‹°μŠ€ν† λ¦¬νˆ΄λ°”