전체 방문자
오늘
어제
  • 분류 전체보기 (9)
    • NAVER BOOSTCAMP (0)
      • Pre-Course (0)
    • ALGORITHM (8)
    • 데이터 놀이 (1)
    • BOAZ (0)

블로그 메뉴

    최근 댓글

    최근 글

    hELLO · Designed By 정상우.
    BAECHU259
    ALGORITHM

    [Python][BOJ] 백준 2467번 : 용액 / 2470번 : 두 용액

    ALGORITHM

    [Python][BOJ] 백준 2467번 : 용액 / 2470번 : 두 용액

    2023. 1. 12. 14:02

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

     

    2467번: 용액

    첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하의 정수이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 오름차순으로 입력되며, 이 수들은 모두 -

    www.acmicpc.net

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

     

    2470번: 두 용액

    첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상 1,000,00

    www.acmicpc.net

    두 문제는 완전히 같다. 경험치 두 배 이벤트는 항상 설레는 일이다.

     

    접근

    1. 투포인터로 접근할 수 있겠다.

    2. 산성과 알칼리성 용액을 굳이 따로 구분해야 할까?

    2-1. 어차피 합이 0보다 크다면 값을 줄여야하고, 0보다 작다면 값을 키워야한다.

    2-2. 굳이 구분하지 않아도 될 것 같다.

     

    풀이

    1. 투 포인터를 각각 정해줍니다. n개의 용액에서 시작은 0이고, 끝은 n-1 입니다.

    2. 용액을 모두 한 List(arr)에 저장합니다.

    3. 출력할 조합을 담는 List(cmb)를 만들어 줍니다.

    4. 이제 포인터에 해당하는 값을 더해보면서 기존의 조합(cmb)의 합보다 0에 가까운지 확인합니다.

        더 가깝다면 조합(cmb)을 업데이트 해줍니다.

    4-1. 업데이트 여부와 관계없이, 포인터에 해당하는 값을 더한 숫자가 0보다 작다면 stt에 1을 더합니다.

           0에 더 가까워지기 위해서는 값이 커져야 가능성이 있기 때문입니다.

           반대로 업데이트 여부와 관계없이, 포인터에 해당하는 값을 더한 숫자가 0보다 크다면 end에서 1을 빼줍니다.

           0에 더 가까워지기 위해서는 값이 작아져야 가능성이 있기 때문입니다.

     

    stt = 0
    end = int(input())-1
    
    # 투 포인터의 시작과 끝입니다.
    #-------------------------#
    
    arr = sorted(list(map(int,input().split())))
    tgt = 0
    
    # 입력과 동시에 정렬해줍니다.
    # tgt(target)은 찾는 값입니다.
    #-------------------------#
    
    cmb = [arr[0], arr[-1]]
    
    # cmb(combination)은 출력할 답을 담은 리스트입니다.
    #-------------------------#
    
    while stt < end:
        if abs(arr[end] + arr[stt]) < abs(cmb[0] + cmb[1]):
            cmb[0] = arr[stt]
            cmb[1] = arr[end]
        if arr[end] + arr[stt] < 0:
            stt += 1
        else:
            end -= 1
            
    # stt보다 end값이 더 크다면 계속 반복합니다.
    # end는 stt보다 반드시 크거나 같습니다.
    # end 번째의 값과 stt 번째의 값의 절댓값이, 기존 cmb의 절댓값보다 작다면 업데이트 해줍니다.
    # 그리고, 그 연산 결과가 0보다 작다면 stt에 1을 더합니다, 값이 커져야만이 더 0에 가까워질 수 있기 때문입니다.
    # 반대로, 그 연산 결과가 0보다 크다면 end에서 1을 빼줍니다. 값이 작아져야만이 더 0에 가까워질 수 있기 때문입니다.
    #-------------------------#
    
    print(cmb[0], cmb[1])

     

    'ALGORITHM' 카테고리의 다른 글

    [Python][BOJ] 백준 3190번 : 뱀  (0) 2023.02.02
    [Python][Programmers] 프로그래머스 2022 KAKAO BLIND RECRUITMENT 주차요금계산  (0) 2023.01.24
    [Python][BOJ] 백준 9465번 : 스티커  (0) 2023.01.10
    [Python][BOJ] 백준 9205번 : 맥주 마시면서 걸어가기  (0) 2023.01.06
    [Python][BOJ] 백준 2468번 : 안전영역  (0) 2023.01.04
      'ALGORITHM' 카테고리의 다른 글
      • [Python][BOJ] 백준 3190번 : 뱀
      • [Python][Programmers] 프로그래머스 2022 KAKAO BLIND RECRUITMENT 주차요금계산
      • [Python][BOJ] 백준 9465번 : 스티커
      • [Python][BOJ] 백준 9205번 : 맥주 마시면서 걸어가기
      BAECHU259
      BAECHU259

      티스토리툴바

      단축키

      내 블로그

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

      블로그 게시글

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

      모든 영역

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

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