728x90
반응형
SMALL

문제 설명

짝지어 제거하기는, 알파벳 소문자로 이루어진 문자열을 가지고 시작합니다. 먼저 문자열에서 같은 알파벳이 2개 붙어 있는 짝을 찾습니다. 그다음, 그 둘을 제거한 뒤, 앞뒤로 문자열을 이어 붙입니다. 이 과정을 반복해서 문자열을 모두 제거한다면 짝지어 제거하기가 종료됩니다. 문자열 S가 주어졌을 때, 짝지어 제거하기를 성공적으로 수행할 수 있는지 반환하는 함수를 완성해 주세요. 성공적으로 수행할 수 있으면 1을, 아닐 경우 0을 리턴해주면 됩니다.

예를 들어, 문자열 S = baabaa 라면

b aa baa → bb aa → aa →

의 순서로 문자열을 모두 제거할 수 있으므로 1을 반환합니다.

제한사항

  • 문자열의 길이 : 1,000,000이하의 자연수
  • 문자열은 모두 소문자로 이루어져 있습니다.

입출력 예

s result

baabaa 1
cdcd 0

입출력 예 설명

입출력 예 #1

위의 예시와 같습니다.

입출력 예 #2

문자열이 남아있지만 짝지어 제거할 수 있는 문자열이 더 이상 존재하지 않기 때문에 0을 반환합니다.

package LV2;

import java.util.Stack;

public class H12973 {
	public int solution(String s)
	{
		Stack<Character> stack = new Stack<>();  // 문자를 저장할 스택을 생성

		for (char c : s.toCharArray()) {  // 문자열의 각 문자에 대해 반복
			// 스택이 비어있지 않고, 스택의 맨 위에 있는 문자와 현재 문자가 같은 경우
			if (!stack.isEmpty() && stack.peek() == c) {
				stack.pop();  // 스택에서 문자를 제거
			} else {  // 그렇지 않은 경우
				stack.push(c);  // 스택에 현재 문자를 추가
			}
		}

		// 스택이 비어있는 경우, 즉, 모든 문자를 제거할 수 있는 경우에는 1을 반환하고,
		// 그렇지 않은 경우에는 0을 반환합니다.
		return stack.isEmpty() ? 1 : 0;
	}
}

스택을 생성한 후에, 문자열의 모든 문자에 대해 반복문을 수행 반복문 내에서는 스택이 비어있지 않고, 스택의 top에 있는 문자와 현재 문자가 같으면 스택에서 문자를 제거하고, 그렇지 않으면 스택에 문자를 추가 이렇게 하면 문자열의 모든 문자를 검사한 후에 스택이 비어있으면 문자열을 모두 제거할 수 있으며, 그렇지 않으면 문자열을 모두 제거할 수 없다. 따라서 스택이 비어있는지 여부에 따라 결과를 반환하고, 스택이 비어있으면 1을, 그렇지 않으면 0을 반환

728x90
반응형
LIST

'알고리즘 > 프로그래머스 JAVA LV.2' 카테고리의 다른 글

구명보트  (0) 2023.05.23
H-Index  (0) 2023.05.22
카펫  (0) 2023.05.22
피보나치 수  (0) 2023.05.22
기능개발  (0) 2023.05.19
728x90
반응형
SMALL

문제 설명

Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다.

Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.

Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.

제한사항

  • 갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다.
  • 노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다.
  • 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.

입출력 예

brown yellow return

10 2 [4, 3]
8 1 [3, 3]
24 24 [8, 6]
package LV2;

public class H42842 {
	public int[] solution(int brown, int yellow) {
		int total = brown + yellow;  // 전체 타일의 개수 계산
		for (int i = (int)Math.sqrt(total); i > 0; i--) {  // 전체 타일의 개수의 제곱근에서부터 1까지 반복
			if (total % i == 0) {  // 약수인지 확인
				int j = total / i;  // 몫을 구함 (가로 길이)
				// 노란색 타일의 개수를 만족하는지 확인
				if ((j - 2) * (i - 2) == yellow) {
					return new int[] {j, i};  // 가로, 세로 길이를 배열에 담아 반환
				}
			}
		}
		return null;  // 조건을 만족하는 가로, 세로 길이를 찾지 못한 경우 null 반환
	}
}
728x90
반응형
LIST

'알고리즘 > 프로그래머스 JAVA LV.2' 카테고리의 다른 글

H-Index  (0) 2023.05.22
짝지어 제거하기  (0) 2023.05.22
피보나치 수  (0) 2023.05.22
기능개발  (0) 2023.05.19
프로세서  (0) 2023.05.19
728x90
반응형
SMALL

문제 설명

피보나치 수는 F(0) = 0, F(1) = 1일 때, 1 이상의 n에 대하여 F(n) = F(n-1) + F(n-2) 가 적용되는 수 입니다.

예를들어

  • F(2) = F(0) + F(1) = 0 + 1 = 1
  • F(3) = F(1) + F(2) = 1 + 1 = 2
  • F(4) = F(2) + F(3) = 1 + 2 = 3
  • F(5) = F(3) + F(4) = 2 + 3 = 5

와 같이 이어집니다.

2 이상의 n이 입력되었을 때, n번째 피보나치 수를 1234567으로 나눈 나머지를 리턴하는 함수, solution을 완성해 주세요.

제한 사항

  • n은 2 이상 100,000 이하인 자연수입니다.

입출력 예

n return

3 2
5 5

입출력 예 설명

피보나치수는 0번째부터 0, 1, 1, 2, 3, 5, ... 와 같이 이어집니다.

 

package LV2;

public class H12945 {
	public int solution(int n) {
		int answer = 0;  // 결과를 저장할 변수를 선언, 초기값은 0으로 설정

		long[] pib = new long[n + 1];  // 피보나치 수열의 각 항을 저장할 배열을 선언 
		// long 자료형으로 선언한 이유는 피보나치 수열의 값이 int 범위를 초과할 수 있기 때문

		pib[0] = 0L;  // 피보나치 수열의 0번째 항을 설정
		pib[1] = 1L;  // 피보나치 수열의 1번째 항을 설정

		for (int i = 2; i <= n; i++) {  // 2부터 n까지 반복
			pib[i] = (pib[i - 1] + pib[i - 2]) % 1234567L;  // 피보나치 수열의 정의에 따라 i번째 항을 (i-1번째 항 + i-2번째 항)으로 설정하고, 이를 1234567로 나눈 나머지를 저장
		}

		answer = (int) pib[n];  // 계산된 n번째 피보나치 수를 answer에 저장
		
		return answer;  // 계산 결과를 반환
	}
}
728x90
반응형
LIST

'알고리즘 > 프로그래머스 JAVA LV.2' 카테고리의 다른 글

짝지어 제거하기  (0) 2023.05.22
카펫  (0) 2023.05.22
기능개발  (0) 2023.05.19
프로세서  (0) 2023.05.19
행렬의 곱셉  (1) 2023.05.18

+ Recent posts