티스토리 뷰
오늘은 조금 더 간단한 입출력 예제가 다수 포함되어있다.
function solution(num1, num2) {
const answer = num1 - num2;
return answer;
}
간단한 문제였지만, 다른 사람은 화살표 함수를 활용해 문제를 풀었다.
문득 여기서는 왜 funtion이 아니라 const를 사용했을까하는 물음이 생겼다.
const solution = (num1, num2) => num1 - num2
검색해봤더니 화살표함수는 원래 'const', 'let', 'var' 키워드와 함께 사용하는 것이라고.
아직 배움이 멀다.
let multiply = (a, b) => a * b;
multiply = (a, b) => a / b; // 재할당 가능
이런식으로 let 키워드를 사용하면 재할당 가능하지만,
요즘 코딩 트렌드는 웬만해서는 const를 사용하는 추세이다보니.
나의 코드
function solution(numbers) {
let sum = 0;
for (let i = 0; i < numbers.length; i++) {
sum += numbers[i];
}
const average = sum / numbers.length;
return average;
}
문제를 풀면서도 찝찝한게,
코드가 생각보다 기니까 다른 사람들은 얼마나 더 깔끔하게 풀었을까 싶은 걱정이 먼저 든다.
아니나 다를까 이런 쌈뽕한 코드가 바로 나왔다.
function solution(numbers) {
var answer = numbers.reduce((a,b) => a+b, 0) / numbers.length;
return answer;
}
reduce | |
목적 | 배열을 하나의 값으로 줄이거나 합계 등을 계산할 때 사용 |
사용 예시 | 누적 계산을 간결하게 작성하고자 할 때 |
확실히 누적계산 문제였다.
다음부터는 조금 더 배열 메소드를 사용해봐야겠다고 생각했다.
function solution(num1, num2) {
return num1 === num2 ? 1 : -1;
}
다행하게 바로 삼항연산자가 떠올라 깔끔하게 풀었다.
그리고 이런 기발한 풀이를 봤다.
function solution(num1, num2) {
return ((num1 == num2)-0.5)*2;
}
ㅋㅋㅋㅋ 이정도면 예술인데?
하지만 === 연산자가 더 알맞지 않나란 생각도 든다.
인자로 무조건 숫자만 넘어오지 않을 수도 있으니까
function solution(num1, num2) {
return Math.floor(num1 / num2);
}
혹시 소수점으로 문제가 생길 수 있으니
이제 Math.floor 연산자를 잘 사용해준다.
다른 사람의 풀이
function solution(num1, num2) {
return parseInt(num1 / num2);
}
이런 간단한 문제에서도 나는 생각지도 못한 방법이 항상 나와서 신기하다.
어느 쪽이 더 효율적인가에 대한 생각을 하며 서치해본 결과,
그래도 Math.floor 연산자가 낫다는 결론에 이르렀다.
방법 | 동작 방식 | 장점 | 단점 |
Math.floor | 아래쪽으로 내림 | 양수와 음수 모두 일관됨 | - |
parseInt | 정수 부분 추출 | 양수의 경우 내림과 동일함 | 음수의 경우 문제 발생 |
음수라는 변수가 있기 때문에 Math.floor 연산자를 주로 사용하기로 결정했다.
function solution(n) {
return Math.ceil(n / 7);
}
활자만 보고 무지성으로 if문 쓰면서 고민했는데
생각해보면 무조건 7조각이어야하는거니까,
n명을 7로 나눈 다음에 올려주면 되지않나하는 엄청난 생각이 떠올랐다.
물론 이것도 화살표 함수로 변환 가능하다.
const solution = (n) => Math.ceil(n/7)
이 문제는 이상하게 헤맸다.
왜일까? 뭔가 배열 키워드가 나오는 순간 내가 이상하게 문제를 꼬아보게 된다.
그냥 앞서 배운 filter를 이용해 걸러주면 되는 문제였다.
function solution(n, numlist) {
const result = numlist.filter(num => num % n === 0);
return result;
}
오늘은 이상하게 쉬운 문제들이 많이 걸려있어서
정답률 낮은 순으로 만들어 한 문제를 열심히 풀어봤다.
앗...아....
오늘은 이 문제에 가장 많은 시간을 할애한 것 같다.
별도의 답안 없이 오로지 모질라 사이트만 이용해 풀다보니
거의 2시간을 사용한듯싶다.
그래도 이 문제를 선택한 이유가 있다.
나는 컴퓨터학부로 전과해 처음 전필을 들으며 만들었던 프로젝트가 바로 지뢰찾기였기 때문!
그래서 다음 방식으로 코드를 작성했다.
1. board가 2차원 배열이다.
2. board를 순회해 모든 지뢰의 위치를 찾는다.
3. 지뢰 위치를 기반으로 8방향을 판단한다.
4. 모든 칸을 순회하면, 다시 위험지역이 아닌 칸을 카운트한다.
내가 생각했을 때, 이 논리에 따라 코드를 반복문으로 구성하는게 가장 베스트다.
실제로 이 코드가 내가 전과하자마자 만들었던 지뢰찾기 게임의 일부분이다.
function solution(board) {
const n = board.length;
const dangerZones = new Set();
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
if (board[i][j] === 1) {
for (let x = -1; x <= 1; x++) {
for (let y = -1; y <= 1; y++) {
const newRow = i + x;
const newCol = j + y;
if (newRow >= 0 && newRow < n && newCol >= 0 && newCol < n) {
dangerZones.add(`${newRow},${newCol}`);
}
}
}
}
}
}
let safeZoneCount = 0;
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
if (!dangerZones.has(`${i},${j}`)) {
safeZoneCount++;
}
}
}
return safeZoneCount;
}
하지만 머쓱이의 할인 문제를 풀며, 분명 8방향을 배열로 표현할 수 있을 것 같은데.
그 다음 forEach를 통해 코드를 순회하면 더 깔끔해지지 않을까?
이런 생각을 했다.
function solution(board) {
let directions = [[-1,0], [-1,-1], [-1,1], [0,-1],[0,1],[1,0], [1,-1], [1,1]];
let safezone = 0;
board.forEach(`${함수 내용}`);
return safezone;
}
하지만 이 forEach에 들어갈 함수 본체 부분을 구현하지 못했고,
다른 사람의 풀이를 보게 되었다.
board.forEach((row, y, self) => row.forEach((it, x) => {
if (it === 1) return false;
return outside.some(([oy, ox]) => !!self[oy + y]?.[ox + x])
? false : safezone++;
}));
이 코드는 아직 해석이 어려운데 ㅜㅜ
row.forEach((it, x)
forEach를 통해 각 행과 요소(it), 해당 요소의 인덱스를 순회함
if (it === 1) return false;
요소가 1이라면 return false.
지뢰라면 바로 다음 요소로 이동한다.
return outside.some(([oy, ox]) => !!self[oy + y]?.[ox + x]) ? false : safezone++;: outside
이게 제일 헷갈렸는데 그냥 8방향에 지뢰가 있는지 확인하는 코드였다.
! 연산자 때문에 헷갈렸는데, 그냥 Not 연산자였다.
나는 단일로 사용하는 건 봤어도 이중으로 사용하는 건 본적이 없는데,
그냥 값을 불리언으로 변환하는 가장 간단한 용도로 사용했던 것이다.
이렇게 또 하나 배워가네요.
'Oops, All Code! > 🤯 Oops, My Algorithm!' 카테고리의 다른 글
- ̗̀ෆෆ ̖́ 05. 기본 입출력에 관한 예제 (0) | 2024.07.02 |
---|---|
CT Sprint: 프로그래머스(Programmers)와 리트코드(LeetCode)를 이용한 코딩테스트 (0) | 2024.07.01 |
- ̗̀ෆෆ ̖́ 04. 기본 입출력에 대한 예제 (1) | 2024.06.30 |
- ̗̀ෆෆ ̖́ 03. 기본 입출력에 관한 예제 (0) | 2024.06.30 |
- ̗̀ෆෆ ̖́ 01. 기본 입출력에 관한 예제 (0) | 2024.06.28 |
- Total
- Today
- Yesterday
- 코딩테스트
- 플리마켓운영
- 안성스타필드
- 우아한테크코스
- javascript
- 어른의어휘공부
- 카드뉴스
- react
- 도서추천
- 카페추천
- 프리코스
- js
- 타입좁히기
- 경험플리마켓
- typescript
- 어휘력
- 대학생플리마켓
- 플리마켓후기
- 프로토타입
- 책추천
- 소사벌맛집
- 비즈플리마켓
- 대학생팝업스토어
- 트러블슈팅
- 소사벌
- 회고
- 일급객체
- 도서리뷰
- 서평
- 프론트엔드
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |