_

Always be tactful

728x90

전체 글 69

[Java] Scanner, BufferedReader

Scanner와 BufferedReader는 입력을 읽는 데 사용되는 클래스이다. 실제로 두 클래스 모두 내부적으로 버퍼링을 사용하여 데이터를 처리한다. 그러나 둘 사이에는 명확한 차이점이 존재하는데, 바로 입력 방식과 성능이다. 핵심은 이러한 차이점으로 인하여 각각의 사용 용도가 어느 정도 정해져 있다는 것인데, 본 포스팅에서는 두 클래스 간의 차이점을 비교 분석해보려고 한다.주요 특징 비교[Scanner]  Scanner는 다양한 자료형을 쉽게 처리하는 클래스이다. 이에 따라 다양한 메서드가 존재하는데, 예를 들어 nextLine()은 한 줄을 읽고, nextInt(), nextDouble()은 각각 정수와 실수 형식으로 입력을 받는다.  이렇듯 Scanner는 굉장히 좋아 보이지만 치명적인 단점이 ..

[Java] if 문, switch 문, 삼항 연산자

if 문String grade = "A";int bonus;if (grade == "A") { bonus = 1000000;} else if (grade == "B") { bonus = 800000;} else if (grade == "C") { bonus = 500000;} else { bonus = 0;} if 문은 가장 기본적인 제어문이다. 그렇기에 사실상 if 문만 쓰더라도 문제 될 것은 없다. 그러나 특정 상황에서는 if 문보다 가독성이 더 높은 switch 문을 선호한다.switch 문String grade = "A";int bonus;switch (grade) { case "A": bonus = 1000000; break; case "..

[Java] 객체의 실제 메모리 주소 얻기

안타깝게도 자바에서 객체의 실제 메모리 주소를 직접적으로 얻는 것은 불가능하다.  일단 자바는 가비지 컬렉션을 사용한다. 자바 가상 머신과 가비지 컬렉터가 메모리 관리와 객체 생명주기를 처리한다. 그렇기에 자바에서는 메모리 주소를 숨기고 객체에 대한 참조만을 제공한다. (애초에 설계부터 객체의 메모리 주소나 포인터를 프로그램에서 접근할 수 없도록 설계했다는 말이다.)참조 예시String str1 = new String("funczun");String str2 = str1; // str2가 str1을 참조 * str1, str2 모두 같은 객체를 참조하고 있지만, 메모리 주소에 직접 접근하지 않고 참조 변수를 통해 객체를 사용한다.가비지 컬렉션 (Garbage Collection)  가비지 컬렉션은 메모리..

[Java] ==, equals() /문자열 비교 정복하기

내가 파이썬만을 고집했다면 평생 들지 않았을 의문 중 하나이다. 왜 자바에서는 문자열을 비교할 때, equals() 메서드를 사용해야 하는가?자바에서 문자열 비교 시, == 또는!= 연산자를 쓴다면 어떻게 되는가? 이에 대해 명쾌하게 답할 수 없다면 본 게시물을 읽을 가치가 있다.String은 객체 타입인 '클래스'이다.String str1 = new String("funczun");String str2 = new String("funczun"); 우선 클래스답게 문자열 두 개를 생성해보았다.System.out.println(str1 == str2); // false 두 문자열을 == 연산자를 통해 비교하니 false가 출력되었다. 분명 str1, str2 모두 "funczun"으로 동일한데 false로..

[Java] 주요 연산자 알아보기

// 몫 반환int num1 = 5, num2 = 2;System.out.println(num1 / num2);// 변수 추가 선언int newNum = 0;// 전위 증감 연산자num1 = 0;newNum = ++num1;System.out.println("newNum = " + newNum + ", num1 = " + num1);// 후위 증감 연산자num1 = 0;newNum = num1++;System.out.println("newNum = " + newNum + ", num1 = " + num1);// 비교 연산자int a = 1;float b = 0.1f;double c = 0.1;System.out.println(a + b == 1.1);System.out.println(a + c == 1...

[Java] 기본 변수 한 장 정리

byte b = 127;// 1byte (2^8): -128 ~ 127short s = 32767;// 2byte (2^16): -32,768 ~ 32,767int i = 2147483647;// 4byte (2^32): -2,147,483,648 ~ 2,147,483,647long l = 9223372036854775807L;// 8byte (2^64): -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807float f = 3.14f;// 4byte (2^32): 대략 -3.4E38 ~ 3.4E38 (7자리 정밀도)double d = 3.14;// 8byte (2^64): 대략 -1.7E308 ~ 1.7E308 (15자리 정밀도)boolean bool = t..

[Java] 향상된 for 문

향상된 for 문은 주로 배열 또는 컬렉션 객체의 요소들을 쉽게 순회하기 위해 사용된다. Java 5에서 도입된 구문으로, 앞으로 쓰일 일이 많으니 잘 기억해 두자.향상된 for 문 기본 문법for (타입 변수 : 배열) { // 반복할 코드} 굳이 표현식을 적자면 이렇다만, 그냥 예시를 보는 편이 훨씬 낫다.전통적인 for 문과의 차이점String[] names = {"Alex", "Brian", "Chris"};// 전통적인 for 문for (int i = 0; i  위 코드는 우리가 흔히 알고 있는 전통적인 방식의 for 문이다. 변수 i를 통해 반복 횟수를 지정하고, 인덱싱을 통해 이름들을 출력하고 있다.String[] names = {"Alex", "Brian", "Chris"};// 향상..

[CS] 1.1 + 0.1 != 1.2인 이유

컴퓨터에서 실수는 어떻게 저장될까? 컴퓨터는 모든 정보를 2진수로 표현한다. 실수 역시 2진수로 표현해 RAM에 저장하게 되는데, 이 과정에서 실수 값 일부가 손실되어 정확한 값이 아닌 근삿값을 저장하게 된다.  예를 들어, 0.1을 2진수로 표현하면 0.00011001100110011...이라는 무한소수가 된다. 숫자 하나를 저장하는 bit는 통상적으로 32비트이므로 뒷부분이 잘려나가게 되고, 이로 인해 오차가 발생하여 실제로 저장되는 값은 0.10000000000000000555...가 되어 미세한 오차를 발생시킨다. ▶ 자료형 double을 활용하자. C언어라면 double 자료형을 활용해서 숫자 하나당 64비트를 배정하여 오차를 급격하게 줄일 수 있지만 메모리 용량이 2배가 필요하다는 단점이 있다..

[IntelliJ] Ctrl + Shift + F10, Run 단축키 안 될 때

문제 상황 인텔리제이 사용 중, 실행 단축키를 눌러도 실행되지 않는다. 단축키 설정 상태를 보아도, Ctrl + Shift + F10으로 잘 설정되어 있다.해결법 원인은 '한/영' 키다. 운영체제에 따라 같은 키 조합을 사용하도록 설정되어 있으면 충돌이 발생한다. '한/영' 키를 눌러서 영어 입력기로 전환 후 다시 시도하자.

[Python] 리스트를 뒤집는 방법 세 가지

리스트를 뒤집는 3가지 방법 [::-1] 리스트를 역순으로 슬라이싱 하는 방법이다. 새로운 리스트를 만들 필요 없이 기존의 리스트를 뒤집어 반환한다. 하지만 슬라이싱을 활용해 뒤집는 경우 리스트의 크기가 매우 크다면 메모리를 필요 이상으로 낭비하게 될 수 있다. reverse() 원본 리스트를 직접 뒤집기 때문에 메모리 사용량이 적다. 하지만 원본 리스트가 변경되기 때문에 원본 리스트를 유지하고 싶다면 사용하지 않아야 한다. reversed() 반환하는 값이 iterator이기 때문에 원본 리스트가 바뀌지 않으면서 메모리 사용량이 적다. 하지만 바로 사용할 수는 없어 list()를 통해 리스트 형태로 변환 후 사용하게 된다.결론 원본 리스트를 변경해도 상관 없는 경우 → reverse() 원본 리스트를 ..

[Python] 파이썬의 전달 방식은 값 전달? 참조 전달?

파이썬의 전달 방식 정답부터 말하자면, 파이썬의 전달 방식은 call by assignment이다. 다르게는 call by object-reference 또는 call by sharing이라고 부르기도 한다. 모두 같은 의미로, 파이썬에서는 함수 호출 시 인자를 객체에 대한 참조로 전달한다는 것이다.  이해를 돕기 위해 예시를 들자면, int나 str 같은 데이터 타입의 경우 불변 객체이기 때문에 함수 내에서 값을 변경하려 해도 원래 객체에는 영향을 미치지 않게 된다. 반면, list나 set 같은 가변 객체의 경우 함수 내에서 변경을 시도하면 원래 객체도 변경된다. 즉, call by value와 call by reference가 혼합된 형태라고 이해하면 된다.객체 참조 전달 방식불변 객체 → call..

[GitHub] 최근 커밋 완전히 삭제하기

모든 과정은 터미널을 열어 Git 명령어를 입력함으로써 진행됩니다. 로컬 저장소에서 커밋 삭제하는 방법부터 원격 저장소에 반영하기까지의 내용입니다.커밋만 삭제하고 변경 사항 유지git reset HEAD^ 최근 1개의 커밋을 삭제git reset HEAD~n 최근 n개의 커밋을 삭제 커밋과 변경 사항 모두 삭제git reset --hard HEAD^ 최근 1개의 커밋을 삭제 git reset --hard HEAD~n 최근 n개의 커밋을 삭제 브랜치 확인 및 원격 저장소 반영git branch 현재 작업 중인 브랜치 이름을 모른다면 위 Git 명령어를 통해 확인하실 수 있습니다.git push origin main --force 만약 main 브랜치가 아니라면 main 대신 해당 브랜치 이름을 입력해 주시..

[DS] 스택, 큐, 덱

자료구조의 일종, 각기 다른 방식으로 데이터를 저장하고 관리 스택[정의] 데이터를 차곡차곡 쌓는다는 의미인 스택은 top을 통해서만 접근이 가능하기 때문에 push와 pop 모두 top에서 이루어진다. 마지막에 추가된 데이터가 가장 먼저 제거되는 후입선출(後入先出) 구조를 따른다. 물론 프로그래밍 언어와 구현에 따라 서로 다른 자료형을 혼합하는 경우도 있을 수 있지만, 일반적으로는 동일한 자료형으로 구성된다. 그래야 안정성이 보장되기 때문이다. [장점] 스택은 리스트로 구현되어 있다. 각 요소가 배열의 끝에 추가되며, 필요할 때에만 메모리가 할당되어 메모리 사용이 효율적이다. 재귀 함수 호출 시에도 스택 특유의 후입선출 구조가 자연스러운 관리를 유도한다.▲ 구현이 간단하고 메모리 사용이 효율적이다.▲ 함..

[Python] 백준 11718번: EOFError가 발생하지 않는다고?

sys.stdin.readline()은 빈 문자열을 반환한다!import syswhile True: try: userInput = sys.stdin.readline().strip() print(userInput) except: break EOFError(End of File)는 파일의 끝, 즉 입력의 끝을 의미한다. input()은 파일의 끝에서 EOFError를 발생시키지만, sys.stdin.readline()은 빈 문자열을 반환하므로 EOFError를 발생시키지 않는다. 따라서 출력 초과로 인한 오답 처리가 되는 것이다.while True: try: print(input()) except: break 물론 이렇게 간..

[Python] 시간 복잡도: 문자열 결합 연산 쓰지 마!

시간 복잡도 프로그래밍 언어에서 시간복잡도란 입력의 크기(N)에 따라 알고리즘이 얼마나 많은 "시간"을 소모하는지를 나타내는 척도이다. 표기법은 다양하나, 일반적으로는 O(1), O(n), O(log n), O(n^2) 등의 표기법을 사용한다.실제 코드 시간 복잡도 분석import sysN = int(sys.stdin.readline())result = ""for i in range(N // 4): result += "long "result += "int"print(result) 백준 25314번 문항을 풀며 실제 내가 제출한 코드로, 입력값 N에 따라 "long "을 N // 4번 반복해서 결과 문자열에 추가한 후, 마지막에 "int"를 붙여서 출력하는 프로그램이다. 다음은 코드를 쪼개어 각 코드..

[Python] 백준 2675번: 이스케이프 문자 처리

이스케이프 문자 이스케이프 문자는 문자열 내에서 특별한 역할을 한다. 그리고 일반적으로 백슬래시(\)가 이스케이프 문자로 쓰인다. 이스케이프 문자는 바로 뒤에 오는 문자와 조합하여 다양한 특수 기능을 하기 때문에 취급에 주의해야 한다.이스케이프 시퀀스\n줄 바꿈\t탭\\백슬래시\'작은따옴표\"큰따옴표디버깅을 통해 이스케이프 문자 처리 확인하기 \uXXXX는 유니코드 이스케이프 시퀀스다. 따라서 \u03B1은 그리스 문자 α를 나타낸다. 문자열로 변수 test1에 할당한 경우 'α'가 할당되었으며, 원시 문자열로 변수 test2에 할당한 경우 '\\u03B1'가 할당된 것을 확인해 볼 수 있다. 참고로 원시 문자열이라고 함은 문자열 앞에 r을 붙여 표시한 것을 말한다.  디버깅을 해보며 알게 된 사실은 내..

[Python] 연결리스트: 노드가 주소를 가리킨다고?

노드 연결리스트에서 노드는 데이터의 한 단위를 의미한다. 각 노드는 메모리에서 별도의 위치를 차지하기 때문에 노드마다 고유한 메모리 주소가 할당되어 있다. 노드의 구조를 살펴보면 해당 노드가 저장한 데이터와 다음 노드를 가리키는 포인터(next) 요소를 찾아볼 수 있다.class Node: def __init__(self, data): self.data = data self.next = None 노드 생성 왼쪽 노드의 메모리 주소가 "1202243114115"이고 오른쪽 노드의 메모리 주소가 "1202243112121"이라고 가정하자. "zun"이라는 데이터를 지닌 왼쪽 노드의 포인터가 오른쪽 노드의 메모리 주소인 "1202243112121"를 저장한다면 어떨까? 두 노드가..

[Python] 백준 10809번: find()는 인덱스만 반환하는가?

문제 알파벳 소문자로만 이루어진 단어 S가 주어진다. 각각의 알파벳에 대해서, 단어에 포함되어 있는 경우에는 처음 등장하는 위치를, 포함되어 있지 않은 경우에는 -1을 출력하는 프로그램을 작성하시오. 입력 첫째 줄에 단어 S가 주어진다. 단어의 길이는 100을 넘지 않으며, 알파벳 소문자로만 이루어져 있다.baekjoon 출력 각각의 알파벳에 대해서, a가 처음 등장하는 위치, b가 처음 등장하는 위치, ... z가 처음 등장하는 위치를 공백으로 구분해서 출력한다. 만약, 어떤 알파벳이 단어에 포함되어 있지 않다면 -1을 출력한다. 단어의 첫 번째 글자는 0번째 위치이고, 두 번째 글자는 1번째 위치이다.1 0 -1 -1 2 -1 -1 -1 -1 4 3 -1 -1 7 5 -1 -1 -1 -1 -1 -1 ..

[Python] BOJ 10809: Does the find() return only the index?

Problem You are given a word S composed only of lowercase letters. For each letter of the alphabet, output the position of its first occurrence in the word if it is present; if it is not present, output -1. Input The first line contains the word S. The length of the word does not exceed 100, and it consists only of lowercase letters.baekjoon Output For each letter of the alphabet, output the pos..

[Python] 배열: 인덱스의 시작은 0인가, 1인가?

배열 배열은 여러 개의 요소를 저장할 수 있는 일종의 자료구조이다. 연결된 빈칸 위의 숫자는 각각의 인덱스를 뜻하며, 우리가 흔히 알고 있는 모든 프로그래밍 언어에서 배열의 인덱스는 0부터 시작한다. 슬라이싱의 경우 마지막 인덱스에 해당하는 값은 결과에서 제외시킨다. 이해를 돕기 위해 이를 인덱싱의 "이상:미만 규칙"이라고 표현하겠다.  이러한 "이상:미만 규칙"으로 작동하는 이유는 가장 효과적이기 때문이다. 일단, 시작 인덱스를 포함하는 "이상" 구조가 시작 숫자를 직관적으로 표현해 범위의 시작을 명확히 한다. 이어서, 끝 인덱스를 포함하지 않는 "미만" 구조는 시퀀스의 연속을 표현하기 위해 불가피하면서도, 시퀀스의 길이를 직관적으로 알아낼 수 있도록 만드는 장점을 지닌다. 배열의 인덱스가 1이 아닌 ..

728x90