백준 1253[좋다]

Ju_Nik_e·2023년 5월 1일
0

baekjoon

목록 보기
9/16


1. 문제분석 및 접근법

  • 수의 위치가 다르면 값이 같아도 다른 수이기 때문에 중복 가능
  • 투 포인터 를 사용하되, 자기 자신은 제외해야 함.
  • 시간 복잡도는 O(n^2)까지 가능
  1. n을 입력 받음
  2. 리스트에 n개의 수를 저장
  3. 정렬
  4. 투 포인터를 처음과 마지막에 배치
  5. 투 포인터 이동 원칙에 맞춰 이동
  6. start, end가 같아지면 안됨
  7. start + end = 리스트[i]면 인정

2. 슈도코드
실패

n 입력 받음
nums 리스트로 입력 받음
nums 정렬
cnt 변수 생성 
good(좋은 수) 변수 초기값 설정


for i -> 0~n만큼 반복:
	find = nums[i]
	start = 0
	end = n-1(인덱스 번호니까)
	while start가 end보다 작으면:
		good = nums[start] + nums[end]
    	if good이 find보다 크면:
        	end -= 1
        elif good이 find보다 작으면:
        	start += 1
        else:(good이랑 find랑 같으면)
        	cnt += 1
            멈춤
print(cnt)
  • 마지막 else에서 good이랑 find가 같을 때에 조건을 추가해야함
  • 본인 자신은 제외해야하기 때문에 start, end가 i가 아닐때만 cnt가 1증가
  • start가 i랑 같으면 start += 1
  • end가 i랑 같으면 end -= 1

3. 코드 구현

import sys
input = sys.stdin.readline

n = int(input())
nums = list(map(int, input().split()))
nums.sort()
cnt = 0
good = 0

for i in range(n):
    find = nums[i]
    start = 0
    end = n-1
    while start != end:
        good = nums[start] + nums[end]
        if good > find:
            end -= 1
        elif good < find:
            start += 1
        else:
            if start != i and end != i:
                cnt += 1
                break
            elif start == i:
                start += 1
            elif end == i:
                end -= 1

print(cnt)

0개의 댓글