[백준] 1059.좋은 구간

jeongjeong2·2023년 6월 26일
0

For coding test

목록 보기
51/59

문제 바로가기

문제 풀이

  1. k값을 정하고, 그 값에 따라 list를 돌면서 l과 r값을 정의한다. S를 미리 sorted했으나 처음부터 k보다 큰 값이 나오면 오류가 생겼다 -> 코드를 짤 때 특수한 경우에만 국한되지 않도록 인덱스를 이용해서 무언갈 하는 것은 좋지 못한 것 같다.
  2. cnt를 두고 이미 max값이 한 번 지정되었을 경우 더이상 변화가 없도록 설정했다. 그러나 idx가 0일 경우 -1로 가장 마지막 값이 l에 할당되면서 오류가 생겼다
  3. min,max로 둔 후 가장 가까운 값을 따로 지정했다.
  4. combination을 이용해서 그 경우를 계산하려 했으나 단순 식으로 구현가능했기에 사용하지 않았다.

정답 코드

from itertools import combinations
N = int(input())
S = sorted(map(int,input().split()))

k = int(input())
l = 0
r = 0
cnt = 0
ans = 0
if N == 1:
    l = 1
    r = S[0]-1
else:
    for idx,i in enumerate(S):
        if k == i:
            ans = -1
            break
        if k<i and cnt == 0:
            if idx == 0:
                r = S[idx]-1
                l = 1
            else:
                r = S[idx]-1
                l = S[idx-1]+1
            cnt += 1 # 한 번만 실행되도록

if ans == -1:
    print(0)
else:
    print(l)
    print((k-l)*(r-k+1) + (r-k))

위 코드에선 N이 1일경우, S[0]가 k보다 클 경우를 모두 고려하지 못했고 이런 특수한 케이스에 대해 하나하나 조건문을 제시하고 있어 효율적인 코드라고 볼 수 없다.

다른 사람 코드 (optional)

N = int(input())
S = sorted(map(int,input().split()))

k = int(input())
min = 0
max = 0
ans = 0
if k in S:
    ans = -1
else:
    for i in S:
        if i < k: # i 가 k보다 작다면
            min = i
        elif i > k and max == 0:
            max = i 
min = min+1
max = max-1
if ans == -1:
    print(0)
else:
    print((k-min)*(max-k+1) + (max-k))

min값과 max값을 경우에 따라 나누어서 따로따로 구하고있다. 나의 경우에는 k보다 i가 커지는 시점에 두 개의 값을 모두 결정했다면 min과 max를 따로 정의해서 충돌이 나지 않고 있다.

0개의 댓글