목차
▸ 괄호 회전하기
▸ 연속 부분 수열의 합의 개수
출처: 프로그래머스 코딩테스트 연습 > 월간 코드 챌린지 시즌2 > 괄호 회전하기
[오답 코드]
import java.util.*;
class Solution {
public int solution(String s) {
int answer = 0;
//문자열 바꾸기
for(int i = 0; i < s.length(); i++){
boolean result = isCorrected(s);
if(result == true){
answer++;
}
String newstring = move(s);
s = newstring;
}
return answer;
}
public boolean isCorrected(String s){
Stack st1 = new Stack();
Stack st2 = new Stack();
Stack st3 = new Stack();
for(char c : s.toCharArray()){
if(c == '('){
st1.push(c);
}else if(c == '{'){
st2.push(c);
}else if(c == '['){
st3.push(c);
}else if(c == ')'){
if(st1.size() == 0){
return false;
}
st1.pop();
}else if(c == '}'){
if(st2.size() == 0){
return false;
}
st2.pop();
}else if(c == ']'){
if(st3.size() == 0){
return false;
}
st3.pop();
}
}
if(st1.size() == 0 && st2.size() == 0 && st3.size() == 0){
return true;
} else{
return false;
}
}
public String move(String s){
char[] chars = s.toCharArray();
char firstChar = chars[0]; // 저장 후 이동시킬 문자열의 첫 번째 문자
// 문자열을 왼쪽으로 이동
for (int i = 0; i < chars.length - 1; i++) {
chars[i] = chars[i + 1];
}
// 마지막 문자는 처음 문자로 대체
chars[chars.length - 1] = firstChar;
return new String(chars);
}
}
[수정 코드]
import java.util.*;
class Solution {
public int solution(String s) {
int answer = 0;
//문자열 바꾸기
for(int i = 0; i < s.length(); i++){
boolean result = isCorrected(s);
if(result == true){
answer++;
}
String newstring = move(s);
s = newstring;
}
return answer;
}
public boolean isCorrected(String s){
Stack<Character> st = new Stack<>();
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '(' || s.charAt(i) == '{' || s.charAt(i) == '[') {
st.push(s.charAt(i));
} else {
if (!st.isEmpty()) {
char c = st.pop();
char a = s.charAt(i);
if(c == '(' && a == ')') {
continue;
}else if(c == '{' && a == '}') {
continue;
}else if(c == '[' && a == ']') {
continue;
}else {
return false;
}
} else {
return false;}
}
}
if(st.isEmpty()) {
return true;
} else {
return false;
}
}
public String move(String s){
char[] chars = s.toCharArray();
char firstChar = chars[0]; // 저장 후 이동시킬 문자열의 첫 번째 문자
// 문자열을 왼쪽으로 이동
for (int i = 0; i < chars.length - 1; i++) {
chars[i] = chars[i + 1];
}
// 마지막 문자는 처음 문자로 대체
chars[chars.length - 1] = firstChar;
return new String(chars);
}
}
출처: 프로그래머스 코딩테스트 연습 > 연습문제 > 연속 부분 수열 합의 개수
[오답 코드]
import java.util.*;
class Solution {
public int solution(int[] elements) {
int answer = 0;
int lastNum = elements[elements.length - 1]; // 마지막 숫자 저장
int[] result = new int[2*(elements.length) - 1];
List<Integer> sumList = new ArrayList<>();
// 기존 배열 복사
System.arraycopy(elements, 0, result, 0, elements.length);
// 두 번째 부분 붙이기
System.arraycopy(elements, 0, result, elements.length, elements.length - 1);
int count = 1;
for(int i = 1; i <= elements.length; i++){
for(int j = 0; j < elements.length; j++){
int sum = 0;
for(int k = j; k < j+count; k++){
sum += result[k];
if(!sumList.contains(sum)){
sumList.add(sum);
}
}
}
count++;
}
return sumList.size();
}
}
[수정 코드]
import java.util.HashSet;
import java.util.Set;
class Solution {
public int solution(int[] elements) {
Set<Integer> sumSet = new HashSet<>();
//부분 배열의 길이 len
for(int len = 1; len <= elements.length; len++){
//시작지점 start
for(int start = 0; start < elements.length; start++){
int sum = 0;
//sum 구하기
for(int i = 0; i < len; i++){
sum += elements[(start + i) % elements.length];
}
sumSet.add(sum);
}
}
return sumSet.size(); // 고유 합계의 개수 반환
}
}