import java.util.Arrays;
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int[] arr = new int[N];
for(int i=0; i < arr.length; i++){
arr[i] = sc.nextInt();
}
Arrays.sort(arr);
System.out.print(arr[0] + " " + arr[N-1]);
sc.close();
}
}
💡 Arrays.sort()
: 배열에 저장된 원소 값을 오름차순으로 정렬해주는 메서드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int[] arr = new int[N];
for(int i=0; i < N; i++){
arr[i] = Integer.parseInt(st.nextToken());
}
int min = arr[0];
int max = arr[0];
for(int j=0; j < arr.length; j++){
if(arr[j] > max) max = arr[j];
if(arr[j] < min) min = arr[j];
}
System.out.println(min + " " + max);
br.close();
}
}
→ 배열의 원소 정렬에서 최악의 경우 시간복잡도가 N^2
→ 배열을 사용하지 않고, 입력받은 문자를 즉시 비교하여 시간 단축
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Integer.parseInt(br.readLine()); // N은 사용하지 않기 때문에 입력만 받음
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int max = -1000000;
int min = 1000000;
while(st.hasMoreTokens()){
int value = Integer.parseInt(st.nextToken());
if(value > max) max = value;
if(value < min) min = value;
}
System.out.print(min + " " + max);
br.close();
}
}
💡 hasMoreTokens()
→ StringTokenizer에 토큰이 남아있으면 true, 비어있으면 false를 반환해주는 메서드
const input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');
const N = Number(input[0]);
const arr = input[1].split(" ").map(Number);
let min = arr[0];
let max = arr[0];
for(let i=0; i < arr.length; i++){
if(arr[i] < min){
min = arr[i];
}
if(arr[i] > max){
max = arr[i];
}
}
console.log(min + " " + max); // console.log(`${min} ${max}`);
const input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');
const N = Number(input[0]);
const arr = input[1].split(" ").map(Number);
// arr.sort((a, b) => a - b);
arr.sort(function(a, b) {
return a - b;
});
console.log(arr[0], arr[N-1]);
💡 sort() 함수 : 배열 안의 원소를 정렬하는 자바스크립트 배열의 내장 함수
Array객체.sort(요소 순서를 결정하는 데 사용되는 함수명)
→ 함수명 생략할 시 ASCII 문자 순서의 오름차순으로 정렬됨var nums = [4, 11, 2, 10, 3, 1]; /* 오류 */ nums.sort(); // 1, 10, 11, 2, 3, 4 // ASCII 문자 순서로 정렬되어 실제 숫자의 크기 순서대로 나오지 않음 /* 정상 동작 */ nums.sort(function(a, b) { // 오름차순 return a - b; // 1, 2, 3, 4, 10, 11 }); nums.sort(function(a, b) { // 내림차순 return b - a; // 11, 10, 4, 3, 2, 1 });
💡 화살표 함수(Arrow Function)
- JavaScript ES6에서 도입된 새로운 함수 선언 방식
- 기존의 함수 표현식보다 간결하고 가독성이 높음
- 함수 선언을 위한 키워드 function 대신 화살표
=>
를 사용하여 함수 선언- 중괄호({})로 함수 내용을 감싸지 않고 단일 표현식을 사용할 경우,
자동으로 해당 표현식의 결과를 반환 (return 키워드 생략 가능)- Lexical this : 일반 함수에서의 this는 호출 문맥에 따라 동적으로 결정되지만 Arrow Function에서는 함수가 생성될 때의 스코프에서 this를 캡처함
// 기존 함수 선언 방식 function add(a, b) { return a + b; } // Arrow Function 선언 방식 const add = (a, b) => a + b; // Lexical `this` 예시 const person = { name: 'John', sayHello: function() { setTimeout(function() { console.log(`Hello, ${this.name}`); // 여기서의 this는 전역 객체(window 또는 undefined)를 가리킴 }, 1000); }, sayHelloArrow: function() { setTimeout(() => { console.log(`Hello, ${this.name}`); // Arrow Function을 사용하면 상위 스코프인 person 객체의 this를 캡처하여 사용 }, 1000); } }; person.sayHello(); // "Hello, undefined" (전역 객체가 this로 사용됨) person.sayHelloArrow(); // "Hello, John" (person 객체가 this로 사용됨)
- 매개 변수 표현
// 매개변수가 없을 경우 () => { ... } // 매개변수가 한 개인 경우, 소괄호 생략 가능 x => { ... } // 매개변수가 여러 개인 경우, 소괄호 생락 불가능 (x, y) => { ... }
- 함수 몸체 표현
// single line block x => { return x * x } // 함수 몸체가 한줄의 구문이라면 중괄호를 생략할 수 있으며 암묵적으로 return됨, 위 표현과 동일함 x => x * x
N = int(input())
arr = list(map(int, input().split()))
print(min(arr), max(arr))
💡 Python의 min(), max() 내장 함수
- 매개 변수에 리스트/객체의 사용이 가능
- min() → 최소값 반환해주는 함수, 값이 문자열이면 알파벳 순서 상 앞에 오는 문자열 반환
- max() → 최대값 반환해주는 함수, 값이 문자열이면 알파벳 순서 상 뒤에 오는 문자열 반환
arr = [1, 2, 3] arr2 = ['가', '나', '다'] print(min(arr)) # 1 print(max(1,2,3)) # 3 print(min(arr2)) # 가 print(max(arr2)) # 다
N = int(input())
arr = list(map(int, input().split()))
arr.sort()
print(arr[0], arr[-1])
💡 List indexing (리스트 인덱싱)
- 파이썬에서 리스트 인덱싱은
-
값(음수 인덱싱)도 허용
→ 값을 역순으로 인덱싱함
ex) 다른 언어에서는 마지막열을 찾기위해 리스트의 길이를 구해서 찾아야 하지만, 파이썬은 -1만으로도 손쉽게 찾을 수 있음
a = [1, 2, 3, 4, 5] # 첫번째 데이터 인덱싱 a[0] # 두번째 데이터 인덱싱 a[1] # 맨 마지막 데이터 인덱싱 a[-1] # 맨 마지막에서 두번째 데이터 인덱싱 a[-2]
💡 List slicing (리스트 슬라이싱)
- 파이썬에서 리스트를 자르는 문법
리스트변수[시작index:종료index:step]
→ 시작index의 원소부터 종료index의 바로 앞 원소까지 step만큼 슬라이싱
→ step은 생략 가능하며, default값은 1임
→ step이 양수일 때 오른쪽으로 step만큼 이동하면서 가져옴
→ step이 음수일 때 왼쪽으로 step만큼 이동하면서 가져옴
- 시작 인덱스부터 끝까지 인덱싱 →
리스트변수[시작index:]
- 처음부터 특정인덱스까지 인덱싱 →
리스트변수[:종료index]
b = ['가', '나', '다', '라', '마'] # index1~2 인덱싱 b[1:3] # ['나', '다'] # index1부터 맨 마지막에서 두번째 데이터까지 인덱싱 b[1:-1] # ['나', '다', '라'] # index3부터 끝까지 인덱싱 b[3:] # ['라', '마'] # 처음부터 index2까지 인덱싱 b[:3] # ['가', '나', '다'] # 2칸씩 이동하면서 가져옴 b[::2] # ['가', '다', '마'] # 전체를 거꾸로 1칸씩 이동하며 가져옴 b[::-1] # ['마', '라', '다', '나', '가']
N = int(input())
arr = list(map(int, input().split()))
min = arr[0]
max = arr[0]
for i in arr :
if i < min :
min = i
elif i > max :
max = i
print(min, max)