골랜디 #8 14921번

Published at: 2025-03-26

Last modified at: 2025-03-26

오늘 푼 문제

안녕하세요 한라나입니다.
Jekyll에서 쓰는 마크다운이란게 정해진 형식이 있죠?
지금 쓰고있는 이 블로그도 마찬가지구요.
그래서 템플릿을 스니펫으로 만들어두면 좋겠다는 생각을 했어요.

VSCode 스니펫은 Variable을 Transform 하는 기능이 있더군요?
근데 그 방법이 regex라는 문법을 쓰는거에요!!!
무슨 외계언어같이생긴걸로 문법을 막 수정하는데 이해가 하나도 안 됩니다.

${TM_FILENAME/(.*)\\..+$/$1/}<-이건 파일이름을 받아와서 .앞부분만 출력하는 코드에요. 이해되나요??

뭐 암튼 30분정도 머리아픈끝에 템플릿을 잘 만들었어요. 이제 블로그 글 쓰기가 한결 편해지겠네요.
오늘의 문제는 아래와 같습니다.

14921

두 포인터(투포인터)라니, 처음에는 이중for문이 생각났는데, 조금 찾아보니 아니더군요.

먼저 커서 두 개를 양 끝에 둡니다. 커서가 있는 두 숫자를 더한 값을 value에 집어넣어요.
만약 ans의 절댓값보다 value의 절댓값이 더 작으면 0에 더 가깝다는 말이니까, ans에 value를 넣습니다.

그리고 value의 극성을 판단해요. (value가 0이면 0에 가장 가까우니까 출력하고 끝냅니다)
양수인데 0에 가까워지려면 숫자가 줄어야겠죠? 배열은 정렬이 이미 되어있으니까, 오른쪽 커서를 왼쪽으로 한칸 옮기면 커서가 있는 숫자 두 개를 더한 숫자가 value보다 줄어듭니다.
음수인데 0에 가까워지려면 숫자가 늘어야겠죠? 이번에는 왼쪽 커서를 오른쪽으로 한칸 옮기면 숫자가 늘어납니다.

옮겼다면 다시 ans와 value를 비교하는 곳으로 돌아가줍니다. 이걸 커서가 만날 때 까지 돌려요.

i = 0;
j = n - 1;
while(i<j) {
    value = numbers[i] + numbers[j];
    if(abs(ans)>abs(value)) ans = value;
    if(value>0) j--;
    else if(value<0) i++;
    else {
        printf("0");
        return 0;
    }
}

이렇게 하면 두 숫자를 더한것 중에 0에 가장 가까운 숫자를 알 수 있어요!
모든 조합을 다 해보면 50억번을 해봐야 하겠지만, 애초에 음수 두개를 더한다거나 하는건 가능성이 좀 없으니까 이런 걸 배제하는 방법인겁니다.

문제보다 VSCode가 더 강적이네요. regex 배우는게 진짜 문제 푸는것보다 오래 걸렸어요.

ac

실버 3이 됐네요.
감사합니다.

streak


전체 코드

#include <stdio.h>

//using namespace std;

int abs(int a) {
    if(a>=0) return a;
    else return (-1) * a;
}

int min(int a, int b) {
    if(a>b) return b;
    else return a;
}

int main() {
    int n;
    scanf("%d", &n);
    int i, j;
    int numbers[100100];
    for(i=0;i<n;i++) scanf("%d", &numbers[i]);
    int ans = 2147483647;
    int value;
    i = 0;
    j = n - 1;
    while(i<j) {
        value = numbers[i] + numbers[j];
        if(abs(ans)>abs(value)) ans = value;
        if(value>0) j--;
        else if(value<0) i++;
        else {
            printf("0");
            return 0;
        }
    }
    printf("%d", ans);
    return 0;
}

Copyright © 2025- HanLana18. Some rights reserved.

Page last modified: 2025-03-26.