Укрзалізниця готова відновити повноцінне сполучення Україною: назвали умову

2020년 7월 10일, Gazata.ua

 

https://gazeta.ua/articles/life/_ukrzaliznicya-gotova-vidnoviti-povnocinne-spoluchennya-ukrayinoyu-nazvali-umovu/973910

 

1. Якщо епідемічна ситуація в Україні покращиться, то Укрзалізниця планує в серпні повноцінно відновити залізничне сполучення.

우크라이나는 코로나 19(전염병) 상황이 호전되면, 우크라이나 국영철도는 8월에 철도 운행을 완전히 정상화할 계획입니다.

 

епідемічний : epidemic 유행성, 전염성

покращитися : improve  개선되다, 나아지다

(покращуватися недок)

повноцінно: fully 완전히, 충분히

відновити: restore 회복하다, 복원하다

(відновлювати: юю, юєш, відновляти: яю, яєш недок)

сполучення: connection

 

2. Зараз вже відновили третину поїздів далекого сполучення та приміського, повідомив в. о. голови правління АТ "Укрзалізниця" Іван Юрик.

우크라이나 국영철도 이사장인 이반 유릭은 현재 장거리 및 교외 열차의 3분의 1이 복구되었다고 말했습니다.

 

приміський : suburban 교외의

правління: board 이사회

 

3. "Наразі в Україні карантин продовжено до 31 липня. Сподіваємося, що в серпні кількість захворювань на коронавірус піде на спад і ми зможемо повноцінно відновити залізничне сполучення з усіма регіонами вже в серпні", - сказав Юрик.

"현재 우크라이나의 격리(사회적 거리두기) 기간이 7월 31일까지 연장되어 있습니다. 8월에는 코로나 바이러스 질환이 감소하고 8월에는 모든 지역 철도망이 완전히 복원될 수 있기를 바랍니다."고 유릭이 말했습니다.

 

захворювання: disease

іти на спад : begin to decrease in volume, quantitatively

 

4. За його словами, зараз до станції Львів курсує 17 поїздів далеко сполучення та 10 приміських.

그에 따르면 현재 Lviv역까지 장거리 열차 17대와 교외 열차 10대가 운행되고 있습니다.

 

курсувати : run 운행하다 недок

 

5. "Поки до Львова діють обмеження щодо кількості розміщення пасажирів у вагонах. Це 2 пасажири в купе та СВ, у плацкартних — у шаховому порядку. Але навіть із цими обмеженнями населеність поїздів складає близько 90%. У разі збільшення попиту ми будемо збільшувати кількість поїздів", - сказав очільник Укрзалізниці.

"현재까지도 Lviv로 오는 열차에는  한 칸 당 승객 수 제한이 있습니다. 서로 마주보지 않도록(체크 무늬로) 한 객실에서 승객 2명이  예매하고 있습니다. 그러나 이러한 제한에도 불구하고, 기차 혼잡도는 약 90%입니다. 수요가 증가한다면, 우리는 열차의 수를 늘릴 것입니다.-." 라고 우크라이나 국영철도 대표가 말했습니다.

 

обмеження : resctriction, limitation

розміщення : accomodation 수용

плацкартний : reserved 예약된, 지정된

шаховий : chess 체스의

порядок : order, pattern

населеність : population

У разі : in case of 만일 ~ 한다면

 збільшення попиту: increased demand 수요 증가

збільшувати (збільшити док) : increase

 

6. Для посадки в поїзд пасажири обов`язково повинні вдягти захисну маску, а також пройти температурний скринінг при вході на вокзал та при посадці до вагона. З огляду на заходи безпеки пасажирам рекомендовано якнайменше пересуватися по вагонах. Тимчасово у поїздах не пропонуватимуться напої та кондитерські вироби.

열차에 탑승하려면 반드시 보호 마스크를 착용하고 역 입구에서 그리고 승차 시에 체온 검사를 받아야 합니다. 안전 조치 때문에, 승객들은 가능한  열차 칸에서 이동하지 않는 것이 좋습니다.  음료와 과자류는 일시적으로 제공하지 않을 것입니다.

 

посадка : landing , boarding 착륙, 탑승

захисна маска : protective mask

пройти : undergo 검사를 받다

скринінг : screening (질병, 결격사유를 밝히기 위한) 검사, 심사

З огляду на : ~을 고려해 볼 때

захід : west, measure 서, 서쪽, 조치

якнайменше : at least 적어도, 최소한

пересуватися (пересовуватися недокпересунутися, нуся, нешся док) : get around, move 돌아다니다, 이동하다

тимчасово : temporarily

пропонуватися : to be offered

пропонувати : offer, propose

кондитерські вироби : confectionery 과자류, 단 음식

Type annotations

타입스크립트에서 매개변수와 반환값이 어떤 type인지 설정하는 코드입니다.

Type inference

타입스크립트는 함수의 반환값 타입을 확인합니다.

Function

const add = (num1: number, num2: number): number => {
  return num1 + num2;
};

const subtract = (num1: number, num2: number): number => {
  return num1 - num2;
};

function divide(num1: number, num2: number): number {
  return num1 / num2;
}

function multiple(num1: number, num2: number): number {
  return num1 * num2;
}

const logger = (message: string): void => {
  console.log(message);
};

const throwError = (message: string): void => {
  if (message) throw new Error(message);
};
/*
const throwError = (message: string): never => {
  throw new Error(message);
};
 */

const todayForecast = {
  date: new Date(),
  weather: 'sunny',
};

const logWeather = ({
  date,
  weather,
}: {
  date: Date;
  weather: string;
}): void => {
  console.log(date, weather);
};

logWeather(todayForecast);

Object

const profile = {
  name: 'jinsu',
  age: 26,
  coords: {
    lat: 0,
    lng: 15,
  },
  setAge(age: number): void {
    this.age = age;
  },
};

const { age, name }: { age: number; name: string } = profile;
// const { age }: number = profile; errrrrror

const {
  coords: { lat, lng },
}: { coords: { lat: number; lng: number } } = profile;

1. Understand the problem

  • 문제를 자신의 방식으로 다시 말할 수 있는지?
  • 문제에 들어가는 입력 데이터는 무엇인지?
  • 해결책에서 얻을 수 있는 결과는 무엇인지?
  • 문제를 해결할 충분한 정보를 가지고 있는지?
  • 함수나 변수 등의 이름은 어떻게 정할 것인가?

2. Explore examples

  • 간단한 예제로 시작하기
  • 더 복잡한 예제 진행하기
  • 빈 입력값을 가진 예제로 테스트하기
  • 잘못된 입력값을 가진 예제로 테스트하기

3. Break it down

  • 수행해야 할 단계를 명시적으로 기록하기

4. Solve or Simplify

  • 문제를 해결하거나 더 간단한 문제 해결하기

5. Look back and Refactor

  • 결과를 확인할 수 있는지?
  • 결과를 다르게 할 수 있는지?
  • 한번에 코드를 이해할 수 있는지?
  • 다른 문제에서도 결과값이나 함수를 사용할 수 있는지?
  • 수행 시간이 적절한지?
  • 다른 방법으로 문제를 해결할 수 있는지?
  • 다른 사람들은 이 문제를 어떻게 풀었는지?

Type annotaions

변수가 참조하는 값의 type이 무엇인지 typescript에 표시하는 코드입니다.

  • function이 'any' 유형을 반환하고 값을 명확히 해야 할 때
const json = '{"x":10, "y":20}';
const coordinates: { x: number; y: number } = JSON.parse(json);
// JSON.parse 는 any를 반환합니다.
  • 변수를 한 라인에 선언하고 나중에 초기화할 때
let countries: string[] = ['korea', 'japan', 'spain', 'ukraine'];
let foundCountry: boolean;

for (let i = 0; i < countries.length; i++) {
  if (countries[i] === 'korea') {
    foundCountry = true;
  }
}
  • 변수를 추정할 수 없는 유형으로 지정하려는 경우
let numbers: number[] = [-20, -30, 50, 60];
let numberAboveZero: boolean | number = false;

for (let i = 0; i < numbers.length; i++) {
  if (numbers[i] > 0) {
    numberAboveZero = numbers[i];
  }
}

Type inference

Typecript는 변수가 참조하는 값의 type을 파악하려고 합니다.
변수 선언과 초기화가 같은 라인에 있으면 Typescript는 변수 type을 확인합니다.

let kiwi = 5;
// kiwi is number
let beer; // beer is any
beer = 5;

제출 코드

function solution(answers) {
  let matchCount = new Object();
  const supoza1 = [1, 2, 3, 4, 5];
  const supoza2 = [2, 1, 2, 3, 2, 4, 2, 5];
  const supoza3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];
  for (let i = 0; i < answers.length; i++) {
    let order1 = i % supoza1.length;
    let order2 = i % supoza2.length;
    let order3 = i % supoza3.length;

    if (answers[i] === supoza1[order1]) {
      matchCount[1] = ++matchCount[1] || 1;
    }

    if (answers[i] === supoza2[order2]) {
      matchCount[2] = ++matchCount[2] || 1;
    }

    if (answers[i] === supoza3[order3]) {
      matchCount[3] = ++matchCount[3] || 1;
    }
  }
  let result = whoIsBest(matchCount);
  return result;
}

function whoIsBest(matchCount) {
  let result = new Array();
  let max = Math.max(...Object.values(matchCount));
  for (const [key, value] of Object.entries(matchCount)) {
    if (value === max) {
      result = result.concat(Number.parseInt(key));
    }
  }
  result.sort();
  return result;
}

수포자가 가진 배열 인덱스에 answers 배열 인덱스를 맞추기 위해 나머지 연산(%)을 사용하였습니다.

    let order1 = i % supoza1.length;
    let order2 = i % supoza2.length;
    let order3 = i % supoza3.length;

정답이라면 matchCount Object에 수포자에 해당되는 번호를 key로 하고

1을 더하거나 key가 없을 때는 1로 초기화합니다. 

    if (answers[i] === supoza1[order1]) {
      matchCount[1] = ++matchCount[1] || 1;
    }

whoIsBest 함수는 matchCount Object를 받아 결과값(ex [2,3])을 반환합니다.

function whoIsBest(matchCount) {
  let result = new Array();
  let max = Math.max(...Object.values(matchCount));
  for (const [key, value] of Object.entries(matchCount)) {
    if (value === max) {
      result = result.concat(Number.parseInt(key));
    }
  }
  result.sort();
  return result;
}

Object 가 가진 value 들 중에 가장 큰 값을 max로 선정합니다.

let max = Math.max(...Object.values(matchCount));

Object.entries method를 사용해 key와 value를 얻어내어 

value가 max와 같다면 key를 Number로 바꾸어 result 배열에 추가합니다.

for (const [key, value] of Object.entries(matchCount)) {
    if (value === max) {
      result = result.concat(Number.parseInt(key));
    }
  }

 

Solution with using filter

배열 filter 함수를 사용한 방법

function solution2(answers) {
  let matchCount = new Object();
  const supoza1 = [1, 2, 3, 4, 5];
  const supoza2 = [2, 1, 2, 3, 2, 4, 2, 5];
  const supoza3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];

  matchCount[1] = answers.filter(
    (answer, index) => answer === supoza1[index % supoza1.length]
  ).length;
  matchCount[2] = answers.filter(
    (answer, index) => answer === supoza2[index % supoza2.length]
  ).length;

  matchCount[3] = answers.filter(
    (answer, index) => answer === supoza3[index % supoza3.length]
  ).length;
 
  let result = whoIsBest(matchCount);
  return result;
}

Solution not using Object and fuction whoIsBest

Object와 whoIsBest 메소드를 사용하지 않은 방법

 

function solution(answers) {
  let result = new Array();
  const supoza1 = [1, 2, 3, 4, 5];
  const supoza2 = [2, 1, 2, 3, 2, 4, 2, 5];
  const supoza3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];

  const match1 = answers.filter(
    (answer, index) => answer === supoza1[index % supoza1.length]
  ).length;
  const match2 = answers.filter(
    (answer, index) => answer === supoza2[index % supoza2.length]
  ).length;
  const match3 = answers.filter(
    (answer, index) => answer === supoza3[index % supoza3.length]
  ).length;
  
  let max = Math.max(match1, match2, match3);
  
  [match1, match2, match3].forEach((match, index) => {
    if (match === max) {
      result = result.concat(index + 1);
    }
  });
  
  return result;
}

'코딩 테스트 > 프로그래머스' 카테고리의 다른 글

LEVEL 1 크레인 인형뽑기 게임  (0) 2020.07.02
function charCount(input) {
  if (!input) {
    return {};
  }
  if (typeof input !== 'string') {
    throw new Error('Input is not String');
  }
  let result = new Object();
  //  문자열을 소문자로 바꾸고 문자 단위로 나눈 뒤
  // 소문자이고 숫자인지 정규식을 사용해 필터링하고 정렬합니다.
  let charArray = input
    .toLowerCase()
    .split('')
    .filter((c) => /[a-z0-9]/.test(c))
    .sort();
  for (let i = 0; i < charArray.length; i++) {
    let char = charArray[i];
    result[char] = result.hasOwnProperty(char) ? result[char]++ : 1;
  }
  return result;
}

출력 예시

console.log(charCount('abc'));
// { a: 1, b: 1, c: 1 }
console.log(charCount('c b a a a 1 2 3'));
// { '1': 1, '2': 1, '3': 1, a: 1, b: 1, c: 1 }
console.log(charCount(123));
// Error: Input is not String
console.log(charCount(''));
// {}
console.log(charCount());
// {}
console.log(charCount('Hi, my name is Jinsu!!'));
// { a: 1, e: 1, h: 1, i: 1, j: 1, m: 1, n: 1, s: 1, u: 1, y: 1 }

다른 방식

function charCount2(str) {
  let obj = new Object();
  for (const char of str) {
    char = char.toLowerCase();
    if (/[a-z0-9]/.test(char)) {
      obj[char] = ++obj[char] || 1;
    }
  }
  return obj;
}
let names = ["Michael", "Bab", "Andrea"];
let num = [4, 5, 6, 9, 8, 7, 1, 2, 3, 0, 11, 12, 13, 10];
let values = [true, false, {}, [], 1, "a"];
// [ 'Andrea', 'Bab', 'Michael' ]
// [ [], 1, {}, 'a', false, true ]
// [0, 1, 10, 11, 12, 13, 2, 3, 4, 5, 6, 7, 8, 9];
console.log(names.sort());
console.log(values.sort());
console.log(num.sort());

문자열은 알바벳 순으로 정렬됩니다.

 

배열, 숫자, 객체, 문자열, false, true 순으로 정렬이 됩니다.

 

숫자는 문자열의 유니코드 코드 포인트를 따르기 때문에

1 11 12 2 3 4 순서로 정렬됩니다. 

숫자 순서로 정렬하기 위해서는 sort() 안에 비교 함수를 넣습니다

console.log(num.sort((a, b) => a - b));

/*
오름차순
[
   0,  1, 2, 3,  4,  5,
   6,  7, 8, 9, 10, 11,
  12, 13
]
*/

console.log(num.sort((a, b) => b - a));

/*
내림차순
[
  13, 12, 11, 10, 9, 8,
   7,  6,  5,  4, 3, 2,
   1,  0
]
*/

Map을 이용한 정렬

let list = [
  'korea',
  'Ukraine',
  'Russia',
  'japan',
  'china',
  'America',
  'poland',
  'Rumania',
];

// 임시 배열은 위치 및 정렬 값이있는 객체를 보유합니다.
let mapped = list.map(function (element, index) {
  return { index: index, value: element.toLowerCase() };
});
console.log(mapped);
// 축소 치를 포함한 매핑 된 배열의 소트
mapped.sort(function (a, b) {
  return +(a.value > b.value) || +(a.value === b.value) - 1;
});
console.log(mapped);
// 결과 순서를 위한 컨테이너
let result = mapped.map(function (element) {
  return list[element.index];
});
console.log(result);​
/*
let mapped = list.map(function (element, index) {
  return { index: index, value: element.toLowerCase() };
});
[
  { index: 0, value: 'korea' },
  { index: 1, value: 'ukraine' },
  { index: 2, value: 'russia' },
  { index: 3, value: 'japan' },
  { index: 4, value: 'china' },
  { index: 5, value: 'america' },
  { index: 6, value: 'poland' },
  { index: 7, value: 'rumania' }
]
mapped.sort(function (a, b) {
  return +(a.value > b.value) || +(a.value === b.value) - 1;
});
[
  { index: 5, value: 'america' },
  { index: 4, value: 'china' },
  { index: 3, value: 'japan' },
  { index: 0, value: 'korea' },
  { index: 6, value: 'poland' },
  { index: 7, value: 'rumania' },
  { index: 2, value: 'russia' },
  { index: 1, value: 'ukraine' }
]
let result = mapped.map(function (element) {
  return list[element.index];
});
[
  'America', 'china',
  'japan',   'korea',
  'poland',  'Rumania',
  'Russia',  'Ukraine'
]
*/

[참조]

Array.prototype.sort()

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

수행시간 비교: 기본 for loop < forEach < for of < for in

기본 for loop가 가장 빠릅니다.

 

Example

기본 for loop 사용: 3.799ms
for in loop 사용: 359.135ms
forEach 사용: 21.931ms
for of 사용: 26.932ms

function Loop1(nList) {
  let total = 0;
  for (let i = 0; i < nList.length; i++) {
    total += nList[i];
  }
  return total;
}

function Loop2(nList) {
  let total = 0;
  for (const num in nList) {
    total += num;
  }
  return total;
}

function Loop3(nList) {
  let total = 0;
  nList.forEach((num) => {
    total += num;
  });
  return total;
}

function Loop4(nList) {
  let total = 0;
  for (const num of nList) {
    total += num;
  }
  return total;
}

let n = 1000000;
let nList = new Array();
for (let i = 1; i <= n; i++) {
  nList.push(i);
}

console.time("기본 for loop 사용");
Loop1(nList);
console.timeEnd("기본 for loop 사용");

console.time("for in loop 사용");
Loop2(nList);
console.timeEnd("for in loop 사용");

console.time("for Each 사용");
Loop3(nList);
console.timeEnd("for Each 사용");

console.time("for of 사용");
Loop4(nList);
console.timeEnd("for of 사용");

1. forEach 문은 배열에서만 사용이 가능합니다.

2. for in 문은 모든 객체에서 사용이 가능하지만 key에만 접근합니다. value는 key를 사용해 접근해야 합니다.

3. for of 문은 컬렉션 개체가 [Symbol.iterator] 속성]을 가져야 합니다.

let sample = [1, 2, 3, 4, 5];
sample.Case = "I'am in the Cafe";

for (const key in sample) {
  if (sample.hasOwnProperty(key)) {
    console.log(key, sample[key]);
  }
}

// 0 1
// 1 2
// 2 3
// 3 4
// 4 5
// Case I'am in the Cafe

for (const iterator of sample) {
  console.log(iterator);
}

// 1
// 2
// 3
// 4
// 5

'코딩 테스트 > 알고리즘' 카테고리의 다른 글

Problem Solving Approach  (0) 2020.07.09
자바스크립트. 문자 세기  (0) 2020.07.08
자바스크립트. 정렬 순서  (0) 2020.07.04
Analyzing Performance of Arrays and Objects  (0) 2020.07.04
Big O Notation  (0) 2020.07.02

+ Recent posts