728x90

문제


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

 

1253번: 좋다

첫째 줄에는 수의 개수 N(1 ≤ N ≤ 2,000), 두 번째 줄에는 i번째 수를 나타내는 Ai가 N개 주어진다. (|Ai| ≤ 1,000,000,000, Ai는 정수)

www.acmicpc.net

 

코드


//골드4 좋다
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\r\n");

//투포인터
function twoPointer(arr, num) {
  let start = 0; //배열의 시작 index
  let end = arr.length - 1; //배열의 끝 index

  //arr에서 서로다른 두 수를 더하는 것이니 두 수가 만나면안됨
  while (start < end) {
    let sum = arr[start] + arr[end]; //두 수의 합이
    if (sum === num) return 1; //num과 같다면 바로 return 1을 하여 정답 +1
    if (sum < num) start++;
    //num보다 작다면 수를 늘려줘야 하기 때문에 start++
    else end--; //아니면 수를 줄여줘야 하기 때문에 end--
  }
  return -1; //결국 num과 같지 않다면 return -1
}

let good = 0; //정답이 될 변수
//입력 배열들을 number화하여 오름차순 정렬
let numbers = input[1]
  .split(" ")
  .map((i) => parseInt(i))
  .sort((a, b) => a - b);

for (let i = 0; i < numbers.length; i++) {
  //배열의 각 요소에 대해
  let num = numbers[i]; //한 요소씩 뽑아서
  let newNumbers = numbers.slice(0, i).concat(numbers.slice(i + 1)); //기존 배열 numbers에서 뽑은 요소(num)을 기준으로 앞 뒤 배열을 잘라서 붙이기 => num만 없는 새로운 배열이 완성됨
  if (twoPointer(newNumbers, num) === 1) good++;
  else continue;
}
console.log(good);

 

후기


  • 처음엔 이분탐색으로 푸는 문제인가 했지만 투포인터 알고리즘을 이용하여 푸는 문제였다
  • 이분탐색은 start, middle, end 값을 이용하여 범위를 절반으로 줄여나가며 search하는 탐색으로 시간복잡도가 O(longN)이라는 특징이 있다
  • 반면 투포인터탐색은 start, end값을 이용하여(두 개의 포인터를 찍는다는 의미로 투포인터이다) 조건에 따라 start++, end--를 통해 값을 줄여나가며 중간에서 만나게 되는 특징이 있다
  • 상황에 따라 둘 중에 한 알고리즘을 쓰면 되고, 이 문제의 경우에는 투포인터를 써야하는 문제였지만 투포인터는 최악의 경우에는 시간복잡도가 O(N)이 걸린다는 단점이 있다
  • 그리고 num이 없는 새로운 배열(newNumbers)을 만들어낼 때 filter도 사용해보고, splice도 사용해보았으나 둘 다 이 문제를 해결하기에는 구현이 잘 안됐다. filter를 적용하니 numbers에 같은 수가 여러 개 있을 때 적용이 안됐고, splice는 원본 배열을 바꿔주는 특징 때문에 적용이 안됐다. 그래서 원본 배열을 바꿔주지도 않으면서 배열을 자를 수 있는 slice 함수를 통해, num 수를 기준으로 배열을 잘랐고, 앞 뒤로 잘린 배열들은 concat() 함수로 붙여줬다
  • 비록 이 문제를 푸는데 여러 실패와 시간초과도 겪었지만 이 문제를 통해 여러 문법들과 알고리즘에대해 깊게 알 수 있었다
728x90

문제


https://programmers.co.kr/learn/courses/30/lessons/12939

 

코딩테스트 연습 - 최댓값과 최솟값

문자열 s에는 공백으로 구분된 숫자들이 저장되어 있습니다. str에 나타나는 숫자 중 최소값과 최대값을 찾아 이를 "(최소값) (최대값)"형태의 문자열을 반환하는 함수, solution을 완성하세요. 예를

programmers.co.kr

 

코드


function solution(s) {
  s = s.split(" ").map((i) => parseInt(i));
  return `${Math.min(...s)} ${Math.max(...s)}`;
}

 

후기


  • 새롭게 알게 된 점은 Math.min(), Math.max() 함수가 number형뿐만아니라 string형에서도 쓸 수 있다는 것이었다. 그래서 나처럼 parseInt()로 바꿔주는 과정이 필요없는 과정이다
728x90

문제


https://programmers.co.kr/learn/courses/30/lessons/12919

 

코딩테스트 연습 - 서울에서 김서방 찾기

String형 배열 seoul의 element중 "Kim"의 위치 x를 찾아, "김서방은 x에 있다"는 String을 반환하는 함수, solution을 완성하세요. seoul에 "Kim"은 오직 한 번만 나타나며 잘못된 값이 입력되는 경우는 없습니

programmers.co.kr

 

코드


function solution(seoul) {
    return `김서방은 ${seoul.indexOf("Kim")}에 있다`
}
728x90

문제


https://programmers.co.kr/learn/courses/30/lessons/12932

 

코딩테스트 연습 - 자연수 뒤집어 배열로 만들기

자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다. 제한 조건 n은 10,000,000,000이하인 자연수입니다. 입출력 예 n return 12345

programmers.co.kr

 

코드


function solution(n) {
    n = String(n); //number형 n을 문자열로 바꾸기
    n = n.split("").reverse().map(i => parseInt(i)); //문자열을 뒤집고 각 자리수를 다시 number형으로
    return n;
}

+ Recent posts