구름톤 챌린지 통증

[느낀점]

난이도가 갑자기 엄청 쉬워져서 당황했다. 그나마 평소에 사용안하던 StringTokenizer 를 사용해서 실력향상에 도움이 됬다고 생각한다. 다음날 공개된 풀이를 보니 그리디 문제였다. 그리디 알고리즘중에 쉬운 문제가 나온 것 같다. 좀 더 어렵게 나왔다면 내가 푼 방식으로는 더 복잡하게 풀게 될것같다.

 

[결과 코드]

import java.io.*;
import java.util.*;

class Main {
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		int N = Integer.parseInt(st.nextToken());
		int answer = 0;
		while(N!=0) {
			if(N-14>=0) {
				N-=14;
				answer++;
			} else if (N-7>=0) {
				N-=7;
				answer++;
			} else if(N-1>=0){
				N-=1;
				answer++;
			}
		}
		System.out.println(answer);
	}
}

구름톤 챌린지 구름 찾기 깃발

[느낀점]

문제를 보자마자 아 이거 나 혼자 못풀겠다! 싶었다. 저번에도 프로그래머스에서 지뢰찾기 문제를 푼 적이 있었는데 그때도 매우 어렵게 여러블로그 찾아가며 풀었었다. 8방탐색이란걸 해서 풀면 나름 쉽게 풀린다고 한다. 구름에서 제공한 풀이를보면 dx/dy 탐색법을 사용하면 된다고 한다. 하지만 dx/dy 탐색법이란걸 봐도 이해가 잘 안가서 나만의 방법으로 했다. 풀이가 되게 간단하고 허접하다. 각 방향별 상,하,좌,우, 대각선 총 8개의 if문이 들어가서 코드가 약간 더럽다. 다음엔 dx/dy 탐색법을 사용해 볼거라고 다짐해보며 일단 현재 풀이의 만족하기로 했다.

 

[결과 코드]

import java.io.*;
import java.util.*;

class Main {
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		int N = Integer.parseInt(st.nextToken());
		int K = Integer.parseInt(st.nextToken());
		int[][] arr = new int[N][N];
		
		for(int i=0;i<N;i++){
			st = new StringTokenizer(br.readLine(), " ");
			for(int j=0;j<N;j++){
				if(Integer.parseInt(st.nextToken())==1) {
					arr[i][j] = -1;
				} else {
					arr[i][j] = 0;
				}
			}
		}
		for(int i=0;i<N;i++){
			int score = 0;
			for(int j=0;j<N;j++){
				if(arr[i][j]==0){
					if(i-1>=0){
						if(arr[i-1][j]==-1) arr[i][j]++;
					}
					if(i+1<N){
						if(arr[i+1][j]==-1) arr[i][j]++;
					}
					if(j-1>=0){
						if(arr[i][j-1]==-1) arr[i][j]++;
					}
					if(j+1<N){
						if(arr[i][j+1]==-1) arr[i][j]++;
					}
					if(i-1>=0 && j-1>=0){
						if(arr[i-1][j-1]==-1) arr[i][j]++;
					}
					if(i-1>=0 && j+1<N){
						if(arr[i-1][j+1]==-1) arr[i][j]++;
					}
					if(i+1<N && j-1>=0){
						if(arr[i+1][j-1]==-1) arr[i][j]++;
					}
					if(i+1<N && j+1<N){
						if(arr[i+1][j+1]==-1) arr[i][j]++;
					}
				}
			}
		}
		
		int answer = 0;
		for(int i=0;i<N;i++){
			for(int j=0;j<N;j++){
				if(arr[i][j]==K) {
					answer++;
				}
			}
		}
		System.out.println(answer);
	}
}

구름톤 챌린지 문자열 나누기

[느낀점]

5일차부터 난이도가 갑자기 좀 올라갔다고 생각했다. 결국 24시간 내에 못풀고 풀이가 공개되고 나서 참고해가며 풀었다...

5일차에 다짐했던 주석달며 깔끔하게 작성하기라는 목표는 지켰다고 생각한다. 결과 코드도 사진이 아니라 코드를 작성하는 것으로 바꿨다. 나는 아직 많이 멀었다. 많이 공부해야겠다.

 

[결과 코드]

import java.io.*;
import java.util.*;
import java.util.stream.*;

class Main {
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());
		String S = br.readLine();
		List<String> list = new ArrayList<>();
		List<String[]> arlist = new ArrayList<>();
		
		// 부분문자열배열 arlist에 등록, 존재할수 있는 모든 부분문자열 list 에 등록
		for(int i=1;i<N;i++){
			for(int j=i+1;j<N;j++){
				String first = S.substring(0,i);
				String second = S.substring(i,j);
				String third = S.substring(j,N);
				arlist.add(new String[]{first,second,third});
				list.add(first);
				list.add(second);
				list.add(third);
			}
		}
		// streamAPI를 이용한 list 중복요소 제거 및 정렬
		list = list.stream().distinct().collect(Collectors.toList());
		Collections.sort(list);
		
		//점수판 생성
		Map<String, Integer> map = new HashMap<>();
		for(int i=0;i<list.size();i++){
			map.put(list.get(i),i+1);
		}
		
		//최고점수 찾기
		int Maxscore = 0;
		for(String[] words : arlist) {
			int tmpscore = 0;
			for(String word : words) {
				tmpscore += map.get(word);
			}
			if(tmpscore>=Maxscore) {
				Maxscore = tmpscore;
			}
		}
		
		System.out.println(Maxscore);
	}
}

 

구름톤 챌린지 이진수 정렬

[느낀점]

 

처음 이 문제를 봤을 땐 꽤 어렵다고 생각했다. 일단 내가 원래 가지고 있던 지식으로는 절대 풀수없다고 판단해 여러가지 검색해가며 풀고있었다.

처음에 풀었을 때의 코드이다. 풀면서도 내가 뭘 하고있는지 점점 수렁으로 빠져들어갔다. 문자열로 입력을 받아서 그걸 다시 정수배열로 변환하고 정렬하고, 오름차순 정렬이기 때문에 for문으로 요소 끝에서부터 불러들여 Integer.toBinaryString 이라는 정수를 2진수 문자열로 변환하는 함수를 써서 문자열배열 a에 담았다. 사실 이렇게 할거면 배열에 담을 필요도 없었다. 아무튼 원래 문자열의 길이에서 그 문자열에 있는 1을 공백으로 치환한 문자열의 길이를 빼서 count 정수 에 담은 후 map 을 이용해 입력한 정수, 1의 갯수를 내림차순으로 정렬한 것이다. 그렇게 한것을 list에 다시 담아서 value를 기준으로 내림차순해 K-1번 요소를 출력한다. 지금보면 도대체 뭘 하고싶은건지 모르겠지만 신기하게도 테스트케이스는 통과가 된다.

하지만 제출을 해보면 거의다 오답이 나온다. 그래서 힘들어서 다음날 풀기로 하고 일단 저장 후 다음날 봤다.

놀랍게도 다음 날 나는 노느라 풀지 않았고 구름톤 챌린지 블록을 받을 수 있는 기준인 48시간이 지나 블록을 못얻었다. 그리고 오늘 일요일이 되어 다시 풀어 보기위해 다른 사람들이 푼 해답, 챗GPT 등 고민해가며 겨우겨우 풀었다. 어떤 멋진분의 블로그를 참고해가며 풀었는데 많은것을 느꼈다.

참고한 블로그를 보며 BufferedWriter 도 써봐야겠다는 것을 느꼇고, bw.flush();bw.close(); br.close(); 등도 써봐야하고, 입력받을 때 StringTokenizer 도 써봐야겠다는 것을 느꼈다. 어려워서 항상 피하고 있었는데 써봐야 는다는것을 알았다. 글 구성도 좀 더 가독성 있게 써야할것같다. 그와중에 Collections 는 내일보면 어떻게 사용해야하는지 까먹을것같다. 좀더 노력해야겠다.

 

그렇게해서 나온 풀이이다.

 

[결과 코드]

구름톤 챌린지 완벽한 햄버거 만들기

[결과 코드]

[느낀점]

bufferedReader 로 문자열 배열을 입력 받은 후 다시 정수 배열로 변환하는 과정을 스트림API를 활용했다. 아직 stream API를 활용하는것이 미숙해 사용방법을 검색하며 풀었다. for 문이 3개나 있어서 가독성이 떨어지는것 같다. for문을 최대한 적게 사용해서 코드를 짰다면 시간도 더 적게걸리고 좋은 결과가 나올것 같다.

첫 번째 for문은 몇 번째 배열이 가장 숫자가 높은지 파악한 후 해당 인덱스를 저장하고 위치도 저장한다.

두 번째 for문은 저장한 인덱스를 기준으로 올라가며 문제 조건에 맞는지 파악한다. 문제 조건에 맞지 않으면 point 를 0으로 만들고 세 번째 for문을 실행하지 않는다.

세 번째 for문은 저장한 인덱스-1 을 기준으로 내려가며 문제 조건에 맞는지 파악한다.

구름톤 챌린지 합 계산기

[결과 코드]

[느낀점]

단순 구현 문제로 if문을 통해서 사칙연산을 해결한다. 사칙연산을 통해 나온 값이 sum에 모두 더한 후 마지막에 sum을 출력한다. 구현은 잘 되었지만 if문 없이 알고리즘을 짜면 더 깔끔해질것같다.

구름톤 챌린지 프로젝트 매니징

[결과 코드]

[느낀점]

오히려 1일 차 문제보다 쉽다고 생각했다. 2일 차 문제의 특징은 60분이 넘어갈 때 1시간이 추가되고 00분이 되는것과 24시간이 넘어갈때 00시가 되는것을 해결할 수 있느냐를 보는것 같았다. 좀 더 간단하게 짜면 라인 수를 줄일 수 있을것 같지만 오히려 가독성이 떨어질것같아 길게 적었다.

구름톤 챌린지 운동 중독 플레이어

[결과 코드]

[느낀점]

알고리즘 공부, 코딩 테스트 연습을 안한지 꽤 오래 되어 문제를 보기 전부터 많이 긴장 했었다. 그리고 당일이 되어 문제가 공개되고 문제를 풀기 시작하는데 코딩 테스트를 안한지도 오래되고 긴장도 해 단순 입출력을 어떻게 받는지 등이 잠깐 생각이 안났지만 문제를 보다보니 기억이 점점 돌아와 가볍게 풀 수 있었다.

문제의 핵심은 소수점 이하 버림을 해결할 수 있느냐의 문제인것 같다.

처음에는 문제를 아무리 봐도 맞게 푼 것 같은데 몇몇 문제에서 오답이 나와 구름 유니버스에서도 계속 도움을 요청하며 돌아다녔다. 아직 문제가 나온지 얼마안된 초반이라 푼 사람도 몇명이 없어서 도움을 못받고 포기하고 저녁을 먹고 다시 돌아와 다시보니 Math.floor 라고 적어야 하는데 Math.round 라고 작성해 소수점 이하 버림이 아닌 소수점 반올림으로 작성했던것이였다. 그래서 다시 Math.floor 라고 수정해 통과할 수 있었다. 코딩 테스트가 오랜만이라 Math 함수 등도 오랜만에 써서 단순 실수 였었다.

+ Recent posts