구름 LEVEL - 알고리즘 먼데이 챌린지 2주차(JAVA)

JJ Kim·2022년 10월 11일
2

먼데이 챌린지

목록 보기
2/4

2주차 문제 후기

4/4솔, 걸린시간 1시간 내외
졸려서 다음 날 풀어보려했는데 잘못 눌렀더니 시작되버려서 부랴부랴 풀었다.
전 주차보다 어렵다기보다는 귀찮은 문제들이 많았다.
2주차라서 문제에 난이도가 🔥x2 였는데 어렵진 않았고
좌표값 문제인데 좌표값으로 풀려다가 꼼수 부려서 5분만에 끝냈다.
오히려 3번 문제가 헷갈려서 오래걸렸다.

아 그리고 챌린지 해설을 보니 언어가 파이썬이 주된 듯 하다.(C++도 있기는 하지만)
난이도도 파이썬에 맞춰진 느낌 + 자바로 푸는 나로써는 정답 제공이 없어서 아쉬움...
그리고 내가 풀었었던 코드는 못보는 것 같다.



2주차 문제 해설 (자바)

코드를 올리고 싶은데 전에 풀었던 코드를 다시 못보는 것 같아 다시 풀기는 귀찮고...(다시 풀었다 결국)

1번 : 시험 개수만큼 반복문 돌려서 인원, 점수를 입력 받고 평균을 구한 다음 문제에 맞게 출력. 형 변환과 출력만 신경쓰면 되는 쉬운 문제.

2번 : 분리된 집합을 구하는 문제인데.. 앞에 글자랑 뒤에 글자랑 달라질 때 카운트를 1 증가시키면 된다.

3번 : 난이도가 1 치고는 어려운 문제. 2는 됐어야 할 듯
4번보다 어렵고 귀찮다.
다중 조건 정렬이라 자바에서 Compare를 Override 해줘서 비교해줘야 한다. 더 쉬운 방법이 있는지는 모르겠다.
소수점 둘째자리까지 보여야하므로 포매팅도 해줘야한다.

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

class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(bf.readLine());
        int N = Integer.parseInt(st.nextToken());
        int k = Integer.parseInt(st.nextToken());
        List<People> list = new ArrayList<>();

        for(int i=0; i<N; i++){
            st = new StringTokenizer(bf.readLine());
            list.add(new People(st.nextToken(),Double.parseDouble(st.nextToken())));
        }

        Collections.sort(list, (p1, p2) -> {
            if(p1.name.equals(p2.name)) {
                if(p1.height > p2.height){
                    return 1;
                }else{
                    return -1;
                }
            }else {
                return p1.name.compareTo(p2.name);
            }
        });

        System.out.println(list.get(k-1).answer());
    }
}

class People {
    String name;
    double height;

    public People(String name, double height) {
        this.name = name;
        this.height = height;
    }

    public String answer() {
        return name + " " + String.format("%.2f", height);
    }
}

4번 : 2차원 배열을 선언하고 좌표값 자기자신이랑 상하좌우 값을 더해 주는 것 같은데 복잡하게 하기 싫어서 상하좌우 벽만 없으면 각 방향당 1씩 카운트를 더해주면 되니
좌표값이 1이거나 n일 때 조건만 걸고 카운트를 더해주었다.

/* MondayChallenge_week2_Q4 */
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 k = Integer.parseInt(st.nextToken());
		int cnt = 0;
		
        // n이 1이면 한 칸이라 방향이 없으니 폭탄 터지는 수 만큼 반환
		if(n==1) {
			System.out.println(k);
			return;
		}
        
        //n이 1이 아닐 때
		for(int i=0; i<k; i++){
			st = new StringTokenizer(br.readLine());
			int x = Integer.parseInt(st.nextToken());
			int y = Integer.parseInt(st.nextToken());
			
			if(x==1 || x==n) cnt += 2; //좌우 벽이 막혔을 때
			else cnt +=3; //자기 자신과 좌우 카운트 증가
			
			if(y==1 || y==n) cnt += 1; //상하 벽이 막혔을 때
			else cnt +=2; //상하 카운트 증가
		}
		
		System.out.println(cnt);
	}
}
profile
소확행을 찾는 개발자

0개의 댓글