[백준] 2891번 : 카약과 강풍 - JAVA

SUBNY·2023년 8월 2일
0

백준

목록 보기
10/22
post-thumbnail

(https://www.acmicpc.net/problem/2891)





접근 방법 🧐

  1. 첫 풀이
  • 빌려줄 수 있는 팀의 번호에 -1이나 +1 했는데 손상된 팀이 담겨있는 배열에 있다.
  • 입력받았던 S-1해주고, 빌려준 팀 번호에 visited같이 뭔가 방문처리를 해줘야겠다.
for(int i=0;i<S;i++) {
			dmgKayak[i] = Integer.parseInt(st.nextToken());
		}
		
		int start = 0;
		st = new StringTokenizer(br.readLine());
		for(int i=0;i<R;i++) {
			int moreKayak = Integer.parseInt(st.nextToken());
			for(int j=start;j<S;j++) {
				if(dmgKayak[j] == moreKayak-1 || dmgKayak[j] == moreKayak+1) {
					start++;
					result--;
					break;
				}
			}
		}

틀림



  1. 두번째 풀이
  • 팀에 대한 정보를 담은 배열을 만들어 모두 1개씩 가지고 있다고 여기고 1로 초기화
  • R에 해당되는 애들은 0으로 다시
  • S에 해당되는 애들은 2로
  • 전체 다 돌며 비교해주고, 빌려주면 --, 받으면 ++
  • 나중에 0인 애들 세서 출력해줌
Arrays.fill(team, 1);
		
		st = new StringTokenizer(br.readLine());
		for(int i=0;i<S;i++) {
			int index = Integer.parseInt(st.nextToken())-1;
			team[index] = 0;
		}
		
		st = new StringTokenizer(br.readLine());
		for(int i=0;i<R;i++) {
			int index = Integer.parseInt(st.nextToken())-1;
			team[index] = 2;
		}
		
		for(int i=0;i<N-1;i++) {
			if(team[i] == 0 && team[i+1] == 2) {
				team[i]++;
				team[i+1]--;
			}
			else if(team[i+1] == 0 && team[i] == 2) {
				team[i+1]++;
				team[i]--;
			}
		}

틀림




  1. 최종 풀이
    문제 내용 중에

    카약을 하나 더 가져온 팀의 카약이 손상되었다면, 여분의 카약으로 경기에 출전하게되고, 이 카약은 다른 팀에게 빌려줄 수 없다.
    Of course if some team did bring a reserve and its' kayak was damaged, they will use it themselves and not lend it to anyone.

하나 더 가져온 팀이 부서졌다면, 본인꺼를 쓰지 남에게 빌려주거나 받지 않는다.
즉 R(부서진 팀)에 2번이 있는데 S(가져온 팀)에 2번이 또 있다면 (team2-1)+1 이니까 그대로 1임.

  • 두번째 풀이에서 0이나 2로 값을 변경해주는게 아니라 증감으로 값을 변경해줘야한다.



내가 쓴 코드 ✍️

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

public class Main {

	public static void main(String[] args) throws IOException{
		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 S = Integer.parseInt(st.nextToken()); //손상된 팀의 수
		int R = Integer.parseInt(st.nextToken()); //카약 더있는 팀의 수
		int[] team = new int[N];
		int result = 0;
		
		Arrays.fill(team, 1);
		
		st = new StringTokenizer(br.readLine());
		for(int i=0;i<S;i++) {
			int index = Integer.parseInt(st.nextToken())-1;
			team[index]--;
		}
		
		st = new StringTokenizer(br.readLine());
		for(int i=0;i<R;i++) {
			int index = Integer.parseInt(st.nextToken())-1;
			team[index]++;
		}
		
		for(int i=0;i<N-1;i++) {
			if(team[i] == 0 && team[i+1] == 2) {
				team[i]++;
				team[i+1]--;
			}
			else if(team[i+1] == 0 && team[i] == 2) {
				team[i+1]++;
				team[i]--;
			}
		}
		
		for(int t:team) {
			if(t==0) result++;
		}
		
		bw.write(result+"");
		bw.flush();
		bw.close();
		
	}
}

jjansubin

느낀점 📖

문제 내용이 이해는데 어렵지는 않았지만, "부서진 팀이 여분이 있을때" 를 생각 못해서 실버5임에도 정답률이 28%대인거 아닐까??
처음에 예제값들은 다 통과했는데 틀렸습니다! 나오길래 당황했지만 문제를 차근히 읽어보니 놓친게 있었다. 프로그래머스 문제를 풀다보니 너무 스토리가 많은, 서사?가 많은 문제들의 앞부분을 자꾸 대충 읽게 됐는데 최대한 꼼꼼하게 읽어봐야겠다... 😥

profile
대체할 수 없는 풀스택 개발자가 되고 싶어요

0개의 댓글