일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
- SQL
- 멀티캠퍼스it부트캠프
- 함수
- formula
- Excel
- ES6
- DTO
- JavaScript
- oracle
- DOM
- react
- 노션
- error
- MySQL
- explode()
- Java
- JDBC
- OOP
- php
- 배열
- 정규식
- myshortcut
- 부트캠프후기
- 객체지향
- dao
- 현대이지웰java풀스택개발자아카데미6월
- node.js
- jQuery
- strpos()
- 오류
- Today
- Total
코딩짜는 일상
[현대이지웰 Java 풀스택 개발자 아카데미 6월] TIL 8차 - 알고리즘 입문 본문
📚 서론
이번주는 알고리즘에 대해 손 코딩했던 내용을 정리해보려 합니다.
목표는 자료구조 구현하는거나 디자인 패턴 배운거 가볍게 소개해보려 했는데
아직도 머릿속이 정리가 안 되서 글로 쓸만한 분량이 안 나왔습니다...
단 2주 배웠는데도 생각이 엄청 복잡해지는 수업이었습니다...ㅎㅎ
🎷 변수 A와 B의 자리 바꾸기 (feat. 벤다이어 그램)
변수 A와 B가 있고, 각각 숫자 5와 7이 들어있다고 가정했을 때
코딩으로 값을 이동시켜 두 변수의 값을 바꾸는 문제를 풀어봅시다.
단순히 생각했을 때, 값의 자리를 바꾸기 위해 값을 임시로 저장해둘 변수 C가 필요할 겁니다.
let A = 5;
let B = 7;
let C;
C = A;
A = B;
B = C;
하지만 여기서 변수 C 없이 3번의 단계를 거쳐 자리를 바꾸는 방법도 있습니다!
일단 갑작스럽지만 7과 5를 이진법으로 바꿔보겠습니다.
5 = 0101;
7 = 0111;
컴퓨터 언어는 0과 1의 무수한 조합입니다.
5와 7은 단순 숫자로 보면 닮은점이 하나도 없지만,
이처럼 이진법으로 바꾸게 된다면 0과 1로만 구성되어 공통점이 생깁니다.
그리고 2가지 다른 요소에 공통점이 있다는 개념을 이미지로 풀어내는 방법에는 벤다이어그램이 있습니다.
5와 7의 이진법상 공통분모를 표현하자면 01*1이 되겠습니다.
A만의 고유한 분모를 표현하자면 **0*이 되고
B만의 고유한 분모를 표현하자면 **1*이 되겠죠.
약~간 감이 오셨나요?😉
여기에 힌트를 더 드리자면 비트 단위로 논리 연산을 하는 비트 연산자 중에는
두 변수의 공통분모만을 제하는 XOR 연산자인 ^가 있습니다.
XOR연산으로 A와 B의 합에서 공통분모만 뺀 상태를 만들고
그걸 다시 각각의 변수들에 XOR 연산을 하면 어떨까요?
짜잔! 제 3의 변수를 만들지 않고도 A와 B의 자리를 바꿨습니다! 🥳🎉
🎺 다이아몬드 그리기
그 다음으로 손코딩을 해볼 것은 다이아몬드 그리기 입니다.
사실 전 늘 삼각형 그리기 까지는 자신있게 해놓고
피라미드부터는 머릿속이 새하얗게 되서 한 번도 성공을 못 했답니다...🥲
근데 이번에 강사님이 손코딩 하는 방법을 알려주시니까 이해가 확 되더라구요!
방식은 사용자에게 숫자를 입력받아 그 숫자만큼 피라미드를 쌓고
이후 반전시키는 식으로 다이아몬드를 그려볼 겁니다.
입력받아 쌓는 피라미드 이후로 별 쌓는 방식이 반전되니까 우선은 상 하로 나눠보겠습니다.
i는 층 수, 공백은 말 그대로 공백 수, 별은 *의 갯수입니다.
i는 일정하게 1씩 증가하니까 for문의 조건식으로 쓰기 딱입니다.
1부터 시작하여 1씩 증가해 5 이상이 되면 멈추면 되겠죠.
식으로는 i <= input이 되겠습니다.
공백은 i를 기준으로 봤을 때 입력값에서 i를 뺀 값이 됩니다.
식으로는 input - i가 되겠습니다.
별은 2씩 증가하는데 i를 기준으로 보자면 i에 2를 곱하고 1을 빼면 될 것 같습니다.
식으로는 i * 2 - 1가 되겠습니다.
이번에는 다이아몬드 하단입니다!
i는 상단과 동일하게 1씩 증가하는데 가만보면 입력값의 -1만큼만 반복됩니다.
식으로는 i <= input - 1이 되겠습니다.
공백은 i를 기준으로 보자면 i와 동일합니다.
별의 갯수는 i의 제한선인 input-1에 2를 곱해서 1을 빼면 되겠네요.
식으로는 ((input - 1) * 2) - 1입니다.
이제 이것들을 코드로 바꿔보겠습니다!
import java.util.Scanner;
public class Diamond {
public static void main(String[] args) {
System.out.print("입력 : ");
int input = new Scanner(System.in).nextInt();
for (int i=1; i<=input; i++) {
for (int j=1; j<=input-i; j++) { // 상단 공백
System.out.print(" ");
}
for (int j=1; j<=2*i-1; j++) { // 상단 별
System.out.print("*");
}
System.out.println();
}
for (int i=1; i<=input-1; i++) {
for (int j=1; j<=i; j++) { // 하단 공백
System.out.print(" ");
}
for (int j=1; j<=(input-i)*2-1; j++) { // 하단 별
System.out.print("*");
}
System.out.println();
}
}
}
짠! 이렇게 손으로 풀면 문제가 금방 풀립니다!
이걸 매번 암산으로만 하려고 하니까 하나도 안 풀렸는데
손으로 규칙성을 정리하니까 간단하게 풀리네요...ㅎㅎ🥹
🔥 결론
알고리즘에선 위 2개의 문제풀이처럼 논리에 입각해 코드를 구현하는 걸 목표로 합니다.
이걸 통해서 생각의 틀을 깨고 더 풍부하게 코드를 다각도로 볼 수 있게 해줍니다.
저는 이 이야기 들으면서 문득 콜롬버스 생각이 났습니다.
달걀 바닥을 조금만 깨면 가뿐이 세울 수 있다는 걸 알면 아주 간단한 문제가 되듯이
알고리즘은 문제를 해결할 다양한 논리적 풀이를 익히게 해주는 것 같습니다.
사실 아직은 뜬구름 잡는 이야기에 더 가까운 것 같지만요;; ㅎㅎ
'TIL' 카테고리의 다른 글
[현대이지웰 Java 풀스택 개발자 아카데미 6월] TIL 9차 - 디자인 패턴 (0) | 2025.09.10 |
---|---|
[현대이지웰 Java 풀스택 개발자 아카데미 6월] TIL 7주차 - JDBC를 이용한 JAVA의 데이터베이스 접근과 DTO, DAO를 도입하기 위한 구조도 (4) | 2025.08.26 |
[현대이지웰 Java 풀스택 개발자 아카데미 6월] TIL 30 & 31 & 32 & 33일차 - Oracle, Java (2) | 2025.08.26 |
[현대이지웰 Java 풀스택 개발자 아카데미 6월] TIL 6주차 - JAVA 객체지향으로 코드 리팩토링 해보기 (0) | 2025.08.19 |
[현대이지웰 Java 풀스택 개발자 아카데미 6월] TIL 5주차 - JAVA 객체지향 프로그래밍 (6) | 2025.08.12 |