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

 

1015번: 수열 정렬

P[0], P[1], ...., P[N-1]은 0부터 N-1까지(포함)의 수를 한 번씩 포함하고 있는 수열이다. 수열 P를 길이가 N인 배열 A에 적용하면 길이가 N인 배열 B가 된다. 적용하는 방법은 B[P[i]] = A[i]이다. 배열 A가 주

www.acmicpc.net

문제

P[0], P[1], ...., P[N-1]은 0부터 N-1까지(포함)의 수를 한 번씩 포함하고 있는 수열이다. 수열 P를 길이가 N인 배열 A에 적용하면 길이가 N인 배열 B가 된다. 적용하는 방법은 B[P[i]] = A[i]이다.

배열 A가 주어졌을 때, 수열 P를 적용한 결과가 비내림차순이 되는 수열을 찾는 프로그램을 작성하시오. 비내림차순이란, 각각의 원소가 바로 앞에 있는 원소보다 크거나 같을 경우를 말한다. 만약 그러한 수열이 여러개라면 사전순으로 앞서는 것을 출력한다.

입력

첫째 줄에 배열 A의 크기 N이 주어진다. 둘째 줄에는 배열 A의 원소가 0번부터 차례대로 주어진다. N은 50보다 작거나 같은 자연수이고, 배열의 원소는 1,000보다 작거나 같은 자연수이다.

출력

첫째 줄에 비내림차순으로 만드는 수열 P를 출력한다.

예제 입력 1 복사

3
2 3 1

예제 출력 1 복사

1 2 0

 

문제풀이(1)

주어진 수들을 비내림차순 즉 오름차순으로 만드는 수열을 만들면 되는 문제이다.
A배열을 오름차순으로 정렬한 것과 정렬하지 않은 기본의 A배열을 가지고 비교하면된다.

const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
const input = require("fs").readFileSync(filePath).toString().trim().split("\n");

const N = Number(input[0]);
const A = input[1].split(" ").map(Number);
const sortedA = input[1]
  .split(" ")
  .map(Number)
  .sort((a, b) => a - b);

const P = Array(N).fill(-1);

A.forEach((num, idx) => {
  P[idx] = sortedA.findIndex((sortedNum, sortedNumIdx) => {
    if (sortedNum === num && !P.includes(sortedNumIdx)) return true;
  });
});

console.log(P.join(' '));

 

문제풀이(2) - 리팩토링

1. 가속성 향상을 위한 변수명 변경
2. Array.prototype.map 과 Array.prototype.indexOf 를 사용하여 코드를 간결하게 작성

const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
const input = require("fs").readFileSync(filePath).toString().trim().split("\n");

const originalArray = input[1].split(" ").map(Number);
const sortedArray = [...originalArray].sort((a, b) => a - b);

const positionInSortedArray = originalArray.map((num) => {
  const position = sortedArray.indexOf(num);
  sortedArray[position] = null; // 이 위치의 값을 null로 변경하여 더 이상 선택되지 않게 한다.
  return position;
});

console.log(positionInSortedArray.join(' '));

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

 

9656번: 돌 게임 2

상근이가 게임을 이기면 SK를, 창영이가 게임을 이기면 CY을 출력한다.

www.acmicpc.net

문제

돌 게임은 두 명이서 즐기는 재밌는 게임이다.

탁자 위에 돌 N개가 있다. 상근이와 창영이는 턴을 번갈아가면서 돌을 가져가며, 돌은 1개 또는 3개 가져갈 수 있다. 마지막 돌을 가져가는 사람이 게임을 지게 된다.

두 사람이 완벽하게 게임을 했을 때, 이기는 사람을 구하는 프로그램을 작성하시오. 게임은 상근이가 먼저 시작한다.

입력

첫째 줄에 N이 주어진다. (1 ≤ N ≤ 1000)

출력

상근이가 게임을 이기면 SK를, 창영이가 게임을 이기면 CY을 출력한다.

예제 입력 1 복사

4

예제 출력 1 복사

SK

 

문제풀이(1)

실버4에서 문제가 이렇게 간단하게 나온건 처음인것 같다.
2명이 게임을 하고 있을 떄 하나씩 돌을 번갈아 가면서 갖게 되고, 상근이가 이기면 SK, 창영이가 이기면 CY를 출력하면 되는 문제이다.
주어진 수를 2로 나눠서 나머지가 있다면 CY를 없다면 SK를 출력한다.

const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
const N = Number(require("fs").readFileSync(filePath).toString().trim());

if (N % 2) {
  console.log("CY");
} else {
  console.log("SK");
}

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

 

1940번: 주몽

첫째 줄에는 재료의 개수 N(1 ≤ N ≤ 15,000)이 주어진다. 그리고 두 번째 줄에는 갑옷을 만드는데 필요한 수 M(1 ≤ M ≤ 10,000,000) 주어진다. 그리고 마지막으로 셋째 줄에는 N개의 재료들이 가진 고

www.acmicpc.net

문제

주몽은 철기군을 양성하기 위한 프로젝트에 나섰다. 그래서 야철대장을 통해 철기군이 입을 갑옷을 만들게 하였다. 야철대장은 주몽의 명에 따르기 위하여 연구에 착수하던 중 아래와 같은 사실을 발견하게 되었다.

갑옷을 만드는 재료들은 각각 고유한 번호를 가지고 있다. 갑옷은 두 개의 재료로 만드는데 두 재료의 고유한 번호를 합쳐서 M(1 ≤ M ≤ 10,000,000)이 되면 갑옷이 만들어 지게 된다. 야철대장은 자신이 만들고 있는 재료를 가지고 갑옷을 몇 개나 만들 수 있는지 궁금해졌다. 이러한 궁금증을 풀어 주기 위하여 N(1 ≤ N ≤ 15,000) 개의 재료와 M이 주어졌을 때 몇 개의 갑옷을 만들 수 있는지를 구하는 프로그램을 작성하시오.

입력

첫째 줄에는 재료의 개수 N(1 ≤ N ≤ 15,000)이 주어진다. 그리고 두 번째 줄에는 갑옷을 만드는데 필요한 수 M(1 ≤ M ≤ 10,000,000) 주어진다. 그리고 마지막으로 셋째 줄에는 N개의 재료들이 가진 고유한 번호들이 공백을 사이에 두고 주어진다. 고유한 번호는 100,000보다 작거나 같은 자연수이다.

출력

첫째 줄에 갑옷을 만들 수 있는 개수를 출력한다.

예제 입력 1 복사

6
9
2 7 4 1 5 3

예제 출력 1 복사

2

 

문제풀이(1)

주어진 수가 될 수 있도록 2가지의 수를 조합하여 주어진 수가 될 수 있도록 맞추는 문제이다.
오름차순으로 수를 정렬하여 제일 작은 값과 제일 큰 값을 합한 수가 맞는지 확인한다.
더한수가 주어진 수(M)보다 작다면 다음으로 작은수를 찾아서 더하고, 크다면 다음으로 큰 수를 찾아서 더한다.

const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
const [N, M, ...arr] = require("fs").readFileSync(filePath).toString().trim().split("\n");

const numbers = arr[0]
  .split(" ")
  .map(Number)
  .sort((a, b) => a - b);

let answer = 0;

let left = 0;
let right = Number(N) - 1;

while (left < right) {
  const sum = numbers[left] + numbers[right];

  if (sum === Number(M)) answer++;
  sum <= Number(M) ? left++ : right--;
}

console.log(answer);

React native란 무엇인가?

React Native는 Facebook에서 개발하고 관리하는 오픈 소스 모바일 애플리케이션 프레임워크입니다. 이 프레임워크는 웹 개발에 사용되는 JavaScript와 React를 기반으로 하고 있으며, iOS와 Android 모두에서 사용할 수 있는 앱을 만들 수 있습니다.

React native의 장점/특징

React Native는 한 번의 개발로 iOS와 Android 모두에 대응할 수 있는 앱을 만들 수 있습니다. 이는 개발 시간을 줄이고, 유지 보수를 간편하게 합니다.

React Native는 JavaScript를 사용하기 때문에 React를 사용하던 개발자들이라면 진입장벽이 낮습니다.

React native vs Flutter

React Native

React Native는 기존의 React 웹 개발 경험을 바탕으로 배우기 쉽고, 빠르게 개발할 수 있다는 장점이 있습니다. 또한, React Native는 이미 많은 개발자가 사용하고 있기 때문에, 다양한 리소스와 지원을 받을 수 있습니다.

Flutter

Flutter는 Google에서 개발한 오픈 소스 프레임워크로, Dart 언어를 사용하여 iOS 및 Android 애플리케이션을 개발할 수 있습니다. Flutter는 성능이 뛰어나고, 반응성이 좋으며, 다양한 플랫폼에 일관된 사용자 경험을 제공할 수 있다는 장점이 있습니다. 또한, Flutter는 아직 개발 초기 단계이지만, 빠르게 성장하고 있다는 것을 알 수 있습니다.

실제로 채용공고를 보더라도 23년 상반기에는 React Native를 사용하는 곳이 많았지만 하반기로 올 수록 Flutter를 사용하는 기업이 늘어난다는 것을 확인할 수 있었습니다.

차이점

React Native와 Flutter의 주요 차이점은 다음과 같습니다.

언어 JavaScript, React Dart
빌드 방식 JavaScript 코드를 네이티브 코드로 변환 Dart 코드를 네이티브 코드로 변환
성능 뛰어나지 않음 뛰어남
반응성 뛰어나지 않음 뛰어남
플랫폼 호환성 iOS, Android iOS, Android
개발 난이도 낮음 중간
커뮤니티 활발함 활발함

장단점

React Native와 Flutter의 장단점은 다음과 같습니다.

장점 배우기 쉽고, 빠르게 개발할 수 있음, 다양한 리소스와 지원을 받을 수 있음 성능이 뛰어나고, 반응성이 좋으며, 다양한 플랫폼에 일관된 사용자 경험을 제공할 수 있음
단점 성능이 뛰어나지 않고, 반응성이 뛰어나지 않음 개발 난이도가 높음, 커뮤니티가 아직은 크지 않음

React native 생성하기

React Native를 생성할 때는 Expo Go와 React Native CLI 두 가지 방법이 있습니다.

Expo Go

Expo는 React Native를 기반으로 한 오픈 소스 프레임워크 및 개발 환경입니다. Expo를 사용하면 React Native를 더 쉽게 시작하고 관리할 수 있으며, 앱 개발을 더 빠르게 진행할 수 있습니다.

Expo의 주요 장점은 다음과 같습니다.

  • 빠른 시작: Expo는 기본 설정이 다 구성되어 있으며 native 파일을 숨겨놓고 자동으로 관리를 해줍니다. 또한 개발을 쉽게 해주는 많은 편리하고 유용한 특성을 가지고 있습니다.
  • 간편한 개발: Expo는 React Native의 기본적인 기능을 제공하며, 추가적인 설정이나 작업이 필요하지 않습니다. 따라서 React Native의 기본을 배우는 중간 또는 초보 개발자에게 유용합니다.
  • 빠른 배포: Expo는 웹 브라우저를 통해 앱을 실행할 수 있으며, iOS 및 Android에 앱을 쉽게 배포할 수 있습니다.

Expo의 주요 단점은 다음과 같습니다.

  • 자유도가 낮음: Expo는 기본적인 기능만 제공하며, 더 많은 기능을 추가하기 위해서는 Expo SDK를 사용해야 합니다. 따라서 복잡한 기능이나 더 높은 사용자 지정을 필요로 하는 프로젝트에는 적합하지 않을 수 있습니다.
  • 앱 크기가 크다: Expo는 모든 Expo SDK 솔루션으로 빌드되어 앱의 크기가 크다는 단점이 있습니다.

React Native CLI

CLI는 React Native의 기본 빌드 도구입니다. CLI를 사용하면 React Native 앱을 직접 생성하고 관리할 수 있습니다.

CLI의 주요 장점은 다음과 같습니다.

  • 자유도가 높음: CLI는 Expo와 달리 기본적인 기능만 제공하지 않습니다. 따라서 개발자가 원하는 모든 기능을 추가할 수 있습니다.
  • 앱 크기가 작다: CLI는 Expo와 달리 앱의 크기가 작다는 장점이 있습니다.

CLI의 주요 단점은 다음과 같습니다.

  • 배우기 어렵다: CLI는 Expo와 달리 기본 설정이 되어 있지 않습니다. 따라서 React Native의 기본을 이해하고 있어야 합니다.
  • 개발 시간이 오래 걸린다: Expo와 달리 CLI는 기본적인 기능을 제공하지 않기 때문에, 개발자가 직접 추가해야 합니다. 따라서 개발 시간이 오래 걸릴 수 있습니다.

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

 

3986번: 좋은 단어

이번 계절학기에 심리학 개론을 수강 중인 평석이는 오늘 자정까지 보고서를 제출해야 한다. 보고서 작성이 너무 지루했던 평석이는 노트북에 엎드려서 꾸벅꾸벅 졸다가 제출 마감 1시간 전에

www.acmicpc.net

문제

이번 계절학기에 심리학 개론을 수강 중인 평석이는 오늘 자정까지 보고서를 제출해야 한다. 보고서 작성이 너무 지루했던 평석이는 노트북에 엎드려서 꾸벅꾸벅 졸다가 제출 마감 1시간 전에 깨고 말았다. 안타깝게도 자는 동안 키보드가 잘못 눌려서 보고서의 모든 글자가 A와 B로 바뀌어 버렸다! 그래서 평석이는 보고서 작성을 때려치우고 보고서에서 '좋은 단어'나 세보기로 마음 먹었다.

평석이는 단어 위로 아치형 곡선을 그어 같은 글자끼리(A는 A끼리, B는 B끼리) 쌍을 짓기로 하였다. 만약 선끼리 교차하지 않으면서 각 글자를 정확히 한 개의 다른 위치에 있는 같은 글자와 짝 지을수 있다면, 그 단어는 '좋은 단어'이다. 평석이가 '좋은 단어' 개수를 세는 것을 도와주자.

입력

첫째 줄에 단어의 수 N이 주어진다. (1 ≤ N ≤ 100)

다음 N개 줄에는 A와 B로만 이루어진 단어가 한 줄에 하나씩 주어진다. 단어의 길이는 2와 100,000사이이며, 모든 단어 길이의 합은 1,000,000을 넘지 않는다.

출력

첫째 줄에 좋은 단어의 수를 출력한다.

예제 입력 1 복사

3
ABAB
AABB
ABBA

예제 출력 1 복사

2

예제 입력 2 복사

3
AAA
AA
AB

예제 출력 2 복사

1

 

문제풀이(1)

꾸벅꾸벅 졸다가 모든 글자의 A와 B가 바뀌었다면 그냥 ctr+z를 눌르면 될 것 같다는 생각이 들었지만 예시이기 때문에 넘어가기로 했다.
단어 위로 아치형 곡선을 그어 같은 글자끼리 짝을 짓고 선이 겹치지 않는 다는 것이 어떤 말인지 잘 감이 잡히지 않아서 직접 그려보았다.


ABAB -> 곡선을 그었을때 첫번째 B와 두번쨰 A의 곡선이 겹치기 떄문에 좋은 단어가 아니다.
AABB -> 곡선을 그었을때 겹치지 않기 떄문에 좋은 단어이다.
ABBA -> 곡선을 그었을때 겹치지 않기 때문에 좋은 단어이다.
규칙성을 보았을 때, 올바른 괄호와 같은 형식으로 풀면될 것 같다.

const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
const [N, ...arr] = require("fs").readFileSync(filePath).toString().trim().split("\n");

let answer = 0;

arr.forEach((word) => {
  if (word.length % 2 === 0) {
    const stack = [];

    for (let i = 0; i < word.length; i++) {
      if (stack.length === 0) {
        stack.push(word[i]);
        continue;
      }

      if (stack.at(-1) === word[i]) {
        stack.pop();
      } else {
        stack.push(word[i]);
      }
    }

    if (stack.length === 0) {
      answer++;
    }
  }
});

console.log(answer);

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

 

11652번: 카드

준규는 숫자 카드 N장을 가지고 있다. 숫자 카드에는 정수가 하나 적혀있는데, 적혀있는 수는 -262보다 크거나 같고, 262보다 작거나 같다. 준규가 가지고 있는 카드가 주어졌을 때, 가장 많이 가지

www.acmicpc.net

문제

준규는 숫자 카드 N장을 가지고 있다. 숫자 카드에는 정수가 하나 적혀있는데, 적혀있는 수는 -2^62보다 크거나 같고, 2^62보다 작거나 같다.

준규가 가지고 있는 카드가 주어졌을 때, 가장 많이 가지고 있는 정수를 구하는 프로그램을 작성하시오. 만약, 가장 많이 가지고 있는 정수가 여러 가지라면, 작은 것을 출력한다.

입력

첫째 줄에 준규가 가지고 있는 숫자 카드의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개 줄에는 숫자 카드에 적혀있는 정수가 주어진다.

출력

첫째 줄에 준규가 가장 많이 가지고 있는 정수를 출력한다.

예제 입력 1 복사

5
1
2
1
2
1

예제 출력 1 복사

1

예제 입력 2 복사

6
1
2
1
2
1
2

예제 출력 2 복사

1

 

문제풀이(1)

가지고 있는 정수 중에 가장 많이 가지고 있는 정수를 고르되, 가장 많이 가지고 있는 정수가 여러개라면 낮은 수를 출력한다.
Map을 사용하여 카운팅하면서 동시에 가장 큰수와, 가장 큰수의 개수를 비교하여 변경한다.
Number 범위를 초과하기 때문에 BigInt를 사용해야하며 출력시 toString을 사용해야한다.

const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
const [N, ...arr] = require("fs").readFileSync(filePath).toString().trim().split("\n").map(BigInt);

const map = new Map();
let maxNum;
let maxCount = 0;

for (let i = 0; i < N; i++) {
  const num = arr[i];

  map.has(num) ? map.set(num, map.get(num) + 1) : map.set(num, 1);

  if (num === maxNum) {
    maxCount++;
    continue;
  }

  if (map.get(num) > maxCount) {
    maxNum = num;
    maxCount = map.get(num);
  } else if (map.get(num) === maxCount && num < maxNum) {
    maxNum = num;
    maxCount = map.get(num);
  }
}

console.log(maxNum.toString());

 

문제풀이(2) - 리팩토링

1. 코드의 가독성 향상 - 반복적으로 사용되는 값 변수할당, 조건문 간소화

const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
const [N, ...arr] = require("fs").readFileSync(filePath).toString().trim().split("\n").map(BigInt);

const map = new Map();
let maxNum;
let maxCount = 0;

for (let i = 0; i < N; i++) {
  const num = arr[i];
  const currentCount = (map.get(num) || 0) + 1;

  map.set(num, currentCount);

  if (num === maxNum) {
    maxCount++;
  } else if (currentCount > maxCount || (currentCount === maxCount && num < maxNum)) {
    maxNum = num;
    maxCount = currentCount;
  }
}

console.log(maxNum.toString());

 

+ Recent posts