코딩 테스트/프로그래머스

[4월 2일] 시소 짝꿍

2023. 4. 2. 09:58
목차
  1. 문제
  2. 1. 시소 짝꿍
  3. 느낀점

문제

1. 시소 짝꿍

문제 설명

어느 공원 놀이터에는 시소가 하나 설치되어 있습니다. 이 시소는 중심으로부터 2(m), 3(m), 4(m) 거리의 지점에 좌석이 하나씩 있습니다.
이 시소를 두 명이 마주 보고 탄다고 할 때, 시소가 평형인 상태에서 각각에 의해 시소에 걸리는 토크의 크기가 서로 상쇄되어 완전한 균형을 이룰 수 있다면 그 두 사람을 시소 짝꿍이라고 합니다. 즉, 탑승한 사람의 무게와 시소 축과 좌석 간의 거리의 곱이 양쪽 다 같다면 시소 짝꿍이라고 할 수 있습니다.
사람들의 몸무게 목록 weights이 주어질 때, 시소 짝꿍이 몇 쌍 존재하는지 구하여 return 하도록 solution 함수를 완성해주세요.

 

제한 사항

  • 2 ≤ weights의 길이 ≤ 100,000
  • 100 ≤ weights[i] ≤ 1,000

 

입출력 예

weights result
[100,180,360,100,270] 4

 

내 풀이(실패)

const gcd = (a,b) => (b>0?gcd(b,a%b):a)
const lcm = (a,b) => (a*b/gcd(a,b))

function solution(weights) {
    var answer = 0;
    weights = weights.sort((a,b)=>a-b);
    console.log(weights)
    
    
    
    // 1. 두 숫자의 최소 공배수 구하기
//     2. 각 숫자 별 몇 배씩 곱했는지 -> 2,3,4라면 OK
    const list = [1,2,3,4]
    weights.forEach((weight1,index1)=>{
        weights.forEach((weight2,index2)=>{
            if(index1===index2) return;
            
            const l = lcm(weight1,weight2)
            if(list.includes(l/weight1) && list.includes(l/weight2)){          
                console.log(weight1,weight2,l);
                answer++
            }
        })
    })
    return answer/2;
}

O(n**2)으로 각 모든 조합을 돌렸다. 조합을 돌리면서 각각의 최소 공배수를 구해서, 최소공배수까지 각 값이 몇 배를 곱했는지 구해, 그 값들이 [1,2,3,4]배열 안에 있는 값이라면 answer++하는 식으로 했다. 그러면 중복해서 2번 씩 더해질 것이니 마지막에 /2를 해주었다.

결과는 테스트 1,2번 만 통과.

 

참고 풀이

function solution(weights) {
    let answer = 0;
    const store = {}; //key-value
    const cal = [1, 3/2, 2, 4/3]; //경우의 수 (1,1), (2,3), (2,4), (3,4)

    weights.sort((a,b)=> b - a).forEach((w) => { //내림차순 정렬 후, 전체 돌면서
        let s;
        cal.forEach((i)=>{
            if( s = w * i, store[s] ){ //해당 비율을 곱한 값이 store에 존재할 경우
              answer += store[s];
            }
        });
        if (!store[w]) store[w] = 1;
        else store[w]++;
    });
    return answer;
}

1. if(s=w*i,store[s])?이게 무슨 풀이지 => i에 w를 곱하고, 결과를 s변수에 저장 & store데이터 구조에 있는지 확인

2. cal배열에 [1,3/2,2,4/3]을 넣어주었다. 각각 둘을 1,1배씩 해주었을 경우, 2,3배씩 해주었을 경우, 2,4배, 3,4배를 해주었을 경우에 대한 숫자이다.

3. 동일한 값이 여러 개 있는 경우를 대비하여 store객체를 이용하였다. store객체에 저장이 안되었다면 store[w]=1로 저장하고, 저장되어 있다면 store[w]++한다. => cal값을 곱한 값이 같은 값이 3개일 경우, 처음에는 1을 더하지만 그 다음은 2을 더하는 식 

느낀점

최소공배수, 최대공약수를 구하는 함수에서부터 잠깐 멈칫했다. 풀이의 일부분인 이런 기본적인 알고리즘도 잊고 있었다니. 이런 기초가 아직 부족한가보다. 이런 알고리즘을 좀 정리 한 번 해야겠다.

const gcd = (a,b) => (b>0?gcd(b,a%b):a)
const lcm = (a,b) => (a*b/gcd(a,b))

아직 많이 부족함을 느꼈다 .. 참고 풀이를 보고도 바로 이해를 하지 못하고 직접 손으로 써가며 '이게 이거구나' 알게 되었다. 많이 풀어봐서 많이 익혀야지 . 그리고, 이전에 틀렸던 문제들도 다시 한 번씩 풀어봐야겠다.

저작자표시 (새창열림)

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

[프로그래머스] 후보키  (0) 2023.05.12
[프로그래머스] 문자열 압축  (0) 2023.05.11
[프로그래머스] 순위 검색  (0) 2023.05.07
[프로그래머스] 양궁대회  (1) 2023.04.30
[프로그래머스] 게임 맵 최단거리  (0) 2023.04.29
[프로그래머스] 이모티콘 할인행사  (0) 2023.04.28
[프로그래머스] 택배 배달과 수거하기  (0) 2023.04.27
[3월 31일] 뒤에 있는 큰 수 찾기 | 숫자 변환하기  (0) 2023.03.31
  1. 문제
  2. 1. 시소 짝꿍
  3. 느낀점
'코딩 테스트/프로그래머스' 카테고리의 다른 글
  • [프로그래머스] 게임 맵 최단거리
  • [프로그래머스] 이모티콘 할인행사
  • [프로그래머스] 택배 배달과 수거하기
  • [3월 31일] 뒤에 있는 큰 수 찾기 | 숫자 변환하기
피터s
피터s
1년차 프론트엔드 개발자입니다 😣 아직 열심히 배우는 중이에요! 리액트를 하고있어요 :) - gueit214@naver.com - https://github.com/gueit214
피터의 성장기록1년차 프론트엔드 개발자입니다 😣 아직 열심히 배우는 중이에요! 리액트를 하고있어요 :) - gueit214@naver.com - https://github.com/gueit214
피터s
피터의 성장기록
피터s
전체
오늘
어제
  • 분류 전체보기 (200)
    • 코딩 테스트 (25)
      • 프로그래머스 (16)
      • LeetCode (8)
      • 백준 (1)
    • 개발 독서 일지 (1)
    • 기업 분석 (4)
    • 개발 일지 (19)
      • 최신기술 도전기 (1)
      • 에러 처리 (5)
      • 개발 일지 (12)
    • 개발 일상 (36)
      • 개발 회고 (22)
      • 개발 이야기 (12)
      • 개발 서적 (1)
    • 취업 관련 지식 (11)
    • 알고리즘 (17)
    • WebProgramming (84)
      • WebProgramming (8)
      • HTML (5)
      • CSS (8)
      • JS (21)
      • React (40)

블로그 메뉴

  • About
  • 2022년 개발 성장기
  • 앞으로의 계획
  • github
  • 일상 blog

공지사항

인기 글

태그

  • Union-find
  • KAKAO BLIND
  • 1년 회고
  • BFS
  • 해커톤
  • LV2
  • 개발 회고
  • 누적합
  • 카카오 채용연계형 인턴십
  • 개발 일상
  • 함수
  • lv3
  • Retry
  • Kakao Tech Internship
  • 구름
  • 1일 1커밋 후기
  • 개발 is life
  • 구름톤
  • 스터디 후기
  • dfs
  • 카카오
  • 반복문

최근 댓글

최근 글

hELLO · Designed By 정상우.
피터s
[4월 2일] 시소 짝꿍
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.