땅지원
땅지원's Personal blog
땅지원
전체 방문자
오늘
어제
  • 전체 (353)
    • Frontend (2)
      • React (2)
    • Backend (90)
      • Java (16)
      • Python (19)
      • Spring (23)
      • Database (21)
      • Troubleshooting (8)
    • DevOps (27)
      • ELK (13)
    • CS (40)
    • OS (2)
      • Linux (2)
    • Algorithm (95)
      • concept (18)
      • Algorithm Problem (77)
    • 인공지능 (25)
      • 인공지능 (12)
      • 연구노트 (13)
    • 수업정리 (35)
      • 임베디드 시스템 (10)
      • 데이터통신 (17)
      • Linux (8)
    • 한국정보통신학회 (5)
      • 학술대회 (4)
      • 논문지 (1)
    • 수상기록 (8)
      • 수상기록 (6)
      • 특허 (2)
    • 삼성 청년 SW 아카데미 (6)
    • 42seoul (12)
    • Toy project (3)
    • 땅's 낙서장 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • 20.11.6 BB21플러스 온라인 학술대회
  • 20.10.30 한국정보통신학회 온라인 학술대회

인기 글

태그

  • ㅗ
  • 이것이 리눅스다 with Rocky Linux9
  • E
  • I
  • D

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
땅지원
Algorithm/Algorithm Problem

백준 1107 리모콘(Brute-Force)

Algorithm/Algorithm Problem

백준 1107 리모콘(Brute-Force)

2022. 5. 4. 19:40

https://www.acmicpc.net/problem/1107

 

1107번: 리모컨

첫째 줄에 수빈이가 이동하려고 하는 채널 N (0 ≤ N ≤ 500,000)이 주어진다.  둘째 줄에는 고장난 버튼의 개수 M (0 ≤ M ≤ 10)이 주어진다. 고장난 버튼이 있는 경우에는 셋째 줄에는 고장난 버튼

www.acmicpc.net

브루트포스

즉, 완전탐색 문제를 만나면 변수의 범위를 확인해서 전체의 경우를 고려해줄 필요가 있다.

문제를 이해하기에는 크게 어렵지 않았다. 

1. 시작 채널이 100번이라고 했으니까 목표 채널 N까지 ++,--만 누르는 abs(100 - N) 경우

2. N을 모두 누를 수 있는 경우

3. N과 가장 가까운 숫자에서 ++,--를 누르는 경우

 

모든 경우를 확인해야 하기 때문에 2,3을 묶어서 생각할 수 있는데

문제에서 N은 최대 500,000이기 때문에 for의 범위를 500,000으로 생각할 수 있지만

N은 정답을 구하는것이고 우리는 어떤 temp의 채널에서 N에 맞춰서 구해야 하기 때문에

정확하게 지금 for문의 범위는 N의 범위가 아닌 temp의 범위를 설정해야한다.

 

가장 많은 경우가 드는 경우는 ++,--만 누르는 것인데

N이 최대 500,000이니까 1,000,000에서 --를 50만번 누르는 경우가 가장 큰 경우다. 

즉 temp는 0 ~ 1,000,000에서 완전 탐색을 진행한다

(가장 최소의 경우를 구하는 것이기 때문에 ++했다가 --를 하는 의미없는 짓은 고려하지 않아야 하기 때문)

N = int(input())
M = int(input())
if M:
    broken = set(input().split())
else:
    broken = set()

ans = abs(100 - N) # ++ or -- 로 이동할 경우 -> 최댓값

# 작은수에서 큰수로 이동할땐 500,000 까지만 보면 되지만
# 반대로 큰수에서 작은수로 내려올수도 있으므로 1,000,000 까지 봐야함
# n이 500,000일 때
# 0에서 ++ 50만번, 1,000,000에서 -- 50만번 누를 수 있는 경우가 있기 때문에
# 1,000,000까지 모두 고려해줘야 한다

for num in range(1000001):
    for temp in str(num):
        if temp in broken: # 해당 숫자가 번호를 눌러서 만들 수 없는 경우엔 스탑
            break
    else: # 번호를 눌러서 만들 수 있는 경우엔
    	# min(기존답, 번호를 누른 횟수 + 해당 번호로부터 타겟까지의 차이)
        #print(num)
        ans = min(ans, len(str(num)) + abs(num - N))

print(ans)

 

'Algorithm > Algorithm Problem' 카테고리의 다른 글

백준 7569 토마토(3차원배열, BFS)  (0) 2022.05.06
백준 5430 AC(Queue)  (0) 2022.05.06
백준 11403 경로찾기(DFS,BFS, Floyd-Warshall)  (0) 2022.05.04
프로그래머스 양궁대회(시뮬레이션, 그리디)  (0) 2022.04.14
프로그래머스 쿼드압축 후 개수 새기(분할 정복)  (0) 2022.04.14
    'Algorithm/Algorithm Problem' 카테고리의 다른 글
    • 백준 7569 토마토(3차원배열, BFS)
    • 백준 5430 AC(Queue)
    • 백준 11403 경로찾기(DFS,BFS, Floyd-Warshall)
    • 프로그래머스 양궁대회(시뮬레이션, 그리디)
    땅지원
    땅지원
    신입 개발자의 우당탕탕 기술 블로그

    티스토리툴바

    단축키

    내 블로그

    내 블로그 - 관리자 홈 전환
    Q
    Q
    새 글 쓰기
    W
    W

    블로그 게시글

    글 수정 (권한 있는 경우)
    E
    E
    댓글 영역으로 이동
    C
    C

    모든 영역

    이 페이지의 URL 복사
    S
    S
    맨 위로 이동
    T
    T
    티스토리 홈 이동
    H
    H
    단축키 안내
    Shift + /
    ⇧ + /

    * 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.