-
[TIL] 항해 99 2주차 알고리즘 코딩테스트 회고록_2일차항해[TIL] 2021. 11. 10. 01:33
Today I Learnd
(2021. 11. 9. 화)
1. 2주차 2일차 소감
2주차 2일차 오늘도 이번주에 있을 개인 코딩테스트를 대비하여 알고리즘 코딩테스트를 계속 진행했다.
어제 스스로 약속한 팀원 분들이 풀어봤던 것을 포함해 오늘 내가 할 담당 문제도 다 풀었다.
진짜 많이 풀어보면 풀어볼수록 좋다고 하는데 그 효과가 점점 더 있는 것 같고 초심자인 우리에게는
알지도 못하는데 몇시간동안 계속 붙잡는 것 보다는 풀이를 보고 코드들을 직접 뜯어보며 해석을 해보고
모르는 함수 같은 게 있으면 직접 구글링을 통해 공부를 할 수 있는 계기가 있던 것 같다.
그래도 욕심일지는 모르겠지만 2주차왔는데 별로 풀이의 도움을 받고 싶지 않아서 오기로 해봤지만
안되는 건 역시 안되는 거라서 내가 해 놓은 코드에 주석처리를 해서 내 스스로 해석한 코드를 코멘트로 적어 놓았다.
토요일까지 새벽까지 해야 하는데 슬슬 주변에서 그만 두시는 분들이 생겨서 거기에 현혹 될까 두렵지만
열심히해서 나는 꼭 내가 원했던 개발자가 될 거다.
2. 알고리즘 코딩테스트
1. 프로그래머스 문제 'x만큼 간격이 있는' _ 11/9 첫 번째 담당 문제
// 문제 : 함수 solution은 정수 x와 자연수 n을 입력 받아, x부터 시작해 x씩 증가하는 숫자를 n개 지니는 리스트를 리턴해야 합니다. // 다음 제한 조건을 보고, 조건을 만족하는 함수, solution을 완성해주세요. //제한 조건 : x는 -10000000 이상, 10000000 이하인 정수입니다. // n은 1000 이하인 자연수입니다. function solution(x, n) { let answer = [] // 반복문을 돌려서 숫자를 대괄호 안에 넣어 주기 위해서 빈 대괄호를 answer안에 넣어줌. for (let i = 1; i < n + 1; i++) { // x로 시작하는 출력값을 내주기 위해서 i = 1;로 정한다 0;으로 주게 되면은 0부터 시작하기 때문이다. // i < n + 1;( i가 n+1보다 작을 때까지)로 한 이유는 그냥 n으로만 해주면 // 예를 들어서 5번을 찍어내고 싶은데 i가 n보다 작으니까 원하는 길이에 도달하게끔 // i < n에다가 +1 을 해줌. answer.push(x * i) // x에 값을 넣어주면 넣어준 값이 2라면 2씩 올라가야 하기 때문에 반복문 안 asnswer에 x * i를추가해줌. } return answer } console.log(solution(2, 5)) // 터미널에 찍어주면 정상적으로 2씩 증감하면서 5번 찍어주는 것을 확인 할 수 있다.
이 문제 같은 경우에는 x로 시작해서 x씩 증가하는 것을 n개를 지니는 리스트를 함수로 완성하면 되는 거였다.
내가 제일 익숙함을 갖고 있던 for문을 적었다. 그런데 맨날 적었던대로 ' i = 0 ' 로 적었는데 원하는 입출력값이 있는데
맨 앞에 0이 붙어져서 나왔다 그래서 0을 1로 바꿔주니 그 문제는 해결 했다.
2. 프로그래머스 문제 '나누어 떨어지는 숫자 배열' _ 11/9 두 번째 담당 문제
// 문제 array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요. // divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요. // 제한 조건 : arr은 자연수를 담은 배열입니다. // 정수 i, j에 대해 i ≠ j 이면 arr[i] ≠ arr[j] 입니다. // divisor는 자연수입니다. // array는 길이 1 이상인 배열입니다. function solution(arr, divisor) { let num = [] // 반복문을 돌려서 sum안에 숫자를 넣어주기 위해서 대괄호를 비워놓음. for (let i = 0; i < arr.length; i++) { // i가 0일 때 i가 매개변수인 arr의 길이(length)만큼 i를 증감하는 반복문을 사용함. if (arr[i] % divisor === 0) { num.push(arr[i]) // arr[i]를 division으로 나눠서 나머지가 0이 되게 만들어주고 // push()라는 함수를 사용해서 num 변수에 넣어줌. } } num.sort((a, b) => a-b) // 문제 설명 중 나누어 떨어진는 값을 오름차순으로 정렬하라해서 // sort()라는 함수 중 화살표 함수를 사용해서 sort()함수 안에 함수를 만들어줌. if (num.length === 0) { num.push(-1) // 이번에는 num의 길이(length)가 0이면 // num이라는 변수에 push()함수를 이용해서 -1을 넣어줬다. // 그 이유는 division으로 나눠 떨어지는 요소가 0이면 -1을 담아 반환해줘야 됌. } return num } console.log(solution([5, 9, 7, 10], 5)) // 입력값 예시를 넣어봤을 때 터미널 창에선 반환되는 return값이 5, 10으로 나오는 것을 확인 할 수 있다.
이 문제를 접하고 문제 설명을 읽어보니까 '오름차순 정렬' 이 있었다. 엄청 반가웠다. 어제 이거 하나 때문에 애먹었는데,
덕분에 어제 고생해서 구글링해서 찾은 결과 이 걸 다시 쓸 줄 몰랐다... 어제는 문제 설명에 대한 이해가 좀 부족하다 싶었는데
하루가 지나서 다시 읽고 이해하려고 노력을 하니까 완벽까진 아니더라도 조금씩 코드를 치고 있는 나를 발견했다.
3. 프로그래머스 문제 '문자열 다루기 기본' _ 11/9 세 번째 담당 문제
// 문제 :문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution을 완성하세요. // 예를 들어 s가 "a234"이면 False를 리턴하고 "1234"라면 True를 리턴하면 됩니다. //제안 조건 : s는 길이 1 이상, 길이 8 이하인 문자열입니다. function solution(s) { let answer = true // true와 false 중 하나를 리턴해야 해서 넣어놈. // if ((s.length === 4 || s.length === 6) && !isNaN(s)) // "1e22" 같은 지수 형식으로 숫자로 읽어버려서 테스트 11번만 통과 못함. if ((s.length === 4 || s.length === 6) && s.split("").every((c)=>!isNaN(c))){ // 해석을 해보면 s의 길이가 4와 일치하거나(or) s의 길이가 6과 일치하게 되고 // solution의 매개변수 S에 문자열을 .split을 사용해서 구분자를 ""로 한다면 문자 하나하나가 인덱스로 처리된다. ex) 서울 = "서","울" // 그 후 .every()를 활용해서 배열의 모든 요소를 조건에 맞는지 검사하여 지수 형식 "1e22"같은 것을 검사해주고 //.every의 소괄호 안에 화살표 함수를 사용해서 매개변수 (c) 를 !isNaN(c)의 화살표 함수를 써줬다. // isNaN은 매개변수로 받은 값이 NaN인지 확인해서 Boolean(true / false) 값을 반환 하는 메서드임. // !(not)isNaN(s)를 사용해서 숫자로 변환시켜주기 위해 사용해서 answer의 값이 true로 반환 시켜주게함. answer = true } else { answer = false // 그렇지 않으면 answer변수에 false라는 반환값을 리턴시켜주게 했다. } return answer } console.log(solution('a234')) // 숫자를 콘솔로 찍어서 터미널에서 실행 시켜보면 True를 확인할 수 있다.
이 문제는 술술 풀었다. 코드 실행을 해봤을때도 무난하게 통과를 했다. 그런데 여기서 걸린 점은 채점 및 제출하기에서
계속해서 '테스트 11번' 만 통과를 못 하는 것이다. 진짜 정말 궁금했다 'console.log()' 를 사용해서 터미널 상에서도
정상으로 실행이 됐는데 거의 코드를 수정을 했었는데 원인을 찾지 못 했다. 그래서 결국 구글의 힘을 빌려서...
테스트 11번에 대한 문제를 찾을 수 있었는데 '1e22'같은 지수 형식으로 인해서 문자를 그대로 읽어버려서 오류가 떴던 것 같다..
그래서 해결법은 .split("")을 이용해서 지수형식이 안나오게 모든 문자들을 쪼개줬고, .every()라는 배열의 모든 요소가 조건에 맞는지
검사하는 메서드를 사용해서 그 안에 화살표 함수를 사용을 했다. 이렇게 수정을 하니까 귀신같이 '테스트 11번' 을 통과를해서
채점 및 제출을 완료를했다.
3. 번외 문제
어제 스스로 약속한 팀원들이 했던 알고리즘 문제에 대해서 풀어보겠다고 해서
어제 담당 문제 복습 3문제 + 오늘 담당 문제 3문제 + 팀원이 풀었던 알고리즘 7문제 = 총 13문제를
풀어봤다. 어려운 것도 있고 어려워 보였는데 의외인 것들도 많아서 이제 조금 손에 익히는 중이다.
1. 프로그래머스 문제 '직사각형 별찍기'
// 문제 : 이 문제에는 표준 입력으로 두 개의 정수 n과 m이 주어집니다. // 별(*) 문자를 이용해 가로의 길이가 n, 세로의 길이가 m인 직사각형 형태를 출력해보세요. // 제한 조건 : n과 m은 각각 1000 이하인 자연수입니다. process.stdin.setEncoding('utf8'); process.stdin.on('data', data => { const n = data.split(" "); const a = Number(n[0]), b = Number(n[1]); let star = ''; let a = 5 let b = 3 // 터미널에 실행 시키기 위해서 변수를 5(가로), 3(세로)를 정의해줌. for (let i = 0; i < b; i++) { // b = Number(n[1])을 반복해서 원하는 세로를 찍어주기 위해서 반복문을 돌려줌 let star = "" //반복문을 돌려서 넣을 star라는 변수 안에 ''빈칸을 넣어줌. for(let j = 0; j < a; j++) { star += "*" // a = Number(n[0]) '*'을 원하는 가로 세로 만큼 찍어주기 위해서 반복문을 돌림. // star라는 변수에 '*'를 반복해서 넣어주면서 원하는 행과 열을 만든다. } console.log(star) } });
2. 프로그래머스 문제 '가운데 글자 가져오기'
// 문제 : 단어 s의 가운데 글자를 반환하는 함수, solution을 만들어 보세요. 단어의 길이가 짝수라면 가운데 두글자를 반환하면 됩니다. //제한 조건 : s는 길이가 1 이상, 100이하인 스트링입니다. function solution(s) { let aaa = ''; if (s.length % 2 === 0) { // 짝수일 경우 aaa = s[s.length / 2 - 1] + s[s.length / 2] } // 짝수이면, 문자열의 길이를 2로 나누어 해당 인덱스의 이전 값과 해당 인덱스 값을 출력해주면 된다. else { aaa = s[Math.floor(s.length / 2)] // 문자열의 길이가 홀수일 때 2로 나누면 나눈 값은 소숫점이 될 것이다. // 그러므로 나눈 값에 Math.floor()메서드를 사용해 반내림을 해주어야 한다. // 반올림이 아닌 반내림을 하는 이유는 인덱스는 0부터 시작하기 때문이다. } return aaa; } const a = 'abcded' const jak = 'abcde' console.log(solution(a, jak)) // 결과 값 터미널에 실행 후 결과 값 정상 확인.
3. 프로그래머스 문제 '두 정수 사이의 합'
// 문제 : 두 정수 a, b가 주어졌을 때 a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수, solution을 완성하세요. // 예를 들어 a = 3, b = 5인 경우, 3 + 4 + 5 = 12이므로 12를 리턴합니다. // 제한 조건 : a와 b가 같은 경우는 둘 중 아무 수나 리턴하세요. // a와 b는 -10,000,000 이상 10,000,000 이하인 정수입니다. // a와 b의 대소관계는 정해져있지 않습니다. function solution(a, b) { let answer = 0 let num = [] // a부터 b까지 순차적으로 숫자를 넣으며, 반복문을 돌리기 위해서 answer라는 변수에 0을 넣어줌. if ( a === b) { answer = a // a와 b가 같은 경우 아무 수나 리턴이니까 둘다 같다면 이라고 조건문을 써주고, // answer라는 변수에 a를 넣어줌. } else { num.push(a, b) num.sort((a, b) => a-b) // 숫자를 집어 넣기 위해서 비워놓았던 또 다른 변수 num에 a와 b를 넣어줌. // 변수명.sort를 이용해서 숫자를 오름차순으로 정렬함. // .sort : 이 메서드는 배열의 요소를 위치에 정렬한 후 그 배열을 반환함. for (let i = num[0]; i < num[1] + 1; i++ ) // 반복문을 돌려서 num의 숫자 0을 i로 정의해주고, i가 num[1] + 1 보다 작고 i를 증감시켜준다. answer += i // 모든 정수의 합을 더해줘야해서 더해준다. // answer = answer + i } return answer; } const q = 3 const w = 5 console.log(solution(q, w))
4. 프로그래머스 문제 '없는 숫자 더하기'
// 문제 : 0부터 9까지의 숫자 중 일부가 들어있는 배열 numbers가 매개변수로 주어집니다. // numbers에서 찾을 수 없는 0부터 9까지의 숫자를 모두 찾아 더한 수를 return 하도록 solution 함수를 완성해주세요. // 제한 조건 : 1 ≤ numbers의 길이 ≤ 9 // 0 ≤ numbers의 모든 수 ≤ 9 // numbers의 모든 수는 서로 다릅니다. function solution(numbers) { let answer = 0 // 반복문을 통해서 answer라는 변수 안에 숫자를 넣기 위해서 0을 넣어줌. for (let i = 0; i < 10; i++) { answer += i // numbers의 모든 수가 ≤ 9여서 10 전 까지만 돌려주기 위해 컨디션에 10을 넣어줌. // 0에서 9까지의 숫자를 모두 찾아 더해야 하므로 answer += i를 넣음. } for(let j = 0; j < numbers.length; j++) { answer -= numbers[j] // 0에서 9까지의 숫자를 하나씩 빼서 모든 수를 더하기 위해 길이만큼 반복을 해줘서 answer -= i를 해줌. } return answer; } console.log(solution([1,2,3,4,6,7,8,0])) // 결과 값 출력 OK
5. 프로그래머스 문제 '음양 더하기'
// 문제 : 어떤 정수들이 있습니다. // 이 정수들의 절댓값을 차례대로 담은 정수 배열 absolutes와 이 정수들의 부호를 차례대로 담은 불리언 배열 signs가 매개변수로 주어집니다. // 실제 정수들의 합을 구하여 return 하도록 solution 함수를 완성해주세요. // 제한 조건 : absolutes의 길이는 1 이상 1,000 이하입니다. // absolutes의 모든 수는 각각 1 이상 1,000 이하입니다. // signs의 길이는 absolutes의 길이와 같습니다. // signs[i] 가 참이면 absolutes[i] 의 실제 정수가 양수임을, 그렇지 않으면 음수임을 의미합니다. function solution(absolutes, signs) { let answer = 0 // 반복문을 통해서 변수에 0을 할당해서 숫자를 넣어주려고 0을 넣음 for (let i = 0; i < absolutes.length; i++) { // absolutes의 모든 합을 위해서 길이만큼 반복문을 돌려줌 if (signs[i] === true) { answer += absolutes[i] // 조건문을 통해서 signs의 [i]번째 가 트루면 answer와 absolutes의 [i]를 더해줌 } else { answer -= absolutes[i] // 그게 아니라면 answer와 absolutes의 [i]를 빼줌 } } return answer; } console.log(solution([4, 7, 12], [true,false,true])) // 결과 값 터미널에 실행 후 결과 값 정상 확인.
6. 프로그래머스 문제 '핸드폰 번호 가리기'
// 문제 : 프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다. // 전화번호가 문자열 phone_number로 주어졌을 때, // 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 *으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요. // 제한 조건 : s는 길이 4 이상, 20이하인 문자열입니다. function solution(phone_number) { let answer = '' // 번호의 문자열인 숫자를 넣어주기 위해 문자열''을 비워줌. for (let i = 0; i < phone_number.length; i++) { // 번호의 길이를 i라는 변수를 0으로 정해줘 첫번째 부터 돌아가고 // i라는 변수가 번호의 길이보다 작을 때 까지 i라는 변수를 증가 시켜줌. if (i < phone_number.length - 4) { answer += '*' // 앞서 반복문에서 정해준 i가 번호 길이의 마지막에서 부터 4 인덱스(네 자리)를 제외 한 나머지 숫자를 // answer라는 변수에 문자열 '*'을 넣어준다. } else { answer += phone_number[i]; // 아니면 answer라는 변수에 번호의 [i]번째를 더해줌. } } return answer } console.log(solution("027778888")) // 결과 값 잘 나오는 거 확인. // 주의사항 : 대입 연산자 확인 및 오타 필수 자꾸 틀림.
7. 프로그래머스 문제 '행렬의 덧셈'
// 문제 : 행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. // 2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요. // 제한 조건 : 행렬 arr1, arr2의 행과 열의 길이는 500을 넘지 않습니다. function solution(arr1, arr2) { let answer = [] // 입출력이 리스트 안에 리스트가 있어서 첫번째 리스트를 위한 반복문을 돌려서 넣을 answer라는 변수를 만들어줌. for (let i = 0; i < arr1.length; i++) { // 첫번째 행에 반복문을 i라는 변수를 할당해서 인덱스 0으로 정하고 // i가 arr1의 길이보다 작을 때 까지 i를 증가시켜주면서 반복을 하게 반복문을 함. let temp = [] // 입출력이 리스트 안에 리스트카 있어서 두번째 리스트를 위한 반복문을 돌려서 넣을 answer라는 변수를 만들어줌. for (let j = 0; j < arr1[i].length; j++) { // 두번째 행에 반복문을 j라는 변수를 할당해서 인덱스 0으로 정하고 // j가 arr1의 i번째의 길이보다 작을 때까지 j를 증가하면서 반복문을 정함. temp.push(arr1[i][j] + arr2[i][j]) // 위에 만들어둔 temp라는 변수를 push라는 함수를 이용해서 // arr1[i][j] + arr2[i][j]를 push라는 함수에 추가 시켜줌. } answer.push(temp) // 첫 번째 행의 answer이란 변수에 push라는 함수를 사용해서 두번째 행의 temp라는 변수를 추가함. } return answer; } console.log(solution([[1,2],[2,3]], [[3,4],[5,6]])) // 결과 값이 터미널에서 잘 찍히고 있음.
위 7문제를 풀어보고 느낀 점은 정말 나는 코더가 되기 싫다. 한 분야에 있어서 본인이 얻은 기술 같은 것들은 프라이드를 갖고 지켜야하는데
어디가서 잘 모르겠다고 말하는 사람이 되기 싫어서 였다. 초반에는 왜 모를까 했는데, 모르는게 당연한거고 그래서 배우기 위해서
항해99 부트캠프에 참여하게 된 것이다. 하루하루 코딩을 할 때 시간을 헛되게 만들지 않고 내 껄로 가져가게 만들 것이다.
4. 부족한 점
오늘 있었던 알고리즘 특강을 들었는데 나는 그냥 내가 알고 있는 선에서만 하려는 것 같았다.
아직 2주차라 알고 있는 것도 없는데 너무 욕심만 부렸나보다.
공략법은 배경지식, 구현력, 문제해결능력 이 세가지를 공략을 하라는데 그냥 많이 반복적으로 문제를 풀어봐야겠다..
아직 까지도 문제 이해 능력이 부족하고 스스로 하는 힘이 부족하지만 전날에 16시간 동안 공부를 한 덕에
오늘은 그래도 조금 수월했던 것 같다.
'항해[TIL]' 카테고리의 다른 글
[TIL] 항해 99 2주차 알고리즘 코딩테스트 회고록_6일차 (0) 2021.11.13 [TIL] 항해 99 2주차 알고리즘 코딩테스트 회고록_5일차 (0) 2021.11.13 [TIL] 항해 99 2주차 알고리즘 코딩테스트 회고록_4일차 (0) 2021.11.12 [TIL] 항해 99 2주차 알고리즘 코딩테스트 회고록_3일차 (0) 2021.11.11 [TIL] 항해 99 2주차 알고리즘 코딩테스트 회고록_1일차 (0) 2021.11.09