프로그래머스 lv.0 최빈값 문제 풀이에 대해서 논의를 진행함.
https://school.programmers.co.kr/learn/courses/30/lessons/120812
빈 배열answerList
을 하나 따로 생성하고
배열에 객체를 만들어서 반복적으로 추가하게 작성함(array의 숫자값 number
,세어진 횟수 count
). 행동의 기준점을 findIndex
를 사용함.
array
의 첫 항목의 경우에는 answerList
에 아무것도 없으니 findIndex
의 값이 -1이기 때문에 해당 경우에는 count
값을 1로 하는 항목을 push
함.
그 뒤로 들어온 항목에서 첫번째 조건이 false
가 나온다면, 해당 값이 존재하는 index
를 찾아서 해당 값의 count
값만 더해준다.
반복 과정을 마친 다음 sort
메서드를 사용해서 count
를 기준으로 내림차순으로 정렬함
만약,
- 입력한 배열의 항목이 1개밖에 없다면, 첫번째 항목의 number
값을 대입
answerList
의 첫번째 와 두번째 항목의 count값이 동일하다면 최빈값이 존재하지 않는 것이기 때문에 -1로 대입number
값을 대입한다.function solution(array) {
if ((0 <= array.length) | (array.length < 1000)) {
var answerList = [];
for (let i = 0; i < array.length; i++) {
//해당 number가 이미 추가되었는가?
if (answerList.findIndex((k) => k.number === array[i]) === -1) {
//없으면 새로 항목을 추가하고
answerList.push({ number: array[i], count: 1 });
} else {
var someIndex = answerList.findIndex((k) => k.number === array[i]);
// 만약 있으면 count값을 추가로 더한다
answerList[someIndex].count++;
}
}
}
// 최빈값을 구하기 위해 count를 내림차순 기준으로 정렬
answerList.sort((a,b) => b.count- a.count);
// 만약 입력한 배열의 항목이 1개밖에 없다면
if (answerList.length === 1) {
var answer = answerList[0].number
}
// 만약 answerList의 첫번째와 두번째 항목의 count 값이 동일하다면 가장 많이 존재하는 숫자가 하나가 아닌 것이므로 -1로 지정
else if (answerList[0].count - answerList[1].count === 0){
var answer = -1
} else{
// 가장 첫번째 인덱스의 number 값을 지정
var answer = answerList[0].number
}
return answer;
}
빈 배열에 객체를 집어넣는 나의 방법과는 다르게 그냥, 빈 객체를 만들어서 그곳에 집어넣고 반복문을 만들어서 구현하니 코드가 좀더 단순해지고 이해하기가 편해졌다.
function solution(array) {
let numObj = {};
let max = 0;
let answer = -1;
// numObj 객체에 배열의 각 요소별 개수 정보를 입력
for (let num of array) {
numObj[num] ? (numObj[num] += 1) : (numObj[num] = 1);
}
// 가장 높은 빈도수를 max에 할당
for (let key in numObj) {
max = Math.max(max, numObj[key]);
}
// max 빈도수를 가진 요소를 출력
for (let key in numObj) {
// max 빈도수가 중복이라면 -1 반환
if (numObj[answer] === numObj[key]) {
return -1;
}
// max 빈도수값을 가지는 요소를 반환
if (numObj[key] === max) {
answer = parseInt(key);
}
}
return answer;
}
다른사람이 해결한 코드를 보니, 저런 방법으로도 해결할수 있다는 사실에 감탄하면서 아직 멀었다는 생각이 든다.
하나의 플렉스 아이템이 자신의 컨테이너가 차지하는 공간에 맞추기 위해 크기를 키우거나 줄이는 방법을 설정하는 속성
※ flex container : flex 속성을 가진 부모요소
※ flex items : flex 속성을 가진 부모 아래의 자식요소
1차원 레이아웃 구조를 만드는용도로 사용하는 css 기술!!
flex : Block 특성의 Flex Container를 정의
inline-flex : Inline 특성의 Flex Container를 정의
단축 속성으로 Flex Items의 주 축(main-axis)을 설정하고 Items의 여러 줄 묶음(줄 바꿈)도 설정합니다.
flex-dirction
과 flex-wrap
을 동시에 사용하고 싶을때 이 속성하나로 정의가 가능함
메인 축 방향 정렬
lex-start (기본값)
아이템들을 시작점으로 정렬.
flex-end
아이템들을 끝점으로 정렬.
center
아이템들을 가운데로 정렬.
space-between
아이템들의 “사이(between)”에 균일한 간격 생성.
space-around
아이템들의 “둘레(around)”에 균일한 간격을 생성.
space-evenly
아이템들의 사이와 양 끝에 균일한 간격을 생성.
교차 축의 정렬 방법을 설정
주의할 점은 flex-wrap 속성을 통해 Items가 여러 줄(2줄 이상)이고 여백이 있을 경우만 사용이 가능하다.
기본 값은 strech
교차 축을 채우기 위해 Items를 늘린다.
Content를 기준으로 정렬하는 것!
Items가 한줄일 때 사용이 가능
여기도 기본값은 strech
주의할 점은 Items가 flex-wrap
을 통해 여러 줄(2줄 이상)일 경우에는 align-content 속성이 우선하게된다!
※ flex-grow는 콘텐츠(문자 텍스트)사이의 양 옆의 공간에 따른 여백의 비율을 결정하므로 서로의 콘텐츠의 길이가 다른 상황에서는 원하는 만큼의 비율로 나누어 지지 않을수 있다.
이럴때에는 flex-basis
의 값으 0으로 변경하면 원하는 만큼의 비율로 나타나는 모습을 볼수 있다.
flex-grow, flex-shrink, flex-basis의 단축 속성
flex : 1
오 그럼 이건 flex-grow가 1 flex-shrink 1 flex-basis는 auto겠네?
아니다. flex:1 로 지정하면 flex-basis는 0으로 되어버린다.
필요에 의해 일부 Item만 정렬 방법을 변경하려고 할 경우 align-self를 사용할 수 있다.
부모 요소에서 width 혹은 height를 관리하는 것이 수월하다.
부모 요소에서 너비를 정하면 자식요소에도 적용될수 있기 때문
position:fixed
는 무적이 아니다.
부모요소에서 scale()을 써버리면 위치가 바뀌게 된다.
만약 position:fiexed
를 사용했는데 원하는 위치가 보이지 않으면 scale()과같은 요소가 주변에 있는지 확인해보자.
position
을 사용할때는 부모 혹은 그 상위 요소에 position
이 존재하는지를 확인해야한다. 참고로 position
의 기본값은 staticdlek.
position:sticky
를 사용할때는 top,bottom,left,right 요소중에 하나를 무조건 작성해야한다.
white-space: nowrap
을 사용해서 지정된 너비이상의 텍스트가 삐져나오게 만듦overflow:hidden
을 사용해서 삐져나온 부분을 보이지 않게 설정text-overflow: ellipsis
를 사용해서 ...을 추가함contain은 이미지를 부모 요소중 좁은 너비에 맞추고, cover는 이미지를 부모요소중 넓은 너비에 맞춘다.
만약 3개의 아이템을 작성하고 각각 margin 값을 20px씩 하면 위 아래같의 여백은 40px로 늘어날까?
아래의 결과를 보면 그게 아니다!
그런데 재미있는건,
다음 경우는 좀 다르다.
해결 방법은 부모요소에 border
를 추가해서 서로 부딪치지 않게만 해주면 위쪽의 여백이 생기지 않게 된다!