-
[TIL] 항해 99 2주차 알고리즘 코딩테스트 회고록_4일차항해[TIL] 2021. 11. 12. 01:17
Today I Learnd
(2021. 11. 11. 목)
1. 2주차 4일차 소감
오늘은 28문제를 팀 세명이서 나눴던 담당 문제들을 다 풀었다. 마지막 문제는 한 사람이 더 해야해서, 공평하게 다 같이 풀었다.
28문제를 다 풀었다는게 너무 뿌듯했다. 그치만 아직은 문제를 읽고 코트를 주르륵 치는게 아니다 보니 빠르게 풀고나서
다른 팀원들이 담당을 했던 문제 중 못 풀어본 문제를 풀어보았다. 아직은 방심하기는 이른 것 같다.
이틀 뒤면 테스트가 시작인데 내일은 잠을 줄여서라도 한번 씩 다 풀어봐야겠다.
2. 알고리즘 코딩테스트
1. 프로그래머스 문제 '하샤드 수' _ 11/11 마지막 담당 문제
// 문제 : 양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. // 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. // 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요. // 제한 조건 : x는 1이상, 1000이하인 정수입니다. function solution(x) { // ex) 18 let sum = 0 let arr = String(x).split("") // ex) "1, 18" // 자릿수 합을 사용하기 위해서 String으로 문자열로 만들어서 // 문자열을 여러개로 나눠주기 위해서 split을 사용해서 자릿수를 나눠줬다. for (let i = 0; i < arr.length; i++) { // 나눈 자릿수들을 더해주기 위해서 반복문을 돌려줬다. sum += Number(arr[i]) // 자릿수를 나누기 위해서 문자열로 만들어준 arr을 다시 숫자로 만들어주기 위해서 Number를 사용해줬고 // 반복문을 돌린 arr을 sum에 + 해줬다. } if (x % sum === 0) { sum = true // x가 sum으로 나누어 떨어지지면 true로 정해서 sum에 넣어줬고 } else { sum = false // 그게 아니라면 false를 sum에 넣어줬다. } return sum } console.log(solution(13)) //터미널을 실행해보면 false가 잘 나온다.
하샤드의 수라고 문제만 보고 아 마지막 문제라고 어려운 걸 줬구나 생각을 했는데 문제를 잘 읽어보니까 잘 보니까 풀 수 있겠다고
생각을 했다. 두 자릿수의 나눠주기 위해 문자열로 만들어주고 자릿수를 나눠주는 코드는 구글링을 찾아보기는 했지만
Number를 저번에 코드 뜯어보면서 구글링해서 배웠던 적이 있어서 다시 사용을 해서 나눈 자릿수를 다시 숫자로 바꿔주는 것도
할 수 있었다. 조금은 성장을 한 것 같지만 술술 풀어갈 수 있는 능력은 좀 많이 부족한 것 같다.
2. 프로그래머스 문제 '콜라츠 추측' _ 11/11 27번 문제
// 문제 : 1937년 Collatz란 사람에 의해 제기된 이 추측은, 주어진 수가 1이 될때까지 다음 작업을 반복하면, // 모든 수를 1로 만들 수 있다는 추측입니다. 작업은 다음과 같습니다. // 1-1. 입력된 수가 짝수라면 2로 나눕니다. // 1-2. 입력된 수가 홀수라면 3을 곱하고 1을 더합니다. // 2. 결과로 나온 수에 같은 작업을 1이 될 때까지 반복합니다. // 예를 들어, 입력된 수가 6이라면 6→3→10→5→16→8→4→2→1 이 되어 총 8번 만에 1이 됩니다. // 위 작업을 몇 번이나 반복해야하는지 반환하는 함수, solution을 완성해 주세요. // 단, 작업을 500번을 반복해도 1이 되지 않는다면 –1을 반환해 주세요. // 제한 조건 : 입력된 수, num은 1 이상 8000000 미만인 정수입니다. function solution(num) { let answer = 0 for (let i = 0; i < 500; i++) { // 주어진 수가 1이 될 때 까지 반복해주기 위해서 반복문을 씀. if(num !== 1){ // 조건문을 사용해서 num이 1이 아니라면이라는 조건문을 씀. if (num % 2 === 0) { // 짝수일 때와 홀수 일때를 조건을 주기위해서 위에 있는 조건문을 통해서 // 바로 짝수와 홀수를 구분 할 수 있게 안에다 넣어줌. num = num / 2 // 짝수일 때는 2와 나눠주라는 설명이 있어서 num = num / 2 를 해줬음. } else { num = num * 3 + 1 // 홀수일 때는 곱하기 3을하고 1을 더해주라는 설명이 있어서 num = num * 3 + 1 을 해줬음. } } else { return answer = i // 안에 있는 조건문이 반복을해서 1이 되었으면 answe에 i를 넣어주게 했다. // num이 1이면 answer라는 변수에 i를 넣는다. } } return answer = -1 // 반복을 통해서 1이 되지 않으면 -1을 리턴해주라고 했다. } console.log(solution(6))
이 문제는 설명을 듣고 좀 헷갈렸다. 그래서 솔직히 풀이를 보고 코드를 뜯어봤다. 그런데 코드를 뜯어보니까 문제 설명을 다시 읽으니까
이해가 갔다. 30분동안 헤매기는 했지만 너무 코드 풀이에 의존하지 말아야겠다. 대신에 코드를 보고 이것은 왜 이렇게 했을까 하는 해석을
혼자 힘으로 해본 결과, 코드가 머릿속에 들어오는 것 같아서 공부가 되는 것 같기는 했다.
3. 프로그래머스 문제 '내적' _ 11/9 15번 문제
// 문제 : 길이가 같은 두 1차원 정수 배열 a, b가 매개변수로 주어집니다. // a와 b의 내적을 return 하도록 solution 함수를 완성해주세요. // 이때, a와 b의 내적은 a[0]*b[0] + a[1]*b[1] + ... + a[n-1]*b[n-1] 입니다. (n은 a, b의 길이) // 제한 조건 : a, b의 길이는 1 이상 1,000 이하입니다. // a, b의 모든 수는 -1,000 이상 1,000 이하입니다. function solution(a, b) { let answer = 0 // 내적 공식에 사용될 값을 넣어주기 위해서 answer라는 변수를 0으로 정해줬다. for(let i = 0; i < a.length; i++) { // a,b의 매개변수 길이를 이용해서 answer 값에 활용하기 위해서 반복문을 써줬다. // i를 0이라는 변수를 정해줬고, i가 a의 길이보다 작을 때 까지 증가하게 반복시켜줬다. answer += a[i] * b[i] // answer라는 변수에 a[i] 곱하기 b[i]를 넣어줘서 그 이유는 문제 설명에 나온 것 처럼 // a[0] * b[0]를 곱해주고 매개변수에 들어간 값을 같은 방식으로 해줘야해서 [i]를 넣어줬고 // 반복을 하면서 answer에 추가시켜서 합을 구하기 위해서 했다. } return answer; } console.log(solution([1,2,3,4], [-3,-1,0,2]))
이 문제는 전에 풀었 던 행렬의 덧셈을 풀었던 것을 참고를해서 매개변수끼리 더해서 곱하는 것을 만들어줬다.
내적이라는 소리만 듣고 어려울 것 같단 생각을 했지만 역시 잘 읽어봐야 될 것 같다.
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. 부족한 점
오늘은 그 전날에 18시간 정도 알고리즘 테스트를 해서 문제를 풀 때 어떤 것을 사용해야할지 눈에 보이기 시작했다.
하지만 눈에만 보일뿐 코드를 치려니 술술 쳐지지는 않았다. 문제에 대해서 이해하는 능력은 어느정도 길러진 것 같은데
코드를 써 내려가는 기초?가 조금 부족하리라 생각하고 내일은 알고리즘 코딩테스트를 복습하면서 문법 공부를 조금 해야할 것 같다.
'항해[TIL]' 카테고리의 다른 글
[TIL] 항해 99 2주차 알고리즘 코딩테스트 회고록_6일차 (0) 2021.11.13 [TIL] 항해 99 2주차 알고리즘 코딩테스트 회고록_5일차 (0) 2021.11.13 [TIL] 항해 99 2주차 알고리즘 코딩테스트 회고록_3일차 (0) 2021.11.11 [TIL] 항해 99 2주차 알고리즘 코딩테스트 회고록_2일차 (0) 2021.11.10 [TIL] 항해 99 2주차 알고리즘 코딩테스트 회고록_1일차 (0) 2021.11.09