프로그래밍 14

[TIL] 최소직사각형(JAVA)

https://school.programmers.co.kr/learn/courses/30/lessons/86491 프로그래머스SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr [간단 문제 설명]사이즈가 모두 다른 명함들이 sizes[ ][ ] 배열로 주어진다.이 명함들이 모두 들어갈 수 있는 가장 작은 사이즈의 지갑을 만들어야한다. [처음 풀이 방식(정렬 사용)]문제에서 좀 어려웠던 포인트는 명함을 가로/세로 방향으로 돌려서 명함에 수납할 수 있다는 것이다.이는 즉 명함의 가로-세로 방향이 서로 뒤바뀔 수 있음을 의미한다. 그래서 명함의 더 긴 부분을 따로 저장하는 배열 longs[ ]과명함의 더 짧은 부분을 따로 ..

[TIL] 이상한 문자 만들기 - 삽질 후기

https://school.programmers.co.kr/learn/courses/30/lessons/12930 프로그래머스SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 알고리즘 문제를 매일 최소 한 문제씩 푸는걸 목표로하고 있다.오늘은 '이상한 문자 만들기'를 풀었는데, 이것저것 삽질을 많이 해서 다시는 까먹지 말자는 의미로 정리하려한다.가벼운 후기 글이다. 오늘의 문제를 요약하자면 특정 위치의 문자를 대/소문자로 변경하는 것이다.  대문자, 소문자를 보자마자 생각난게 toUpperCase()와 toLowerCase()였다. 이때의 나는 toUpperCase()와 toLowerCase()가 "문자열"만을 대상..

[백준]1744번 '수 묶기'(JAVA, 그리디)

https://www.acmicpc.net/problem/1744  [아이디어]양수의 경우 가장 큰 수끼리, 음수의 경우 가장 작은 수 끼리 곱했을 때 제일 큰 값을 얻을 수 있다.또한 0의 경우 묶지 못한 음수 하나를 없앨 수 있다. 따라서 양수는 가장 큰수부터 작은 수(내림차순)로, 음수와 0은 가장 작은 수부터 큰수(오름차순)로우선순위 큐를 각각 만들어 저장한다.그 후 큐의 제일 앞에 위치한 두 수를 묶어 곱한 후  answer에 더해준다. *예외: 1의 경우 곱하는 것보다 더했을 때 더 큰 수가 된다. (ex) 1*2 1+2 )  import java.util.*;import java.io.IOException;import java.io.BufferedReader;import java.io.Inp..

[코딩연습_JAVA] 크레인 인형뽑기

*김태원님의 '자바 알고리즘 문제풀이 입문'으로 공부중이다. [간단 문제 설명] n*n 크기의 2차원 배열에 다양한 종류의 인형이 들어있다. 크레인으로 인형을 집어 1차원 배열에 넣는다. 이때 만약 같은 종류의 인형이 직접 맞닿으면 그 두 인형은 사라진다. 크레인이 모두 작동한 후 사라진 인형의 개수를 구하라. 내 솔루션 코드: public int solution(int n, int[][] board, int[] moves){ Stack stack= new Stack(); int answer=0; int y=0; //2차원 배열의 행을 나타냄 for(int x: moves){ while(y1 && stack.get(stack.size()-2)==stack.peek()){ stack.pop(); stack..

[코딩연습_JAVA] 괄호 문자 제거

[간단 문제 설명] 입력된 문자열에서, 소괄호 내에 있는 문자를 제거하고 남은 문자만 출력하도록 한다. 솔루션 코드는 아래와 같다. ↴ public String solution(String s){ Stack stack=new Stack(); char tmp=' '; for(char x: s.toCharArray()){ stack.push(x);//')'가 나올때까지 push한다. if(x==')'){ do{ tmp=stack.pop(); if(stack.isEmpty()) break; //문자열 첫 문자가 ')'일 경우. }while(tmp!='('); //'('가 나올때까지 pop. } } char[] carray=new char[stack.size()]; //stack 내(內) 문자를 저장할 배열 f..

[코딩연습_JAVA] 올바른 괄호

[간단 문제 설명] 괄호만으로 이루어진 문자열이 주어진다. 괄호의 쌍이 올바르게 위치하면 "YES"를 출력, 쌍이 올바르지 않으면 "NO"를 출력한다. 솔루션 코드는 아래와 같다. ↴ public String solution(String pth){ Stack checkP=new Stack(); for(char x:pth.toCharArray()){ if(x=='(')checkP.push(x); else if(checkP.isEmpty()||checkP.pop()!='(') return "NO"; //X==')'일 경우 실행되는 구문 } if(!checkP.isEmpty()) return "NO"; //짝지어지지 못하고 남는 괄호가 있는경우 return "YES"; } 이번같은 괄호 문제는 stack의 L..

[코딩연습_JAVA] K번째 큰 수

[간단 문제 설명] 1부터 100사이의 자연수가 적힌 N개의 카드(중복숫자 허용)에서 3장의 카드를 무작위로 골라 숫자를 더한다. 더한 숫자들 중 K번째로 큰 수를 출력한다. K번째 숫자가 없으면 -1을 반환한다. 자료의 중복을 허용하지 않으면서, value값은 필요 없고 key값만 있으면 되기 때문에 HashMap보다는 TreeSet을 활용하는 것이 좋다. public int solution(int n, int k, int[] arr){ TreeSet Tset=new TreeSet(Collections.reverseOrder()); //내림차순 정렬 for (int i=0; i

[코딩연습_JAVA] 학급 회장(Hash) (24.02.12)

최근 two pointers와 sliding window를 사용하여 시간복잡도를 줄이는 알고리즘 문제를 한창 풀다가 HashMap을 활용한 알고리즘 문제풀이로 넘어와서 공부중이다. Hash에 대한 개념 정리는 이미 책을 통해 한 번 훑었지만 추후에 글로 정리해보기로하고, 오늘은 알고리즘 문제들을 몇 개 풀면서 알게된 HashMap관련 메소드들을 차근차근 정리해보려고한다. [간단 문제 설명] 어떤 문자열에서 가장 많이 출현하는 문자가 무엇인지 출력하면 된다. 배열과 반복문을 사용해서도 풀 수 있겠지만, 해시를 사용하면 훨씬 간단하고 빠르게 문제를 해결할 수 있다. (HashTable은 데이터의 해시값을 테이블 내 주소로 활용하기 때문에 탐색에 있어서는 이진탐색보다도 강력하다고 할 수 있음) 아래는 솔루션 ..

[코딩연습_JAVA] 연속 부분수열

(김태원님의 알고리즘 문제풀이 강의(JAVA)를 들으며 공부중이다.) 공부하다가 '이건 꼭 새겨둬야지' 하는 사항이 있어 오랜만에 기록을 남긴다. (오답노트) 이미 잘하는 사람들에게는 시시한 사항이겠지만, 나는 한참 배우는 중이니까..! [문제 설명] 'N개의 수로 이루어진 수열에서, 합했을 때 특정 값이 나오는 부분 수열의 개수를 출력'하는 문제이다. 두 개의 포인터로 슬라이딩 윈도우를 구현하면 쉽게 풀 수 있는 문제다. 문제 풀이 아이디어 자체는 좋았는데, 간단한 부분에서 막혔다. 자꾸 부분 수열의 카운팅 개수가 정답보다 1적게 나오는 것. 무엇이 문제 였을까? 아래 잘못된 코드를 보자. #첫 번째 코드 public int solution(int n, int m, int[] arr){ int cnt=..

[코딩연습_JAVA] 봉우리

(*김태원님의 알고리즘 문제 풀이(JAVA)를 수강하면서 공부 중이다.) N*N격자에서 어떤 수와 그 수의 상하좌우에 있는 수를 비교했을때, 가운데 위치한 수가 제일 큰 경우가 몇 번인지 횟수를 세는 프로그램을 짜보았다. 아래는 강의를 보기 전 직접 구현한 코드의 일부이다. public int solution(int n, int[][] arr){ int cnt=0; //봉우리 개수를 세는 변수 선언 for(int i=1; i