[프로그래머스/Java] PCCP 기출문제 3번 : 충돌 위험 찾기
·
알고리즘
📝 문제 이름사용 언어 : Java 🔗 https://school.programmers.co.kr/learn/courses/30/lessons/340211?language=java 프로그래머스SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 🔎 문제 설명 ✅ 풀이진짜 진짜 오래 걸렸던 문제였다.. BFS 비스무리하게 써야한다는 것은 알겠는데, 충돌 지점을 어떻게 체크할 것이고 충돌 지점을 체크할 때 같은 지점은 1번만 카운팅해야 하는데 이 부분을 어떻게 구현할 것인지 고민을 많이 헀던 문제다..코테 문제를 풀다가 오래걸리게 되면 어느정도 다른 사람의 코드나 반례 들을 찾아보곤 하는데 이 문제는 풀릴듯 말듯 오기..
[백준/Java] #1377 버블 소트
·
알고리즘
📝 문제 이름사용 언어 : Java레벨 : 골드 2 🔗 https://www.acmicpc.net/problem/1377 🔎 문제 설명 ✅ 풀이일단 처음에 문제를 정확히 이해를 못했었는데 여러 번 읽고 보니까 버블 정렬의 swap이 한 번도 일어나지 않은 루프가 언제인지 찾는 문제였다. 그래서 그냥 버블 정렬을 사용하면 되는거 아닌가? 라고 생각했으나 시간 제한 2초에 N의 최댓값은 500,000이기 때문에 시간초과로 풀 수 없고 다른 방법을 사용해야 했다. 안쪽 for 문이 실행되지 않는 순간 = swap이 발생하지 않았다 = 정렬이 완료됐다 라는 뜻이고, 나는 이 정렬 완료 시점을 찾아야 하는 것이다. 그러기 위해서는 정렬 전 인덱스와 정렬 후 인덱스가 필요한데 이 두 인덱스를 비교해서 각 데이..
[백준/Java] #12891 DNA 비밀번호
·
알고리즘
📝 DNA 비밀번호사용 언어 : Java레벨 : 실버 2 🔗 https://www.acmicpc.net/problem/12891 🔎 문제 설명 ✅ 풀이투 포인터와 비슷하게 풀면 되는 문제였다. 나는 HashMap 을 이용해서 inputCnt 에는 필요한 문자의 개수들을 넣어줬고, pwCnt 에는 부분 문자열에서 각 문자의 개수를 넣어줘서 풀었다! 처음에 들어올 때 A, C, G, T의 필요한 문자의 개수가 0이라면 cnt (필요한 문자의 개수와 부분 문자열의 문자 개수가 같은 개수를 카운팅하는 변수) 를 늘려주었다.일단 add() 메서드와 remove() 메서드를 작성했는데, add에서는 내 문자 map인 pwCnt 에서 입력받은 문자의 카운팅을 하나 늘려주고, 만약 하나 늘린 값이 inputCnt..
[백준/Java] #10986 나머지 합
·
알고리즘
📝 나머지 합사용 언어 : Java레벨 : 골드 3 🔗 https://www.acmicpc.net/problem/10986 🔎 문제 설명 ✅ 풀이문제를 읽어봤을 때는 간단한 문제인 것 같았다. 하지만 N의 최댓값은 10^6 개 이고 각 구간의 합들을 구해야 하기 때문에 1초 안에 연산하기는 쉽지 않다. 결국 다른 방법을 써야한다는 것인데 이 문제에는  구간 합 공식을 적용해서 풀면 빠르게 풀 수 있다. 구간 합에 대해서는 저번에 구간 합 구하기 문제들을 풀었을 때 적어 놓았다.https://gureumi74.tistory.com/65 [백준/Java] #11659 구간 합 구하기 4, #11660 구간 합 구하기 5구간 합 구하기 4사용 언어 : Java레벨 : 실버3📎https://www.acm..
[Java] 정적 멤버와 static
·
Java
1️⃣ 정적 멤버 선언정적 멤버(static)는 클래스에 속하는 멤버로 인스턴스가 아닌 클래스 자체에 소속된다.정적 변수 : static으로 선언된 변수는 클래스의 모든 인스턴스가 공유하며, 프로그램 종료 시까지 유지된다.정적 메서드 : static으로 선언된 메서드는 클래스 이름으로 호출하며, 객체 생성 없이 사용할 수 있다.public class 클래스 { // 정적 필드 static 타입 필드 [= 초기값]; // 정적 메소드 static 리턴 타입 메소드(매개변수 선언, ...) [...]} 🔍 정적 변수 사용 판단 기준 : 객체마다 개별적으로 관리해야 하는 데이터라면 인스턴스 필드로 선언모든 객체가 공유해야 하는 데이터라면 정적 필드로 선언 🔍 정적 메서드 사용 판단 ..
[TIL] SOLID 원칙 정리
·
TIL
SOLID 원칙은 객체지향 설계에서 코드의 유연성, 확장성, 유지보수성을 높이기 위한 5가지 핵심 원칙이다.이 원칙들을 이해하고 실천하면 코드의 품질과 협업 효율을 높일 수 있다. 1️⃣ SRP (Single Responsibiliry Principle, 단일 책임 원칙)클래스는 하나의 책임만 가져야 한다.한 가지 역할만 수행하는 클래스가 이상적한 클래스가 너무 많은 책임을 가지면 코드 변경 시 의도치 않은 영향을 줄 위험이 크다. 🚧 잘못된 설계public class UserManager { public void createUser() { // 사용자 생성 } public void validateUser() { // 사용자 검증 } p..
[TIL] 객체지향 프로그래밍(OOP) 이란? (캡슐화, 상속, 다형성, 추상화)
·
TIL
📖 객체지향 프로그래밍 (OOP) 이란?객체지향 프로그래밍(OOP)은 코드의 유지보수성과 재사용성을 높이기 위해 데이터를 객체로 묶고, 이 객체들 간의 상호작용으로 프로그램을 설계하는 기법이다.OOP 는 대규모 소프트웨어 개발과 유지보수에 특히 유용하며, 복잡한 문제를 단순하게 구조화할 수 있게 도와준다. ❓ OOP 가 필요한 이유1. 코드 분류복잡한 코드를 체계적으로 정리하고 관리하기 쉽게 만든다.모듈화된 코드로 개발 속도를 향상2. 코드 교체 용이성시스템 변경 및 확장이 쉽다.특정 기능이나 모듈을 독립적으로 교체 가능3. 유지보수성변경 및 수정 시 다른 코드에 영향을 덜 미친다.스파게티 코드 방지 🌟 OOP 의 핵심 개념 (4대 특징) 1️⃣ 캡슐화 (Encapsulation)캡슐화란 데이터를 외..
[컴퓨터 구조] CISC와 RISC
·
CS
1. 명령어 집합, 명령어 집합 구조 (ISA: Instruction Set Architecture)CPU가 이해할 수 있는 명령어들의 모음CPU마다 다를 수 있고 ISA가 달라지면 같은 소스 코드로 만들어진 프로그램도 서로 다른 어셈블리어를 사용이로 인해 ISA가 다르면 명령어 해석 방식, 레지스터 종류, 메모리 관리 방법 등이 달라진다.ISA는 CPU의 언어이자 하드웨어가 소프트웨어를 어떻게 이해할지에 대한 약속 2. CISC (Complex Instruction Set Computer)복잡하고 다양한 명령어 집합을 사용하는 CPU 설계 방식대표적인 예 : x86, x86-64 아키텍처특징 :가변 길이 명령어 : 명령어가 길고 복잡하여 실행 시간이 일정하지 않다.적은 수의 명령어로 프로그램 실행 가능..
[컴퓨터 구조] 명령어 병렬 처리 기법 (명령어 파이프라이닝, 슈퍼스칼라, 비순차적 명령어 처리 기법)
·
CS
빠른 CPU를 만들기 위해서는 높은 클럭 속도, 멀티코어 (Multicore), 멀티스레드 (Multithreading) 외에도 CPU가 효율적으로 작업을 수행하도록 하는 명령어 병렬 처리 기법이 중요하다. 이를 통해 CPU는 대기 시간을 줄이고 효율적인 연산을 할 수 있다. 1. 명령어 파이프라이닝 (Instruction Pipelining)CPU의 명령어 처리 과정에서 각 단계를 분리하여 명령어 파이프라인 (Instruction Pipeline) 에 넣어 동시에 처리할 수 있도록 하는 기법일반적인 명령어 처리 과정 :명령어 인출 (Instruction Fetch)명령어 해석 (Instruction Decode)명령어 실행 (Instruction Execute)결과 저장 (Write Back) t0t1..
[컴퓨터 구조] 빠른 CPU를 위한 설계 기법 (클럭, 코어, 멀티코어, 스레드, 멀티스레드)
·
CS
1. 클럭 (Clock)클럭 (Clock) : CPU 동작을 동기화하는 신호로, CPU 성능에 큰 영향을 미친다.클럭 속도 : CPU의 성능을 나타내는 주요 지표로, 단위는 헤르츠(Hz)1초에 명령어를 몇 번 실행할 수 있는지 나타낸다.클럭 속도가 높을수록 일반적으로 CPU의 처리 속도가 빠르다.동적 클럭 조절 : CPU는 상황에 따라 클럭 속도를 조정성능이 필요한 경우 클럭 속도를 높이고, 필요하지 않을 때는 낮춰 효율성을 높임오버클럭킹 (overclocking) : 최대 클럭 속도를 높여 성능을 향상시키는 기법이지만 발열과 안정성 문제가 발생할 수 있다.한계 : 클럭 속도를 올리는 것만으로는 CPU 성능 향상에 한계가 있으며, 발열 문제가 있을 수 있다. 2. 코어와 멀티코어코어 (Core) : 명령..
[컴퓨터 구조] CPU의 작동 원리
·
CS
1. ALU와 제어장치 1.1 ALUALU의 역할 : 산술 연산(덧셈, 뺄셈 등)과 논리 연산(AND, OR 등)을 수행하는 CPU의 주요 구성 요소ALU가 작동하는 과정 :입력 : 레지스터로부터 피연산자를 받아들인다.명령 : 제어장치로부터 연산 종류를 나타내는 제어 신호를 받아들인다.결과 저장 : 계산 결과를 다시 레지스터에 저장ALU의 특징 :메모리 접근보다 레지스터 접근 속도가 훨씬 빠르다.연산 결과 외에도 플래그를 생성하여 추가적인 상태 정보를 제공플래그 (Flag) : 연산 결과에 대한 추가 정보를 담는 값으로 플래그는 플래그 레지스터에 저장된다.ALU 내부 주요 구성 요소 :가산기 : 덧셈 연산 수행보수기 : 뺄셈 연산 수행 (2의 보수 활용)시프터(Shifter) : 비트 이동 연산 수행오버..
[컴퓨터 구조] 명령어의 구조와 오퍼랜드 필드의 주소 지정 방식
·
CS
연산 코드와 오퍼랜드명령어는 연산 코드와 오퍼랜드로 구성연산 코드 필드 (분홍색 필드) : 명령어가 수행할 연산인 연산 코드 (Operation Code), 연산자오퍼랜드 필드 (흰색 필드) : 연산에 사용할 데이터 또는 사용할 데이터의 저장된 위치를 나타내는 오퍼랜드(Operand), 피연산자 연산 코드 유형데이터 전송산술/논리 연산제어 흐름 변경입출력 제어 더보기데이터 전송- MOVE : 데이터 옮기기- STORE : 메모리에 저장- LOAD (FETCH) : 메모리에서 CPU로 데이터 가져오기- PUSH : 스택에 데이터 저장- POP : 스택의 최상단 데이터 꺼내기 산술/논리 연산- ADD/SUBTRACT/MULTIPLY/DIVIDE : 덧셈 / 뺄셈 / 곱셈 / 나눗셈- INCREMENT/DEC..