TIL 4일차

안광의·2021년 6월 17일
0

Today I Learned

목록 보기
4/64
post-thumbnail

시작하며

오늘은 javaScript에 대한 기본적인 내용을 마치고 반복문 관련 문제들을 풀어보았다. 추후 다른 프로그래밍 언어나 프레임워크에 대해 배울때 활용하겠지만 코드 스테이츠에서 제공하는 javsScript와 관련된 강의는 오늘이 마지막이다. 앞으로 javaScript를 어느정도 레벨까지 익히는 가는 내가 정규과정 외에 시간을 들여서 노력하냐에 달려있다고 생각한다.

반복문

반복문은 알고리즘을 짤때 기본이 된다고 말할 수 있는 구문으로 같거나 비슷한 코드를 여러번 실행시켜 코드를 간결하게 만들 수 있다. 계속 해서 반복되는 코드들을 일일히 적어줄 필요없이 반복문을 사용하면 원하는 만큼 반복해서 작업을 수행할 수 있다.

//for 구문
let sum = 0
for(let n=2; n<=4; n++) { //(초기화; 조건식; 증감문;)
  sum = sum + n;
}
console.log(sum); // 9(2+3+4)
//while 구문
let sum = 0;
let n = 2; // 초기화
while(n<=4) { // 조건식
  sum = sum +n;
  n = n + 1; // 증감문
}
console.log(sum); // 9

반복문은 반복에 사용될 값의 초기화, 반복이 종료될 때를 정할 수 있는 조건식, 반복에 사용될 값의 증감문 세가지를 설정해야 한다. for나 while을 사용하여 반복문을 작성할 수 있는데, for는 세가지 조건이 그 뒤의 괄호 안에 작성해야 하고, while은 조건식만 그 뒤 괄호 안에 작성하고 초기화는 그 이전에 선언과 할당, 증감문은 반복문 내에 따라 작성해주어야 한다.

실전

코드 스테이츠에서 Pair Programming을 통해 반복문 문제를 풀어보았는데, 기초적인 내용이 많다보니 코딩테스트 사이트에서 문제 하나를 풀어보았다.

문제
수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.

제한사항

  • 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
  • completion의 길이는 participant의 길이보다 1 작습니다.
  • 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
  • 참가자 중에는 동명이인이 있을 수 있습니다.

입출력 예

participantcompletionreturn
["leo", "kiki", "eden"]["eden", "kiki"]"leo"
["marina", "josipa", "nikola", "vinko", "filipa"]["josipa", "filipa", "marina", "nikola"]"vinko"
["mislav", "stanko", "mislav", "ana"]["stanko", "ana", "mislav"]"mislav"

[출처] 프로그래머스(https://programmers.co.kr/learn/courses/30/lessons/42576)

답 1

function solution(participant, completion) {
    for (let i=0; i <= participant.length - 1; i++) {  // 참가자배열중 1번~마지막까지 반복
      for (let j=0; j <= completion.length - 1; j++) {// 참가자 n과 완주자 배열에서 비교
        if(participant[i] === completion[j]) {
          participant[i] = 0
          completion[j] = 0
        // 동일할 경우 참가자배열과 완주자 배열 0으로 변경
        }
      }
    }
    for (let k=0; k <= participant.length - 1; k++) {
        if (participant[k] !== 0) {
            return participant[k]// 출력 참가자 배열중 0이아닌 값 출력반복
        }
    }
}

문제를 풀기 전 배열에 대한 이해가 낮기 때문에 따로 공부를 하고 코딩테스트를 진행할 수 있었다. 처음 문제를 읽었을 때는 이중반복문을 사용해서 각 배열을 비교한 후 참가자 배열에서 겹치치 않는 값을 찾아내어 출력하면 될 것이라 생각해서 위와 같은 형태로 코드를 작성했고 동명이인이 있을 수 있고 배열 순서가 랜덤이기 때문에 완주했을 경우에는 참가자와 완주자(동명이인때문에 발생할 오류를 방지하기 위해) 배열 모두 0을 재할당하기로 하였다.
테스트 코드를 실행했을 때는 정확한 값이 출력되었지만 효율성 테스트는 합격하지 못했다.

답2

function solution(participant, completion) {
    participant.sort() // 참가자 배열 순서 알파벨 순으로 정렬
    completion.sort()  // 완주자 배열 순서 알파벨 순으로 정렬
    for (let i=0; i<participant.length; i++)
        if(participant[i] !== completion[i]) { // 배열 순으로 비교하여 같지 않을 경우
          return participant[i] // 해당 참가자 배열 값 출력
        }
}

효율성을 높이기 위해 조건문을 줄여야겠다고 생각이 들어서 우선 비교와 동시에 값을 출력할 수 있도록 코드를 수정해야겠다고 생각이 들었다. 그러기 위해서는 두 배열을 같은 순서로 정렬해야겠다고 생각이 들어서 .sort()라는 method를 찾을 수 있었고 반복문을 통해 비교를 하기 전에 두 배열의 순서를 동일하게 재정렬 시킨 후 비교하여 같지 않을 경우 바로 출력될 수 있도록 작성하였다. 위와 같은 경우에는 동명이인이 있더라도 문제가 되지 않는다.
위 답으로 정확성과 효율성 테스트 모두 통과할 수 있었다.

마치며

var solution=(_,$)=>_.find(_=>!$[_]--,$.map(_=>$[_]=($[_]|0)+1))

위 코드는 다른 사람들이 완주자 문제에 제출한 가장 짧은 답이다. 가독성은 떨어지는 답이겠지만 저렇게 코드를 작성할 수 있을 만큼 javaScript에 대한 깊은 이해를 가진 사람이 있다는 것을 알았고 아직 배우기 시작하는 입장에서 프로그래밍 언어에 대한 매력을 느낄 수 있었다.

profile
개발자로 성장하기

0개의 댓글