은세고화
뚜렷한 기억보단 흐릿한 잉크를
은세고화
전체 방문자
오늘
어제
  • 분류 전체보기 (95)
    • TDD (2)
      • 학점 산출 프로그램 (2)
    • IT (43)
      • 부스트코스 (18)
      • CS50 (3)
      • 도서추천 알고리즘 (2)
      • 스터디 일정 (3)
      • 스프링 (3)
      • 프로젝트 개발 중 발생한 에러 (8)
      • 웹개발 (3)
      • DB (3)
    • 독서 후기 (12)
      • 도서 (12)
    • e북 (3)
    • 알고리즘 (26)
    • 프로젝트 (6)
      • 향수 (6)
    • 회고 (1)

블로그 메뉴

  • 홈

공지사항

인기 글

티스토리

hELLO · Designed By 정상우.
글쓰기 / 관리자
은세고화

뚜렷한 기억보단 흐릿한 잉크를

알고리즘

백준 2470 자바

2022. 3. 7. 21:03
반응형

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

 

2470번: 두 용액

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

www.acmicpc.net

 

당장 어제만 해도 실버 5문제를 풀지 못해서 심란했는데 정답률 낮은 골드 5문제가 손쉽게 풀리는 것을 보니 코딩 테스트를 준비할 땐 회사의 유형에 맞게 준비해야 함을 느꼈다.

 

 

접근 방식

정렬한 후 투포인터를 사용했다. 맨 왼쪽에는 음수 or 가장 작은 값이고 오른쪽은 양수 or 가장 큰 값이니 두 값을 합쳐보고 0보다 작다면 왼쪽 값을 늘려서 0에 가깝게, 0보다 크다면 오른쪽 값을 줄여서 0에 가깝게 한다.

이렇게 구현하면 양수만 입력받을 때와 음수만 입력받을 때를 각각 구현할 필요 없다

 

 

잘한부분

문제 구현에 크게 어려운 부분은 없었다. 접근도 잘했고 0에 가까운 값을 구할 때 abs를 활용한 부분이 돋보였다.

 

부족한 부분

while문에서 left <= right문으로 설계했다가 틀린 원인을 찾지 못했었다. 이 문제를 계기로 투 포인터에서 <= 와 <의 차이를 좀 더 알게 됐다.

 

package backjon;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {

	static int N, M;
	static int[] arr;
	static int max, resultA, resultB;

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		N = Integer.parseInt(br.readLine());
		
		arr = new int[N];
		StringTokenizer st = new StringTokenizer(br.readLine());
		for (int i = 0; i < N; i++) {
			arr[i] = Integer.parseInt(st.nextToken());
		}

		Arrays.sort(arr);
		max = Integer.MAX_VALUE;
		int left = 0;
		int right = N-1;
		while(left < right) {
			int sum = arr[left] + arr[right];
			if(Math.abs(sum) < Math.abs(max)) { //0에서 가장 가까운 값을 구함
				resultA = arr[left];
				resultB = arr[right];
				max = sum;
				if(sum == 0) break; //없어도 시간에 큰 차이는 없다.
			}
			if(sum > 0) {
				right--;
			}else {
				left++;
			}
		}
		System.out.println(resultA + " " + resultB);
	}
}
반응형
저작자표시 (새창열림)

'알고리즘' 카테고리의 다른 글

백준 2108 자바  (0) 2022.03.08
백준 1436 자바  (0) 2022.03.07
백준 1018 체스판 다시 칠하기  (0) 2022.03.07
백준 2231 자바  (0) 2022.03.05
백준 2636 치즈 자바  (0) 2022.03.05
    '알고리즘' 카테고리의 다른 글
    • 백준 2108 자바
    • 백준 1436 자바
    • 백준 1018 체스판 다시 칠하기
    • 백준 2231 자바
    은세고화
    은세고화

    티스토리툴바