Po_tta_tt0
콩심콩 팥심팥 🌱
Po_tta_tt0
전체 방문자
오늘
어제
  • 분류 전체보기 (266)
    • 🐛 회고 (14)
    • 💭 생각 (2)
    • 🤸‍♀️ 내 프로젝트 (16)
      • FISH-NEWS (8)
      • MBTI 과몰입 테스트 (2)
      • twitter clonecoding with TS (4)
      • pilzagenda (2)
    • 👨‍👩‍👧‍👦 팀 프로젝트 (2)
      • 피우다 프로젝트 (0)
      • SEMO(세상의 모든 모임) (1)
      • 마음을 전하는 텃밭 (1)
      • Stackticon (0)
    • 👨‍💻 CS지식 (11)
    • ✍ 공부 (94)
      • JavaScript (21)
      • TypeScript (39)
      • Html (0)
      • CSS (2)
      • React (18)
      • NextJS (7)
      • Vue (1)
      • Python (1)
      • Django (0)
      • 개발환경 & 그 외 (2)
    • 🏄‍♀️ 코딩테스트 (99)
      • 🐍 Python (99)
    • 🐙 Git & GitHub (3)
    • 📑 오류기록 (8)
    • 📚 우리를 위한 기록 (9)
    • 수업 (3)
    • 강의 등 (2)
    • 👩‍🎓 SSAFY (0)
    • 👋 우테코 (0)

블로그 메뉴

  • 홈
  • 태그

공지사항

인기 글

태그

  • React
  • 구현
  • 파이썬
  • Next.js
  • 백준 파이썬
  • BFS + DP
  • dfs
  • 파이썬 다익스트라
  • react-router-dom
  • 문자열
  • DP
  • 파이썬 감시 피하기
  • 백준
  • bfs
  • 이분탐색
  • 백준 숨바꼭질
  • 자바스크립트
  • 플로이드 워셜
  • 시뮬레이션
  • js

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Po_tta_tt0

콩심콩 팥심팥 🌱

🏄‍♀️ 코딩테스트/🐍 Python

[ 백준 18353 해설 ] ( python ) 병사 배치하기

2022. 12. 1. 15:24
반응형

 

📚 병사 배치하기

 
 

문제

N명의 병사가 무작위로 나열되어 있다. 각 병사는 특정한 값의 전투력을 보유하고 있으며, 병사를 배치할 때는 전투력이 높은 병사가 앞쪽에 오도록 내림차순으로 배치를 하고자 한다. 다시 말해 앞쪽에 있는 병사의 전투력이 항상 뒤쪽에 있는 병사보다 높아야 한다.

또한 배치 과정에서는 특정한 위치에 있는 병사를 열외시키는 방법을 이용한다. 그러면서도 남아있는 병사의 수가 최대가 되도록 하고 싶다.

예를 들어, N=7일 때 나열된 병사들의 전투력이 다음과 같다고 가정하자.

이 때 3번 병사와 6번 병사를 열외시키면, 다음과 같이 남아있는 병사의 수가 내림차순의 형태가 되며 5명이 된다. 이는 남아있는 병사의 수가 최대가 되도록 하는 방법이다.

병사에 대한 정보가 주어졌을 때, 남아있는 병사의 수가 최대가 되도록 하기 위해서 열외해야 하는 병사의 수를 출력하는 프로그램을 작성하시오.

 

입력

 

첫째 줄에 N이 주어진다. (1 ≤ N ≤ 2,000) 둘째 줄에 각 병사의 전투력이 공백을 기준으로 구분되어 차례대로 주어진다. 각 병사의 전투력은 10,000,000보다 작거나 같은 자연수이다.

출력

 

첫째 줄에 남아있는 병사의 수가 최대가 되도록 하기 위해서 열외해야 하는 병사의 수를 출력한다.

 

 

예제 입력 1 복사

7
15 11 4 8 5 2 4

예제 출력 1 복사

2

 

 

 

✍ 접근

  • dp를 이용해서.. 시간이 지날 때마다 남는곳을 간다/안간다로 표기해서... 구해줄까!?!?를 생각했지만
  • (1 ≤ N ≤ 100,000, 1 ≤ M ≤ 1,000,000,000)
  • 이걸보고 포기
  • 이분탐색으로 풀어야 하는 문제다.

 

 

 

 

 

정답코드 

# ✨ 입력
import sys
input = sys.stdin.readline

N = int(input())
arr = list(map(int,input().split()))

# ✨ dp를 이용해 저장
dp = [1] * N

# ✨ dp 갱신
for i in range(N):
    for j in range(i):
        if arr[i] < arr[j]:
            dp[i] = max(dp[i], dp[j]+1)

print(N- max(dp))

해설

입력

  • 문제에서 나온 값을 입력받는다

dp

  • 병사 배열을 돌면서 i
  • 0부터 i까지 배열을 한번 더 돌아준다 j
  • 만약 현재 병사배열[i]보다 병사배열[j]값이 더 크다면 배열이 가지고 있는 dp값과 비교해서 더 큰 값으로 갱신해준다
  • dp에 저장된 값 = 최대로 만들 수 있는 병사의 값
  • 이기 때문에 전체 병사 중 최대로 만들 수 있는 병사 수를 빼면 제외된 병사의 최소값이 나온다

 

 

 

⭐ 배움

  • 9월 7일을 마지막으로 단 한번도 알고리즘을 보지 않았던게 너무 크다..
  • 열심히 재활해야지..
  • 와자자잣!!!!
반응형
저작자표시

'🏄‍♀️ 코딩테스트 > 🐍 Python' 카테고리의 다른 글

[ 프로그래머스 해설 ] ( python ) H-Index  (0) 2023.01.12
[ 프로그래머스 해설 ] ( python ) 모의고사  (0) 2022.12.21
[ 백준 3079 해설 ] ( python ) 입국심사  (0) 2022.09.07
[ 백준 20437 해설 ] ( python ) 문자열 게임 2  (0) 2022.09.07
[ 백준 2533 해설 ] ( python ) 트리와 쿼리  (0) 2022.09.06
    '🏄‍♀️ 코딩테스트/🐍 Python' 카테고리의 다른 글
    • [ 프로그래머스 해설 ] ( python ) H-Index
    • [ 프로그래머스 해설 ] ( python ) 모의고사
    • [ 백준 3079 해설 ] ( python ) 입국심사
    • [ 백준 20437 해설 ] ( python ) 문자열 게임 2
    Po_tta_tt0
    Po_tta_tt0
    감자의 코딩하는 블로그 콩심은데 콩나고 팥심은데 팥난다

    티스토리툴바