[백준] 2309번: 일곱 난쟁이

2024. 6. 24. 14:55·코딩테스트/BOJ

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

난이도: 브론즈1

▶ 문제 탐색하기

◇ 원하는 출력 조건:

  1.  7명 키의 합이 100
  2.  이 때 키를 오름차순으로 정렬

Input의 크기가 매우 작으므로 모든 경우의 수를 탐색해야한다.  완전 탐색(Input의 크기가 작을 때 사용)

아이디어: 9명의 난쟁이 중 제외할 2명의 난쟁이를 우선 선택한다. -> 코테에서는 1억 번의 연산이 대략 1초 정도 걸리므로 널널하다.

□ 아이디어

 Way1: 키의 합을 확인 후에 제외하여 7명을 배열에 넣고 다시 정렬

 Way2: 9명의 Input을 받고 먼저 정렬 후에 제외

 

☆ Python은 sort() 함수가 존재하는데 평균적으로 N개의 원소를 정렬할 때, O(NlogN)의 시간복잡도를 갖는다. 

 

▶ 코드 설계하기

  1. 문제의 Input을 받는다.
  2. Input을 받으며 9명 키의 합을 구한다.
  3. 9명 키의 배열을 미리 정렬한다.
  4. 9명 중 2명을 제외하는 모든 경우의 수를 탐색하는 for loop를 구현한다.
  5. 제외된 2명을 빼고 총 합이 100을 만족하는지 확인한다.
  6. 총 합이 100을 만족할 경우 정답을 출력하고 for loop를 탈출한다.

▶ 시도 회차 수정 사항

  • 배열에서 2명을 제외하는 법으로는 remove(), pop() 등을 사용하려 했으나 원소 하나씩 제거되는 메서드 이므로 인덱스 변경에 신경써줘야했다. → 그래서 큰 인덱스의 원소를 지우고, 나머지를 지우는 방식으로 했음.
  • 다른 방안: 'continue' 문을 사용한다. 현재 반복을 건너 뛰고 반복문의 다음 반복으로 넘어가게한다. 
# 제외된 2명의 난쟁이를 빼고 배열을 출력하는 함수
def print_ans(arr, a, b):
    for i in range(9):
        if i == a or i == b:
            continue
        print(arr[i])

▶ 정답

# 2309번: 일곱난쟁이
def find_dif(arr, dif): # 두 개의 숫자 중 합이 dif에 해당하는 숫자를 찾는다.
  # 배열에서 두 개의 숫자의 합이 dif가 되는 것을 찾는건데 sort라고 봐도 될듯.
  found = False
  for i in range(len(arr)):
    for j in range(i+1, len(arr)):
      if arr[i] + arr[j] == dif:
        second = arr.pop(j) # 먼저 큰 인덱스의 원소를 제거
        first = arr.pop(i)
        found = True
        break
    if found:
      break
  if found:
    #print(f"{first}, {second}")
    arr.sort()
    for element in arr:
      print(element)
  else:
    print("none")
        #  arr.remove(arr[i]) Index error가 뜬다. 
        # arr.remove()는 한 번에 하나의 원소만 제거 가능하다.
        # 근데 원소를 제거하는 동안 인덱스가 변경될 수 있

def solution():
  hap = 0 # 로컬변수 초기화/ Unbound local error
  arr = [] # 배열이 루프 밖에 있어야 초기화가 안된다.
  for i in range(9):
    height = int(input())
    arr.append(height)
    hap += height # 로컬변수가 선언되기 전에 사용되었기 때문에 0으로 초기화해줘야한다.
  dif = hap - 100
 # print(arr) # arr = [20, 7, 23, 19, 10, 15,1 25, 8, 13]
 # print(dif) # dif = 40
  find_dif(arr, dif)

solution()

▶ 추가 풀이

import sys
# 제외된 2명의 난쟁이를 빼고 배열을 출력하는 함수
def print_ans(arr, a, b):
    for i in range(9):
        if i == a or i == b:
            continue
        print(arr[i])
        
arr = []
total = 0
for i in range(9):
    arr.append(int(sys.stdin.readline())) 
    total += arr[i]
arr.sort()

found_ans = False
for i in range(0, 9):
    # 정답을 만족했을 경우 for문을 탈출합니다.
    if found_ans:
        break
    for j in range(i + 1, 9):
        now = total - arr[i] - arr[j]
        if now == 100:
            print_ans(arr, i, j)
            found_ans = True
            break

 

arr.append(int(sys.stdin.readline())) 

코테에서 input()의 입력보다 sys.stdin.readline()이 쓰이는 이유??

'코딩테스트 > BOJ' 카테고리의 다른 글

[백준] 2578번: 빙고  (0) 2024.07.01
[백준] 25305번: 커트라인  (0) 2024.06.28
[백준] 5635번: 생일  (0) 2024.06.27
[백준] 1181번: 단어 정렬  (0) 2024.06.26
[백준] 10814번: 나이순 정렬  (0) 2024.06.25
'코딩테스트/BOJ' 카테고리의 다른 글
  • [백준] 25305번: 커트라인
  • [백준] 5635번: 생일
  • [백준] 1181번: 단어 정렬
  • [백준] 10814번: 나이순 정렬
뚱이, not a starfish
뚱이, not a starfish
M.S. Student,. Mainly interested in computer vision and autonomous cars
  • 뚱이, not a starfish
    Wilbur-Babo
    뚱이, not a starfish
  • 전체
    오늘
    어제
    • 분류 전체보기 (194)
      • 통신 및 네트워크 (12)
      • Embedded Projects (2)
      • 3D Reconstruction (1)
        • Gaussian Splatting (0)
        • 3D-GS (1)
        • Multi-view Geometry (0)
        • VSLAM (0)
        • Computer Graphics (0)
      • LLM(VLM) (0)
      • AI-Study (28)
        • Mono-Depth (7)
        • Base (2)
        • Computer Vision (1)
        • Image Processing (3)
        • Tiny Object Detection (3)
      • 자율주행 (20)
        • [2023] 1-fifth AA EV (4)
        • [2022] 1-tenth AA EV (2)
        • ROS 1,2 (4)
        • 이론 (7)
        • 실습 (3)
      • Pointcloud (0)
      • sw (16)
        • 정보보안 (1)
        • Android_develop (3)
      • [학부] 전기전자공학 (12)
        • 반도체 (2)
        • 마이크로프로세서 (6)
      • 코딩테스트 (22)
        • BOJ (21)
      • 취준 (21)
        • EVS37 Ambassador (5)
        • 차량 제어 플랫폼 (5)
        • 영어 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    자율주행작품
    자율주행경진대회
    tar압축풀기
    현대자동차 자율주행 서류 합격 후기
    software defined vehicle
    evs37 sdv
    자율주행
    현대자동차최종불합
    심포지움
    헤네스
    오블완챌린지
    현차떨
    현대자동차최종면접결과
    헤네스유아용자동차
    현대차3월신입후기
    오픽후기
    현대자동차 서류합격후기
    rc카
    자율주행자동차
    현차 자율주행
    evs37sdv
    현차 3월 신입 서류
    현대자동차 자율주행
    자율주행시험
    현차 3월 자율주행
    EVS37
    현대자동차 연구개발
    tar 파일
    우분투터미널
    정렬
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
뚱이, not a starfish
[백준] 2309번: 일곱 난쟁이
상단으로

티스토리툴바