본문 바로가기
728x90

분류 전체보기103

연습#14 안녕하세요! 오늘도 풀었습니다. '애니어그램'이라는 유형의 문제였습니다. 242. Valid Anagram 풀긴 풀었으나 매우 장황하고 복잡하게 풀었습니다. 소트, 해시테이블, 배열 등등 풀이법이 다양했는데요. 저는 해시를 사용했습니다. 다시 생각해보면 해시맵을 두개 쓰지 않고 origin 하나를 만들고, 비교대상은 origin의 count를 줄여가는 식으로 접근했어도 됐겠네요! class Solution { public boolean isAnagram(String s, String t) { if (s.length() != t.length()) { return false; } final Map origin = new HashMap(); final Map transformed = new HashMap();.. 2023. 12. 13.
연습#13 바로 이어서 한 문제 더 풀었습니다. 2609. Find the Longest Balanced Substring of a Binary String 두 가지의 접근법이 있는데요, 하나는 "01"이라는 규칙을 이용해서 푸는 것과, 하나는 문자열을 순회하면서 계산하는 방법입니다. class Solution { public int findTheLongestBalancedSubstring(String s) { int res = 0; String temp = "01"; while(temp.length() 2023. 12. 12.
연습#12 안녕하세요. 오늘도 풀었습니다. 1281. Subtract the Product and Sum of Digits of an Integer 정말 많이 많이 쉬웠습니다. 문자열로 변환해서 하나씩 처리해도 되고, public int subtractProductAndSum(int n) { int product = 1; int sum = 0; String str = String.valueOf(n); for (int i=0; i 0) { sum += n % 10; product *= n % 10; n /= 10; } return product - sum; } 너무 날먹한 것 같아서 한 문제 더 풀어야겠습니다.. 2023. 12. 12.
EchoServer/Client TCP 패킷 분석 - 1. 연결/연결 종료 (Wireshark) 안녕하세요! 오늘은 echo server를 만들고 wireshark로 이것저것 해본 경험을 기록하려고 합니다. netty를 공부하고 있어서 netty로 echo server/client 만들었습니다. java socket으로 만드는 것과 차이는 없을 것이라 생각됩니다. 오늘은 일반적인 서버와 클라이언트의 흐름인 연결/송수신/종료 3가지 경우를 살펴보려고 합니다. server port : 8888 client port : 51214 1. 연결모두가 다 아는 그 과정, 3-way handshake 입니다. 클라이언트가 서버로 [SYN] 패킷을 보내면서 연결이 시작되고 서버는 [SYN,ACK] 를 보내고 클라이언트도 [ACK]를 보내 연결을 수립합니다. 이 시점에 netstat을 통해 네트워크 상태도 한 번 .. 2023. 12. 12.
연습#11 Check if the sentence Is Pangram 안녕하세요! 풀었습니다. 하지만 매우 쉬웠습니다. 1832. Check if the Sentence Is Pangram 저는 a~z 까지 set에 넣어두고, 문자열을 하나씩 돌면서 set에 있는 문자들을 지워가는 방식을 사용했습니다. class Solution { public boolean checkIfPangram(String sentence) { final Set hs = new HashSet(); for (char c = 'a'; c 2023. 12. 11.
연습#10 Consecutive Characters 바로 이어서 또 한 문제 풀었습니다. leetcode의 random easy 1446. Consecutive Characters 를 빨리 풀긴 했는데 너무 덕지덕지코드 같습니다..ㅠ 덕지덕지코드 : Run 돌려보고 실패하는 테스트케이스에 맞추어 보수하는 코드 이렇게 문제 푸는 것은 적절하지 않은 것 같습니다. 시간은 시간대로 쓰고 사고력은 올라가지 않는 느낌이네요. 직전 문제에서 배운 것처럼 문자열의 문자를 하나씩 순회하면서 가장 긴 문자열을 찾았습니다. 완전탐색(Brute-force)방법이었습니다. 다른 분들의 풀이를 보니 접근법은 같았네요. 흠.. 뭔가 마음에 들지 않습니다. 이따 핀 선생님에게 조언을 구해봐야겠습니다. 2023. 12. 10.
연습#9 Long Pressed Name 안녕하세요! 오늘도 풀었습니다. 사실 어제 밤에 풀었는데 너무 피곤해서 잠들고, 일어나서 올리네요. leetCode의 랜덤한 easy 하나인 long pressed name를 풀었습니다. 저의 접근법은 신선했으나 일부 논리에 허점이 있었고, 핀의 도움을 받아 풀었습니다. 이번 문제로 배운 점은 다음과 같습니다.문자열을 자르는 선택(substring)이 필요하다면, index를 가지고 뒤로 가지 않는 선택으로 대체할 수 있다.두 문자열을 비교해야 한다면 두 문자열 각각을 순회하면서 독립적으로 비교할 수 있다.루프를 꼭 하나의 인덱스로 해야한다는 편견을 버려라(ex. while 문으로 내부에 i,j,k… 만들 수 있다) 다음 문자열 유형의 문제가 나오면 적용해보려고 합니다. 할 수 있 다 ! 2023. 12. 10.
헷갈리는 compare/compareTo 이해하기 안녕하세요! JAVA에서는 객체간 비교를 하기 위해 Comparable/Comparator 인터페이스를 많이 사용합니다. 단순 객체간 비교를 할 때는 어렵지 않은데, 정렬에서 이 인터페이스의 compareTo를 구현할 때는 구현할 때마다 헷갈리는 것 같습니다. (머리가 좋으신 분들은 헷갈리지 않을 수 있습니다..) 더이상 헷갈리면 안되겠다 싶어서 핀 선생님의 도움을 받아 차근히 공부를 했고, 오늘은 제가 이해한 방법을 한 번 공유해볼까 합니다. 외워야할 것들 비교대상 : A, B 공식 : A를 기준으로 A를 앞에 보내고 싶으면 -1, A를 뒤로 보내고 싶으면 1 (같으면 0 이지만 이건 딱히 헷갈리지 않으니 제외) 오름차순 : 작은 수가 앞에 옴 / 내림차순 : 큰 수가 앞에 옴 point : 함수가 완.. 2023. 12. 9.
TCP 소켓의 TIME_WAIT 상태는 왜 있는 것일까? 안녕하세요! 오늘은 소켓의 TIME_WAIT상태에 대해 알아보겠습니다. 기본적으로 TCP 통신이라고 하면 "연결 지향"이라는 말이 나오고 "연결"이라는 개념이 나왔다면 서버와 클라이언트를 떠올릴 수 있습니다. 서버와 클라이언트는 연결을 맺고 데이터를 송수신 하다가 연결을 끊게 됩니다. 연결을 끊을 때 four -way handshaking을 하게 되는데요. (four-way handshaking은 따로 설명하지 않겠습니다.) 이 때 먼저 연결을 끊은 측에서 TIME_WAIT 상태에 들어가게 됩니다. 클라이언트 소켓이 TIME_WAIT 상태에 들어가는 것이 아니고, 서버 소켓이 TIME_WAIT 상태에 들어가는 것이 아니고, 누구랄 것 없이 먼저 종료를 요청한 소켓이 TIME_WAIT상태에 들어가게 됩니다.. 2023. 12. 8.
Java 스트림 (Stream)의 특징 안녕하세요! 오늘은 Java8에 추가된 Stream에서 중요한 키워드 몇가지를 살펴보려고 합니다. 먼저 스트림이란 무엇일까요? 스트림이란 선언형으로 컬렉션 데이터를 처리할 수 있는 기능입니다. 소스에서 추출되는 연속된 요소를 가지고 스트림API가 제공해주는 많은 빌딩 블록 연산을 연결해서 복잡한 데이터 처리 파이프라인을 만들 수 있습니다. 또한 스트림을 사용하면 멀티스레드 코드를 구현하지 않아도 데이터를 tranperant하게 병렬로 처리할 수 있습니다. (Transparency, 투명성 : 어떤 시스템이나 기능을 사용할 때 사용 방법이 내부 복잡성을 숨기고 명확하게 제공되는 경우) 정리하면, 스트림 API의 특징은 선언형(declarative) : 간결하고 가독성이 좋아집니다. 조립할 수 있음(pipe.. 2023. 12. 8.
연습#8 의상 안녕하세요! 오늘도 한 문제를 풀었습니다. 프로그래머스 > 고득점kit > 해시의 level2 의상 문제였고, 힌트를 받아 정답을 맞혔습니다. 어제 'String을 기반으로 정보를 기록하고 관리해야할 때 무조건 해시를 써야 한다'는 가르침을 얻었습니다. 그래서 비록 해시 카테고리의 문제였지만, 아 해시를 써야 한다는 힌트들이 들어있구나! 생각했습니다. 해시를 사용하긴 했지만, 문제를 일반화하지 못했습니다^_ㅠ 예제를 가지고 수식을 만들다보면, (a+1)(b+1)...(n+1) - 1 라는 일반식이 도출됩니다. 저는 이 식으로 문제를 풀었습니다. 다른 분들의 풀이도 한 번 보았습니다. 같은 공식을 사용하였지만 stream을 통해 매우 명료하게 나타내셨습니다. Arrays.stream(clothes) .co.. 2023. 12. 8.
연습#7 전화번호 목록 오늘도 풀었습니다. 아니, 풀려고 시도했으나 못 풀었습니다.. ㅠ 프로그래머스 고득점Kit의 해시 level3 문제를 풀었는데요, 해시라는 힌트가 있음에도 불구하고 이용하지 못했고 이중포문만 남발한 끝에 시간초과로 해결하지 못했습니다. 다른 분들의 풀이와 접근 방법을 보던 중 온라인 선생님을 뵙게 되어 접근법을 공유해봅니다. 모든 전화번호를 해시맵에 key로 넣어둡니다. 그리고 전화번호 리스트를 돌면서, 각 전화번호의 접두어들이 해시맵에 있는지 확인합니다. 여기서 핵심은, 각 전화번호 자신은 해시맵에 있으므로 자기자신은 포함되지 않아야 합니다. 갈 길이 더 멀어졌습니다^^; 출처(온라인 선생님) : https://coding-grandpa.tistory.com/77 2023. 12. 7.
728x90