문제 - 정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램 작성 - push X : 정수 X를 스택에 넣기 - pop : 스택에서 가장 위에 있는 정수를 빼고, 그 수 출력. 만약 스택에 들어있는 정수가 없는 경우 -1 출력 - size : 스택에 들어있는 정수의 개수 출력 - empty : 스택이 비어있으면 1, 아니면 0 출력 - top : 스택의 가장 위에 있는 정수 출력. 만약 스택에 들어있는 정수가 없는 경우 -1 출력 해결방법 이번에 이 문제를 해결할 때에는 자바 내의 stack 클래스를 이용하여 문제를 해결하였다. push X (push(x)), pop (pop()), size(size()), empty(isEmpty()), top(peek()) 메소드를 이용하..
문제 - 정수 하나가 적혀있는 숫자 카드 N장을 가지고 있음 - 정수 M개가 주어졌을 때, 이 수가 적혀있는 숫자 카드를 몇 개 가지고 있는지 구하기 해결방법 처음에는 10,000,000 * 2 + 1 (-10,000,000 ~ 10,000,000) 만큼 2차원 배열로 만들어 해당 숫자가 입력되면 음수일 때에는 절대값 취해서 해당 배열에 카운팅해주고, 양수도 같은 방식으로 해당하는 수의 배열 자리에 카운팅 해줄 수 있도록 코드를 작성하였는데 메모리 초과가 발생하였다. 더보기 import java.io.*; import java.util.*; class Main{ public static void main(String[] args) throws Exception { BufferedReader br = ne..
문제 - 가입한 사람들의 나이와 이름이 가입한 순서대로 주어짐 - 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬 해결방법 Comparable 인터페이스를 상속받아 compareTo 메소드를 Override하여 비교할 수 있도록하여 정렬하였다. age와 name을 모두 담을 수 있는 Person 클래스를 만들어 compareTo 메소드를 Override하여 나이 순으로 비교할 수 있도록 하였다. 그 후 입력받은 사람들의 데이터를 Arrays.sort()를 이용하여 정렬한 뒤 출력하였다. 코드 import java.io.*; import java.util.*; class Main{ public static class Person implements Comparab..
문제 - 재현이와 재민이는 장부 관리 중 - 재현이는 재민이를 도와 돈을 관리하는데, 항상 정신없는 재현이는 돈을 실수로 잘못 부름 - 재현이는 잘못된 수를 부를 때마다 0을 외쳐서, 가장 최근에 재민이가 쓴 수를 지움 - 재민이는 이렇게 모든 수를 받아 적은 후 그 수의 합을 구함 - 수는 0에서 1,000,000 사이의 값을 가짐 해결방법 stack을 이용하여 재현이가 수를 부를 때마다 stack에 집어넣고, 재현이가 0을 부른다면 가장 최근에 넣었던 값을 pop()시켜 꺼내줄 수 있도록 한다. 모든 수를 다 stack에 넣었다면 stack 안에 있는 수들의 합을 구하면 된다. 코드 import java.io.*; import java.util.*; class Main { public static v..
문제 - 호텔 정문으로부터 걸어서 가장 짧은 거리에 있는 방을 배정 - 호텔 정문은 일층 엘리베이터 바로 앞에 있음 - 정문에서 엘리베이터까지의 거리는 무시 - 엘리베이터는 건물의 가장 왼쪽에 위치 - 모든 인접한 두 방 사이의 거리는 같은 거리라고 가정 - 호텔의 정면 쪽에만 방이 있다고 가정 해결방법 주어진 손님을 방에 배치하기 위해서는 그 손님이 몇 층, 몇 번째 방에 묵어야하는지를 구해야 한다. 가장 가까운 위치부터 배치를 하려면 각 층의 1호부터 손님을 배치해야 한다. 1호부터 각 층별로 손님을 배치해야 하므로 주어진 N번째 방을 찾기 위해서는 H인 층수로 나누어 계산을 해줄 수 있어야 한다. 말로 풀어서 쓰면 헷갈릴 수도 있겠지만, 코드를 보면 바로 이해가 될 것이다. 코드 import jav..
문제 - 괄호 문자열은 두 개의 괄호 기호인 '('와 ')'만으로 구성되어 있는 문자열 - 한 쌍의 괄호 기호로 된 "()" 문자열은 기본 VPS(Valid Parenthesis String, 올바른 괄호 문자열) - 만일 x가 VPS라면 "(x)"도 VPS - 두 VPS x와 y를 접합시킨 새로운 문자열 xy도 VPS - 주어진 괄호 문자열이 VPS인지 아닌지 판단해서 결과를 YES / NO로 출력 해결방법 스택에 괄호를 넣으면서 VPS를 판단할 수 있도록 하였다. 비어있는 상태에서 닫힌 괄호가 입력되면 VPS가 아니므로 NO를 출력할 수 있도록 하였고, 비어있는 상태에서 열린 괄호가 입력되면 스택에 넣어주었다. 그리고 스택에 무언가 들어있는 상태에서 열린 괄호가 입력되면 스택에 넣어주고, 닫힌 괄호가..
문제 - 사람의 덩치를 (몸무게, 키)로 표시 - A : (x, y), B : (p, q)라고 할 때, x > p 그리고 y > q이라면 A의 덩치가 B의 덩치보다 더 크다고 말함 - 하지만 몸무게는 A가 더 많이 나가지만, B가 키가 더 크다면 누구도 상대방보다 더 크다고 말할 수 없음 - N명의 집단에서 각 사람의 덩치 등수는 자신보다 더 큰 덩치의 사람의 수로 정해짐 - 자신보다 더 큰 덩치의 사람이 k명이라면 그 사람의 덩치 등수는 k + 1 해결방법 각 사람과 다른 사람의 덩치를 비교해보면서 더 큰 사람의 덩치 등수를 1씩 더해준다. 각 사람의 신체 정보를 담는 배열과 덩치 등수를 담는 배열을 만들어 해당 사람들의 덩치를 비교하면서 덩치 등수를 변경해준다. 코드 import java.io.*; ..
문제 - 어떤 문자열이 주어졌을 때, 괄호들의 균형이 잘 맞춰져 있는지 판단 - 문자열에 포함되는 괄호는 소괄호("()")와 대괄호("[]")로 2종류 - 문자열이 균형을 이루는 조건은 아래와 같음 1. 모든 왼쪽 소괄호("(")는 오른쪽 소괄호(")")와만 짝을 이뤄야 함 2. 모든 왼쪽 대괄호("[")는 오른쪽 대괄호("]")와만 짝을 이뤄야 함 3. 모든 오른쪽 괄호들은 자신과 짝을 이룰 수 있는 왼쪽 괄호가 존재 4. 모든 괄호들의 짝은 1:1 매칭만 가능. 즉, 괄호 하나가 둘 이상의 괄호와 짝지어지지 않음 5. 짝을 이루는 두 괄호가 있을 때, 그 사이에 있는 문자열도 균형이 잡혀야 함 - 입력의 종료조건으로 맨 마지막에 점 하나(".")가 들어옴 - 문자열이 균형을 이루고 있으면 "yes" ..