n = int(input())
info = []
for i in range(n):
age,name = input().split()
age = int(age)
info.append([age, name])
info.sort(key=lambda x: x[0])
for i in info:
print(*i)
lambda 함수를 이용해서 age변수를 기준으로 오름차순으로 정렬하고, age 값이 같다면 인덱스(즉, 여기선 등록순) 순서로 정렬되게 된다. 그리고 출력을 할 때 언패킹을 통해 리스트 요소 값을 출력한다.
n = int(input())
dots = []
for i in range(n):
dots.append(list(map(int, input().split())))
dots = sorted(dots, key=lambda x: (x[1], x[0]))
for i in dots:
print(*i)
n = int(input())
dots = []
for i in range(n):
[x, y] = map(int, input().split())
dots.append([x, y])
for j in range(0, n-1):
curIdx = j
for k in range(j+1, n):
if(dots[curIdx][0] > dots[k][0]):
curIdx = k
if(dots[curIdx][1] > dots[k][1]):
curIdx = k
dots[j][0], dots[curIdx][0] = dots[curIdx][0], dots[j][0]
dots[j][1], dots[curIdx][1] = dots[curIdx][1], dots[j][1]
for i in range(n):
print(dots[i][0], dots[i][1])
: 시간 복잡도가 O(n^2)이라 안될 거 같았는데.. 역시나 시간 초과로 통과하지 못했다.
- 2차 시도
n = int(input())
dots = []
for i in range(n):
dots.append(list(map(int, input().split())))
dots = sorted(dots, key=lambda x: (x[0], x[1]))
for i in dots:
print(*i)
: 구글링을 통해 다른 사람들이 한 풀이를 참고했다. 일단 모르는 개념들이 많아서 이해하는데 어려움이 있었는데, 개념을 알고 나니 정말 간단하게 구현을 할 수 있다는 것을 알았다.
1) sorted(iterable, *, key=None, reverse=False)
: 첫 번째 인자로 정렬하고자 하는 반복 가능한 자료형을 넣는다. key인자의 값으로 함수를 넣어주면 함수의 반환 값을 기준으로 정렬을 해준다. 마지막 인자를 True로 하면 내림차순으로 정렬을 하게 된다.
2) lambda 함수
: 익명 함수를 만들 때 사용하며, 재사용이 되지 않는 간단하게 사용하는 함수이다. 함수명을 쓰지 않고 'lambda 인자 : 표현식' 형태로 사용하고 리턴 값을 보낸다.
function solution(bridge_length, weight, truck_weights) {
var answer = 0;
var queue = []; // 현재 다리 위 트럭 상태
var que_weight = 0; // 현재 다리 위 무게
while (truck_weights.length != 0) {
answer += 1;
if (queue.length === bridge_length) { // 다리 길이 만큼 요소가 찼다면, 마지막 요소 빼냄
que_weight -= queue.pop();
}
if (que_weight + truck_weights[0] <= weight) { // 다리 무게가 여유 있을 때
var next_tk = truck_weights.shift();
queue.unshift(next_tk); //앞쪽 트럭을 다리에 올림
que_weight += next_tk; // 다리 위 트럭 무게 더해줌
} else {
queue.unshift(0); // 무게 여유가 없다면 0을 채워 넣음.
}
if (truck_weights.length === 0) { // 마지막 트럭이 들어갔을 때
answer += bridge_length; // 초를 다리 길이만큼 더해주고 종료!
break;
}
}
return answer;
}
arr.shift()
배열에서 첫 번째 요소를 제거하고, 제거된 요소를 반환한다. 빈 배열의 경우 undefined를 반환한다.
function solution(clothes) {
var answer = 1;
var obj = {};
for(var i=0; i < clothes.length; i++){
if(obj[clothes[i][1]] >= 1){
obj[clothes[i][1]] += 1; // 객체에 이미 같은 키값이 있다면 +1을 해준다.
}else{
obj[clothes[i][1]] = 1; // 새로운 종류의 옷(키값)이라면 1로 만든다.
}
}
for (var key in obj){
answer *= (obj[key]+1); // 각 옷 종류마다 안입는 경우를 포함
}
return answer - 1; // 전체 경우의 수에서 모두 안입는 경우 제외
}
이 문제에서 각 옷 종류마다 안 입는 경우가 있기에, +1씩 한 값들을 곱해주면 모든 경우의 수가 만들어진다.
여기서 answer-1을 하는 이유는 문제에서 옷을 무조건 하나는 입고 있다고 나오기 때문에, 모든 경우의 수에서 아무것도 입지 않는 경우의 수 1을 빼주는 것이다.
clothes.reduce(function,{}) 최초 값을 빈 객체로 생성하여 clothes를 순차적으로 키값(t [1]) 검색
undefined는 논리연산에서 false이므로 해당 키의 값이 undefined이면 해당 키값에 1을 넣어줌.
키의 값이 존재한다면 해당 값에 +1을 해줌.
이렇게 생성된 Key와 Value를 Object.values를 통해 값만 불러오도록 함.
reduce(function,1) 최초 값을 1로 설정하고 배열을 순차적으로 돌며 이전 값에 (해당 옷 종류의 개수)+1(옷을 입지 않은 경우)를 곱함.
모든 옷을 입지 않은 경우 제외 -1 후 return.
reduce() 함수
사용법 : arr.reduce(callback[, initialValue])
reduce()는 빈 요소를 제외하고 배열 내에 존재하는 각 요소에 대해 callback 함수를 한 번씩 실행하는데, 콜백 함수는 다음의 네 인수를 받는다.
accumulator
currentValue
currentIndex
array
만약 reduce() 함수 호출에서 initialValue를 제공한 경우, accumulator는 initialValue와 같고 currentValue는 배열의 첫 번째 값과 같다.initialValue를 제공하지 않았다면, accumulator는 배열의 첫 번째 값과 같고 currentValue는 두 번째와 같다.