인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

DaBin Han님의 프로필 이미지

작성한 질문수

2주만에 통과하는 알고리즘 코딩테스트 (2024년)

완전탐색 (For반복문)

#1090번 문제 반례가 궁금합니다.

작성

·

58

0

from copy import deepcopy

def init_sort_checker(checkers):
    tmp_list = []
    sorted_sum_list = []
    for idx, chk in enumerate(checkers):
        for i, tgt in enumerate(checkers):
            if idx == i: #본인으로 가는 값은 제외
                continue
            x_val = abs(chk[0] - tgt[0])
            y_val = abs(chk[1] - tgt[1])
            # price, [src, tgt] 순 정렬
            tmp_list.append([x_val + y_val, [idx, i]])
        tmp_list.sort(key=lambda x: x[0]) # price 값 적은 순서대로 정렬
        sorted_sum_list.append(deepcopy(tmp_list))
        tmp_list = []

    return sorted_sum_list


def sort_sum_target(sorted_sum_list, k):
    lowest_price = 1000000*k
    target_idx = -1
    for idx, line in enumerate(sorted_sum_list):
        cnt = 0
        line_price = 0
        for price in line:
            if cnt >= k-1:
                break
            line_price = line_price + price[0]
            cnt += 1
        if line_price < lowest_price:
            lowest_price = line_price
            target_idx = idx
    return target_idx


def k_tgt_process(k, sorted_tgt, sorted_sum_list):
    tgt_line = sorted_sum_list[sorted_tgt]
    tgt_loc = []
    for i in range(k-1):
        tgt_loc.append(tgt_line[i][1])

    return tgt_loc


def k_sorting_process(tgt_loc, checkers):
    tgt_list = []
    for tgt in tgt_loc:
        tgt_list.append(tgt[0])
        tgt_list.append(tgt[1])
    tgt_list = list(set(tgt_list))

    x_list = []
    y_list = []
    tgt_checkers = []
    for tgt in tgt_list:
        x_list.append(checkers[tgt][0])
        y_list.append(checkers[tgt][1])
        tgt_checkers.append(checkers[tgt])
    x_list.sort()
    y_list.sort()

    if len(x_list)%2 == 0: #짝수
        x_chk_point = [int(len(x_list)/2-1),int(len(x_list)/2)]
    else: # 홀수
        x_chk_point = [int(len(x_list)/2)]

    if len(y_list)%2 == 0: #짝수
        y_chk_point = [int(len(y_list)/2-1),int(len(y_list)/2)]
    else: # 홀수
        y_chk_point = [int(len(y_list)/2)]

    #모아볼 위치의 case 집합
    chk_point_list = []
    for x_chk in x_chk_point:
        for y_chk in y_chk_point:
            chk_point_list.append([x_chk,y_chk])

    # 각 checker 위치에서 좌표로 이동하는데 드는 값 계산

    ttl_price_list = []
    for chk in chk_point_list:
        x_tgt = chk[0]
        y_tgt = chk[1]
        price_list = []
        for checker in tgt_checkers:
            x = checker[0]
            y = checker[1]

            if x_list[x_tgt] > x:
                x_price = x_list[x_tgt] - x
            else:
                x_price = x - x_list[x_tgt]

            if y_list[y_tgt] > y:
                y_price = y_list[y_tgt] - y
            else:
                y_price = y - y_list[y_tgt]

            price = x_price + y_price
            price_list.append(price)
        price_list.sort()
        ttl_price_list.append(price_list)

    return ttl_price_list


def TestCases(N):
    checkers = [list(map(int,input().split())) for _ in range(N)]
    sorted_sum_list = init_sort_checker(checkers)
    output_str = '0'

    for k in range(2, N+1):
        min_price = 2000000
        sorted_tgt = sort_sum_target(sorted_sum_list, k)
        tgt_loc = k_tgt_process(k, sorted_tgt, sorted_sum_list)
        ttl_price_list = k_sorting_process(tgt_loc, checkers)

        for n_list in ttl_price_list:
            tmp = 0
            for idx in range(k):
                tmp = tmp + n_list[idx]
            if tmp < min_price:
                min_price = tmp

        output_str = output_str + ' ' + str(min_price)
        tmp_str = list(map(int,output_str.split()))
    # print(output_str)
    print(*tmp_str)
N = int(input())

TestCases(N)

 

다음과 같이 코드 작성해봤는데, sample input에 대한 답은 다 도출되지만문제 제출하면 답이 틀리다 나오네요..반례나 코드상의 오류를 도와주실 수 있을까요?

 

[사용해본 input/output]

4
1 1
2 1
4 1
13 1
0 1 3 14

4
13 13
16 14
15 18
15 30
0 4 8 24

5
3 2
6 9
3 16
14 6
17 14
0 10 17 31 47

5
3 2
6 9
6 13
13 6
17 14
0 4 14 24 40


4
15 14
15 16
14 15
16 15
0 2 3 4

2
4 7
4 7
0 0

4
1 101
2 101
200 101
201 101
0 1 199 398

답변 1

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다.

백준 1090번 문제는 거리의 최소합을 찾는 문제로 여러 경우의 지점을 탐색하는 것이 매우 중요합니다. 문제 제출 시 오답이 나오는 이유는 여러 가지가 있을 수 있습니다. 특히, 경계 조건이나 좌표 설정 및 계산할 때의 실수를 유의해야 합니다. 아래에 몇 가지 확인해보실 방법을 안내드리겠습니다:

  1. 좌표의 균일성: 문제에서 모든 가능성을 탐색하기 위해 특정한 지점만을 고려하고 있습니다. 주어진 코드로는 모든 조합의 지점을 ‘셋팅’하여 검토하는데, 여기에 최적화 부족이 있을 수 있습니다. 동일한 좌표를 대상으로 하는 각 지점의 집합을 충분히 정확하게 구성했는지 확인해 보세요.

  2. 최소값 계산 로직 검토: min_price를 구할 때 모든 경우를 다 고려하지 못하고 있을 수 있습니다. 모든 가능한 후보군을 충분히 검토했는지, 그리고 이들이 최소값을 계산하는 방식이 정확한지 확인하세요.

  3. 중복 좌표 처리: 좌표가 동일한 지점이 있는 경우 올바르게 처리하고 있는지 확인해 보세요. 동일한 점들은 여기서 중복되어 사용되지 않도록 체크하는 것이 중요합니다.

아래의 관련 게시글을 통해 추가적인 접근법과 예제 볼 수 있습니다:

이 게시물을 통해 다른 사용자들도 유사한 문제를 해결하는 과정에서 반례나 작은 실수를 잡아낼 수 있는 팁을 얻으실 수 있습니다. 문제의 기술이나 거리 계산 시 고려할 점 등 여러 아이디어를 참고해 볼 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드립니다.

현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.